{"version":3,"sources":["webpack:///./app/frontend/src/javascript/app.js","webpack:///./app/frontend/src/javascript/components/loader.tsx","webpack:///./app/frontend/src/javascript/api/api-client.ts","webpack:///./app/frontend/src/javascript/components/fab-button.tsx","webpack:///./app/frontend/src/javascript/components/fab-modal.tsx","webpack:///./app/frontend/src/javascript/api/payment-schedule.ts","webpack:///./app/frontend/src/javascript/api/payment.ts","webpack:///./app/frontend/src/javascript/models/user.ts","webpack:///./app/frontend/images/powered_by_stripe.png","webpack:///./app/frontend/images/mastercard.png","webpack:///./app/frontend/images/visa.png","webpack:///./app/frontend/src/javascript/models/setting.ts","webpack:///./app/frontend/src/javascript/api/setting.ts","webpack:///./app/frontend/src/javascript/components/stripe-elements.tsx","webpack:///./app/frontend/src/javascript/models/payment-schedule.ts","webpack:///./app/frontend/src/javascript/components/payment-schedules-table.tsx","webpack:///./app/frontend/src/javascript/components/labelled-input.tsx","webpack:///./app/frontend/src/javascript/lib/wrap-promise.ts","webpack:///./app/frontend/src/javascript/lib/i18n.ts","webpack:///./app/frontend/images/arrow-left.png","webpack:///./app/frontend/images/no_avatar.png","webpack:///./app/frontend/templates/admin/abuses/index.html","webpack:///./app/frontend/templates/admin/authentications/index.html","webpack:///./app/frontend/templates/admin/events/index.html","webpack:///./app/frontend/templates/admin/groups/index.html","webpack:///./app/frontend/templates/admin/invoices/index.html","webpack:///./app/frontend/templates/admin/members/index.html","webpack:///./app/frontend/templates/admin/pricing/index.html","webpack:///./app/frontend/templates/admin/projects/index.html","webpack:///./app/frontend/templates/admin/settings/index.html","webpack:///./app/frontend/templates/admin/statistics/index.html","webpack:///./app/frontend/templates/admin/tags/index.html","webpack:///./app/frontend/templates/admin/trainings/index.html","webpack:///./app/frontend/templates/events/index.html","webpack:///./app/frontend/templates/machines/index.html","webpack:///./app/frontend/templates/members/index.html","webpack:///./app/frontend/templates/notifications/index.html","webpack:///./app/frontend/templates/plans/index.html","webpack:///./app/frontend/templates/projects/index.html","webpack:///./app/frontend/templates/spaces/index.html","webpack:///./app/frontend/templates/trainings/index.html","webpack:///./app/frontend/src/javascript/components/document-filters.tsx","webpack:///./app/frontend/src/javascript/components/html-translate.tsx","webpack:///./app/frontend/src/javascript/components/stripe-confirm.tsx","webpack:///./app/frontend/src/javascript/components/stripe-card-update.tsx","webpack:///./app/frontend/src/javascript/components/stripe-form.tsx","webpack:///./app/frontend/src/javascript/components/wallet-info.tsx","webpack:///./app/frontend/src/javascript/api/custom-asset.ts","webpack:///./app/frontend/src/javascript/models/custom-asset.ts","webpack:///./app/frontend/src/javascript/lib/wallet.ts","webpack:///./app/frontend/templates/shared/signupModal.html","webpack:///./app/frontend/templates/shared/passwordEditModal.html","webpack:///./app/frontend/templates/admin/versions/upgradeModal.html","webpack:///./app/frontend/templates/shared/deviseModal.html","webpack:///./app/frontend/templates/shared/passwordNewModal.html","webpack:///./app/frontend/templates/shared/ConfirmationNewModal.html","webpack:///./app/frontend/templates/events/deleteRecurrent.html","webpack:///./app/frontend/templates/events/modify_event_reservation_modal.html","webpack:///./app/frontend/templates/stripe/payment_modal.html","webpack:///./app/frontend/templates/shared/valid_reservation_modal.html","webpack:///./app/frontend/templates/shared/_reserve_slot_same_time.html","webpack:///./app/frontend/templates/machines/training_reservation_modal.html","webpack:///./app/frontend/templates/machines/request_training_modal.html","webpack:///./app/frontend/images/social/dailymotion.png","webpack:///./app/frontend/images/social/echosciences.png","webpack:///./app/frontend/src/javascript/lib/humanize.js","webpack:///./app/frontend/src/javascript/components/angular/switch.ts","webpack:///./app/frontend/src/javascript/components/payment-schedule-summary.tsx","webpack:///./app/frontend/src/javascript/components/payment-schedules-dashboard.tsx","webpack:///./app/frontend/src/javascript/components/payment-schedules-list.tsx","webpack:///./app/frontend/src/javascript/components/plan-card.tsx","webpack:///./app/frontend/src/javascript/components/select-schedule.tsx","webpack:///./app/frontend/src/javascript/components/stripe-modal.tsx","webpack:///./app/frontend/src/javascript/controllers/about.js","webpack:///./app/frontend/src/javascript/controllers/admin/abuses.js","webpack:///./app/frontend/src/javascript/controllers/admin/authentications.js","webpack:///./app/frontend/src/javascript/controllers/admin/calendar.js","webpack:///./app/frontend/src/javascript/controllers/admin/coupons.js","webpack:///./app/frontend/src/javascript/controllers/admin/events.js","webpack:///./app/frontend/src/javascript/controllers/admin/graphs.js","webpack:///./app/frontend/src/javascript/controllers/admin/groups.js","webpack:///./app/frontend/src/javascript/controllers/admin/invoices.js","webpack:///./app/frontend/src/javascript/controllers/admin/members.js","webpack:///./app/frontend/src/javascript/controllers/admin/open_api_clients.js","webpack:///./app/frontend/src/javascript/controllers/admin/plans.js","webpack:///./app/frontend/src/javascript/controllers/admin/price_category.js","webpack:///./app/frontend/src/javascript/controllers/admin/pricing.js","webpack:///./app/frontend/src/javascript/controllers/admin/projects.js","webpack:///./app/frontend/src/javascript/controllers/admin/settings.js","webpack:///./app/frontend/src/javascript/controllers/admin/statistics.js","webpack:///./app/frontend/src/javascript/controllers/admin/tags.js","webpack:///./app/frontend/src/javascript/controllers/admin/trainings.js","webpack:///./app/frontend/src/javascript/controllers/application.js.erb","webpack:///./app/frontend/src/javascript/controllers/calendar.js","webpack:///./app/frontend/src/javascript/controllers/cookies.js","webpack:///./app/frontend/src/javascript/controllers/dashboard.js","webpack:///./app/frontend/src/javascript/controllers/events.js.erb","webpack:///./app/frontend/src/javascript/controllers/home.js","webpack:///./app/frontend/src/javascript/controllers/machines.js.erb","webpack:///./app/frontend/src/javascript/controllers/main_nav.js","webpack:///./app/frontend/src/javascript/controllers/members.js","webpack:///./app/frontend/src/javascript/controllers/notifications.js","webpack:///./app/frontend/src/javascript/controllers/plans.js","webpack:///./app/frontend/src/javascript/controllers/privacy.js","webpack:///./app/frontend/src/javascript/controllers/profile.js","webpack:///./app/frontend/src/javascript/controllers/projects.js","webpack:///./app/frontend/src/javascript/controllers/spaces.js.erb","webpack:///./app/frontend/src/javascript/controllers/trainings.js.erb","webpack:///./app/frontend/src/javascript/controllers/wallet.js","webpack:///./app/frontend/src/javascript/services/_t.js","webpack:///./app/frontend/src/javascript/services/abuse.js","webpack:///./app/frontend/src/javascript/services/accounting_period.js","webpack:///./app/frontend/src/javascript/services/admin.js","webpack:///./app/frontend/src/javascript/services/age_range.js","webpack:///./app/frontend/src/javascript/services/auth.js","webpack:///./app/frontend/src/javascript/services/authProvider.js","webpack:///./app/frontend/src/javascript/services/availability.js","webpack:///./app/frontend/src/javascript/services/calendar.js","webpack:///./app/frontend/src/javascript/services/category.js","webpack:///./app/frontend/src/javascript/services/component.js","webpack:///./app/frontend/src/javascript/services/coupon.js","webpack:///./app/frontend/src/javascript/services/credit.js","webpack:///./app/frontend/src/javascript/services/csrf.js","webpack:///./app/frontend/src/javascript/services/customAsset.js","webpack:///./app/frontend/src/javascript/services/diacritics.js","webpack:///./app/frontend/src/javascript/services/dialogs.js","webpack:///./app/frontend/src/javascript/services/elastic.js","webpack:///./app/frontend/src/javascript/services/event.js","webpack:///./app/frontend/src/javascript/services/event_theme.js","webpack:///./app/frontend/src/javascript/services/export.js","webpack:///./app/frontend/src/javascript/services/fab_analytics.js","webpack:///./app/frontend/src/javascript/services/group.js","webpack:///./app/frontend/src/javascript/services/help.js","webpack:///./app/frontend/src/javascript/services/helpers.js","webpack:///./app/frontend/src/javascript/services/ical.js","webpack:///./app/frontend/src/javascript/services/icalendar.js","webpack:///./app/frontend/src/javascript/services/import.js","webpack:///./app/frontend/src/javascript/services/invoice.js","webpack:///./app/frontend/src/javascript/services/licence.js","webpack:///./app/frontend/src/javascript/services/machine.js","webpack:///./app/frontend/src/javascript/services/member.js","webpack:///./app/frontend/src/javascript/services/notification.js","webpack:///./app/frontend/src/javascript/services/open_api_client.js","webpack:///./app/frontend/src/javascript/services/openlab_project.js","webpack:///./app/frontend/src/javascript/services/pagination_service.js","webpack:///./app/frontend/src/javascript/services/payment.js","webpack:///./app/frontend/src/javascript/services/plan.js","webpack:///./app/frontend/src/javascript/services/price.js","webpack:///./app/frontend/src/javascript/services/price_category.js","webpack:///./app/frontend/src/javascript/services/pricing.js","webpack:///./app/frontend/src/javascript/services/project.js","webpack:///./app/frontend/src/javascript/services/reservation.js","webpack:///./app/frontend/src/javascript/services/session.js","webpack:///./app/frontend/src/javascript/services/setting.js","webpack:///./app/frontend/src/javascript/services/slot.js","webpack:///./app/frontend/src/javascript/services/socialNetworks.js","webpack:///./app/frontend/src/javascript/services/space.js","webpack:///./app/frontend/src/javascript/services/statistics.js","webpack:///./app/frontend/src/javascript/services/subscription.js","webpack:///./app/frontend/src/javascript/services/tag.js","webpack:///./app/frontend/src/javascript/services/theme.js","webpack:///./app/frontend/src/javascript/services/training.js","webpack:///./app/frontend/src/javascript/services/trainings_pricing.js","webpack:///./app/frontend/src/javascript/services/translations.js","webpack:///./app/frontend/src/javascript/services/user.js","webpack:///./app/frontend/src/javascript/services/version.js","webpack:///./app/frontend/src/javascript/services/wallet.js","webpack:///./app/frontend/src/javascript/directives/bs-jasny-fileinput.js","webpack:///./app/frontend/src/javascript/directives/cart.js","webpack:///./app/frontend/src/javascript/directives/compile.js","webpack:///./app/frontend/src/javascript/directives/confirmation_needed.js","webpack:///./app/frontend/src/javascript/directives/coupon.js","webpack:///./app/frontend/src/javascript/directives/directives.js","webpack:///./app/frontend/src/javascript/directives/fab_user_avatar.js","webpack:///./app/frontend/src/javascript/directives/home/events.js","webpack:///./app/frontend/src/javascript/directives/home/news.js","webpack:///./app/frontend/src/javascript/directives/home/projects.js","webpack:///./app/frontend/src/javascript/directives/home/twitter.js","webpack:///./app/frontend/src/javascript/directives/members.js","webpack:///./app/frontend/src/javascript/directives/post_render.js","webpack:///./app/frontend/src/javascript/directives/selectMember.js","webpack:///./app/frontend/src/javascript/directives/settings/boolean-setting.js","webpack:///./app/frontend/src/javascript/directives/settings/number-setting.js","webpack:///./app/frontend/src/javascript/directives/settings/select-multiple-setting.js","webpack:///./app/frontend/src/javascript/directives/settings/select-setting.js","webpack:///./app/frontend/src/javascript/directives/settings/text-setting.js","webpack:///./app/frontend/src/javascript/directives/socialLink.js","webpack:///./app/frontend/src/javascript/directives/stripe-form.js","webpack:///./app/frontend/src/javascript/directives/validators.js","webpack:///./app/frontend/src/javascript/filters/filters.js","webpack:///./app/frontend/images/fabmanager-logo.png","webpack:///./app/frontend/templates/admin/admins/new.html","webpack:///./app/frontend/templates/admin/authentications/_data_mapping.html","webpack:///./app/frontend/templates/admin/authentications/_form.html","webpack:///./app/frontend/templates/admin/authentications/_oauth2.html","webpack:///./app/frontend/templates/admin/authentications/_oauth2_mapping.html","webpack:///./app/frontend/templates/admin/authentications/edit.html","webpack:///./app/frontend/templates/admin/authentications/new.html","webpack:///./app/frontend/templates/admin/calendar/calendar.html","webpack:///./app/frontend/templates/admin/calendar/deleteRecurrent.html","webpack:///./app/frontend/templates/admin/calendar/eventModal.html","webpack:///./app/frontend/templates/admin/calendar/icalendar.html","webpack:///./app/frontend/templates/admin/coupons/_form.html","webpack:///./app/frontend/templates/admin/coupons/edit.html","webpack:///./app/frontend/templates/admin/coupons/new.html","webpack:///./app/frontend/templates/admin/events/filters.html","webpack:///./app/frontend/templates/admin/events/monitoring.html","webpack:///./app/frontend/templates/admin/events/price_form.html","webpack:///./app/frontend/templates/admin/events/prices.html","webpack:///./app/frontend/templates/admin/events/reservations.html","webpack:///./app/frontend/templates/admin/invoices/_period.html","webpack:///./app/frontend/templates/admin/invoices/accountingExportModal.html","webpack:///./app/frontend/templates/admin/invoices/avoirModal.html","webpack:///./app/frontend/templates/admin/invoices/closePeriodModal.html","webpack:///./app/frontend/templates/admin/invoices/codes.html","webpack:///./app/frontend/templates/admin/invoices/list.html","webpack:///./app/frontend/templates/admin/invoices/payment.html","webpack:///./app/frontend/templates/admin/invoices/settings.html","webpack:///./app/frontend/templates/admin/invoices/settings/editCode.html","webpack:///./app/frontend/templates/admin/invoices/settings/editNumber.html","webpack:///./app/frontend/templates/admin/invoices/settings/editPrefix.html","webpack:///./app/frontend/templates/admin/invoices/settings/editReference.html","webpack:///./app/frontend/templates/admin/invoices/settings/editVAT.html","webpack:///./app/frontend/templates/admin/invoices/settings/stripeKeys.html","webpack:///./app/frontend/templates/admin/managers/new.html","webpack:///./app/frontend/templates/admin/members/_form.html","webpack:///./app/frontend/templates/admin/members/administrators.html","webpack:///./app/frontend/templates/admin/members/change_role_modal.html","webpack:///./app/frontend/templates/admin/members/edit.html","webpack:///./app/frontend/templates/admin/members/import.html","webpack:///./app/frontend/templates/admin/members/import_result.html","webpack:///./app/frontend/templates/admin/members/managers.html","webpack:///./app/frontend/templates/admin/members/members.html","webpack:///./app/frontend/templates/admin/members/new.html","webpack:///./app/frontend/templates/admin/members/partners.html","webpack:///./app/frontend/templates/admin/members/users.html","webpack:///./app/frontend/templates/admin/open_api_clients/index.html.erb","webpack:///./app/frontend/templates/admin/plans/_form.html","webpack:///./app/frontend/templates/admin/plans/edit.html","webpack:///./app/frontend/templates/admin/plans/new.html","webpack:///./app/frontend/templates/admin/pricing/coupons.html","webpack:///./app/frontend/templates/admin/pricing/credits.html","webpack:///./app/frontend/templates/admin/pricing/machine_hours.html","webpack:///./app/frontend/templates/admin/pricing/sendCoupon.html","webpack:///./app/frontend/templates/admin/pricing/spaces.html","webpack:///./app/frontend/templates/admin/pricing/subscriptions.html","webpack:///./app/frontend/templates/admin/pricing/trainings.html","webpack:///./app/frontend/templates/admin/projects/licences.html","webpack:///./app/frontend/templates/admin/projects/materials.html","webpack:///./app/frontend/templates/admin/projects/settings.html","webpack:///./app/frontend/templates/admin/projects/themes.html","webpack:///./app/frontend/templates/admin/settings/about.html","webpack:///./app/frontend/templates/admin/settings/analyticsModal.html","webpack:///./app/frontend/templates/admin/settings/boolean.html","webpack:///./app/frontend/templates/admin/settings/general.html","webpack:///./app/frontend/templates/admin/settings/home_page.html","webpack:///./app/frontend/templates/admin/settings/newSelectOption.html","webpack:///./app/frontend/templates/admin/settings/number.html","webpack:///./app/frontend/templates/admin/settings/privacy.html","webpack:///./app/frontend/templates/admin/settings/reservations.html","webpack:///./app/frontend/templates/admin/settings/save_policy.html","webpack:///./app/frontend/templates/admin/settings/select.html","webpack:///./app/frontend/templates/admin/settings/select-multiple.html","webpack:///./app/frontend/templates/admin/settings/text.html","webpack:///./app/frontend/templates/admin/statistics/export.html","webpack:///./app/frontend/templates/admin/statistics/graphs.html","webpack:///./app/frontend/templates/admin/subscriptions/create_modal.html","webpack:///./app/frontend/templates/admin/subscriptions/expired_at_modal.html","webpack:///./app/frontend/templates/admin/trainings/_form.html","webpack:///./app/frontend/templates/admin/trainings/edit.html","webpack:///./app/frontend/templates/admin/trainings/modal_edit.html","webpack:///./app/frontend/templates/admin/trainings/new.html","webpack:///./app/frontend/templates/admin/trainings/validTrainingModal.html","webpack:///./app/frontend/templates/calendar/calendar.html","webpack:///./app/frontend/templates/calendar/filter.html","webpack:///./app/frontend/templates/calendar/filterAside.html","webpack:///./app/frontend/templates/dashboard/events.html","webpack:///./app/frontend/templates/dashboard/invoices.html","webpack:///./app/frontend/templates/dashboard/nav.html","webpack:///./app/frontend/templates/dashboard/payment_schedules.html","webpack:///./app/frontend/templates/dashboard/profile.html","webpack:///./app/frontend/templates/dashboard/projects.html","webpack:///./app/frontend/templates/dashboard/settings.html","webpack:///./app/frontend/templates/dashboard/trainings.html","webpack:///./app/frontend/templates/dashboard/wallet.html","webpack:///./app/frontend/templates/events/_form.html","webpack:///./app/frontend/templates/events/edit.html","webpack:///./app/frontend/templates/events/editRecurrent.html","webpack:///./app/frontend/templates/events/new.html","webpack:///./app/frontend/templates/events/show.html","webpack:///./app/frontend/templates/home.html","webpack:///./app/frontend/templates/home/events.html","webpack:///./app/frontend/templates/home/members.html","webpack:///./app/frontend/templates/home/news.html","webpack:///./app/frontend/templates/home/projects.html","webpack:///./app/frontend/templates/home/twitter.html","webpack:///./app/frontend/templates/machines/_form.html","webpack:///./app/frontend/templates/machines/edit.html","webpack:///./app/frontend/templates/machines/new.html","webpack:///./app/frontend/templates/machines/reserve.html","webpack:///./app/frontend/templates/machines/show.html","webpack:///./app/frontend/templates/members/show.html","webpack:///./app/frontend/templates/plans/_plan.html","webpack:///./app/frontend/templates/profile/_token.html","webpack:///./app/frontend/templates/profile/complete.html","webpack:///./app/frontend/templates/profile/resend_code_modal.html","webpack:///./app/frontend/templates/projects/_form.html","webpack:///./app/frontend/templates/projects/edit.html","webpack:///./app/frontend/templates/projects/new.html","webpack:///./app/frontend/templates/projects/show.html","webpack:///./app/frontend/templates/shared/_admin_form.html","webpack:///./app/frontend/templates/shared/_cart.html","webpack:///./app/frontend/templates/shared/_coupon.html","webpack:///./app/frontend/templates/shared/_manager_form.html","webpack:///./app/frontend/templates/shared/_member_form.html","webpack:///./app/frontend/templates/shared/_member_select.html","webpack:///./app/frontend/templates/shared/_partner_new_modal.html","webpack:///./app/frontend/templates/shared/_reserve_slot_tags_mismatch.html","webpack:///./app/frontend/templates/shared/_reserve_slot_without_plan.html","webpack:///./app/frontend/templates/shared/_social_link.html","webpack:///./app/frontend/templates/shared/_user_avatar.html","webpack:///./app/frontend/templates/shared/about.html","webpack:///./app/frontend/templates/shared/confirm_modal.html","webpack:///./app/frontend/templates/shared/confirm_modify_slot_modal.html","webpack:///./app/frontend/templates/shared/cookies.html","webpack:///./app/frontend/templates/shared/header.html.erb","webpack:///./app/frontend/templates/shared/help_modal.html","webpack:///./app/frontend/templates/shared/leftnav.html","webpack:///./app/frontend/templates/shared/privacy.html","webpack:///./app/frontend/templates/shared/publicProfile.html.erb","webpack:///./app/frontend/templates/shared/signalAbuseModal.html","webpack:///./app/frontend/templates/shared/tour-step-template.html","webpack:///./app/frontend/templates/spaces/_form.html","webpack:///./app/frontend/templates/spaces/edit.html","webpack:///./app/frontend/templates/spaces/new.html","webpack:///./app/frontend/templates/spaces/reserve.html","webpack:///./app/frontend/templates/spaces/show.html","webpack:///./app/frontend/templates/trainings/reserve.html","webpack:///./app/frontend/templates/trainings/show.html","webpack:///./app/frontend/templates/wallet/credit_modal.html","webpack:///./app/frontend/templates/wallet/show.html","webpack:///./app/frontend/templates/wallet/transactions.html","webpack:///./app/frontend/src/javascript/api/wallet.ts","webpack:///./app/frontend/src/javascript/api/price.ts","webpack:///./app/frontend/packs/application.js.erb","webpack:///./app/frontend/src/javascript/lib/polyfill.js","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./node_modules/moment-timezone/node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./app/frontend/src/javascript/lib/devise-modal.js","webpack:///./app/frontend/src/javascript/lib/dirDisqus.js","webpack:///./app/frontend/src/javascript/lib/summernote-ext-nugget.js","webpack:///./app/frontend/src/javascript/router.js","webpack:///./app/frontend/src/javascript/components sync .*","webpack:///./app/frontend/src/javascript/controllers sync .*","webpack:///./app/frontend/src/javascript/services sync .*","webpack:///./app/frontend/src/javascript/directives sync .*","webpack:///./app/frontend/src/javascript/filters sync .*","webpack:///./app/frontend/src/javascript/typings sync .*","webpack:///./app/frontend/images sync ^\\.\\/.*$","webpack:///./app/frontend/templates sync ^\\.\\/.*$"],"names":["Application","Components","angular","module","Services","Controllers","Filters","Directives","config","$httpProvider","AuthProvider","growlProvider","unsavedWarningsConfigProvider","AnalyticsProvider","uibDatepickerPopupConfig","$provide","$translateProvider","TourConfigProvider","document","cookie","replace","setAccount","Fablab","trackingId","trackPages","setDomainName","baseHostUrl","useAnalytics","setPageEvent","closeText","translations","app","shared","buttons","close","clearText","clear","currentText","today","navigateMessage","messages","you_will_lose_any_unsaved_modification_if_you_quit_this_page","reloadMessage","you_will_lose_any_unsaved_modification_if_you_reload_this_page","globalTimeToLive","useLoader","urlTemplate","useLoaderCache","useSanitizeValueStrategy","useMessageFormatInterpolation","preferredLanguage","locale","enableNavigationInterceptors","run","$rootScope","$log","Auth","amMoment","$state","editableOptions","Analytics","changeLocale","moment_locale","theme","$on","event","toState","toParams","fromState","fromParams","prevState","prevParams","backPrevLocation","preventDefault","stopPropagation","name","go","summernoteOpts","lang","summernote_locale","height","toolbar","styleTags","maximumImageFileSize","currentUser","then","need_completion","pageView","intArray","start","end","arr","i","push","constant","timezone","require","isUndefinedOrNull","val","isUndefined","exports","Loader","children","loading","className","fallback","token","querySelector","client","axios","create","headers","common","content","interceptors","response","use","error","message","data","Promise","reject","match","htmlDoc","DOMParser","parseFromString","querySelectorAll","length","textContent","Object","hasOwnProperty","key","prototype","call","Array","join","JSON","stringify","extractHumanReadableMessage","FabButton","onClick","icon","disabled","type","form","e","defaultProps","ModalSize","Modal","setAppElement","blackLogoFile","CustomAssetAPI","get","CustomAssetName","LogoBlackFile","FabModal","title","isOpen","toggleModal","confirmButton","width","closeButton","customFooter","onConfirm","preventConfirm","t","useTranslation","blackLogo","read","overlayClassName","onRequestClose","src","custom_asset_file_attributes","attachment_url","alt","attachment","undefined","PaymentScheduleAPI","query","a","apiClient","post","res","page","size","paymentScheduleItemId","paymentScheduleId","put","PaymentAPI","stp_payment_method_id","cart_items","payment_method_id","user_id","setup_intent_id","UserRole","SettingName","SettingAPI","setting","names","api","wrapPromise","stripePublicKey","StripePublicKey","StripeElements","memo","useState","stripe","setStripe","useEffect","promise","loadStripe","value","PaymentScheduleItemState","PaymentMethod","PaymentSchedulesTableComponent","TargetType","paymentSchedules","showCustomer","refreshList","operator","Map","showExpanded","setShowExpanded","showConfirmCashing","setShowConfirmCashing","showResolveAction","setShowResolveAction","isConfirmActionDisabled","setConfirmActionDisabled","showUpdateCard","setShowUpdateCard","tempDeadline","setTempDeadline","tempSchedule","setTempSchedule","canSubmitUpdateCard","setCanSubmitUpdateCard","errors","setErrors","showCancelSubscription","setShowCancelSubscription","isExpanded","formatDate","date","Intl","DateTimeFormat","format","moment","toDate","formatPrice","price","NumberFormat","intl_locale","style","currency","intl_currency","statusDisplay","downloadButton","target","id","link","href","isPrivileged","role","Admin","Manager","handleConfirmCheckPayment","item","toggleConfirmCashingModal","refreshSchedulesTable","toggleResolveActionModal","handleSolveAction","toggleConfirmActionButton","handleUpdateCard","paymentSchedule","toggleUpdateCardModal","handleCardUpdateError","handleCancelSubscription","schedule","toggleCancelSubscriptionModal","map","p","colSpan","prev","set","expandCollapseIcon","reference","created_at","total","user","PaymentSchedule","display","_","orderBy","items","due_date","amount","state","Paid","payment_method","formatState","Invoice","invoice_id","Pending","RequireAction","RequirePaymentMethod","Error","itemButtons","cashCheck","AMOUNT","DATE","cancel","refreshItem","clientSecret","client_secret","onResponse","stripeLogo","mastercardLogo","visaLogo","onSubmit","onSuccess","payItem","err","onError","customerId","PaymentSchedulesTable","LabelledInput","label","onChange","htmlFor","status","suspender","i18n","ICU","HttpApi","initReactI18next","init","lng","fallbackLng","ns","defaultNS","backend","loadPath","interpolation","escapeValue","path","c","DocumentFilters","onFilterChange","referenceFilter","setReferenceFilter","customerFilter","setCustomerFilter","dateFilter","setDateFilter","customer","HtmlTranslate","trKey","options","split","dangerouslySetInnerHTML","__html","StripeConfirm","useStripe","setMessage","setType","confirmCardPayment","result","StripeCardUpdate","elements","useElements","handleSubmit","cardElement","getElement","CardElement","createPaymentMethod","card","paymentMethod","setupIntent","confirmCardSetup","mandate_data","customer_acceptance","online","ip_address","user_agent","navigator","userAgent","updateCard","base","fontSize","color","invalid","iconColor","hidePostalCode","StripeForm","cartItems","confirm","handleServerConfirmation","confirmPaymentSchedule","statusText","requires_action","handleCardAction","payment_intent_client_secret","paymentIntent","confirmation","WalletInfo","wallet","remainingPrice","setRemainingPrice","wLib","WalletLib","computeRemainingPrice","isOperatorAndClient","buyingItem","reservation","subscription","hasRemainingPrice","getPriceItem","payment_schedule","ITEM","plan_id","component","react2angular","custom_asset","this","___HTML_LOADER_GET_SOURCE_FROM_IMPORT___","___HTML_LOADER_IMPORT_0___","___HTML_LOADER_IMPORT_1___","___HTML_LOADER_IMPORT_2___","_module_exports","Humanize","isArray","isFinite","isNaN","objectRef","timeFormats","toString","window","global","parseFloat","intword","number","charWidth","decimals","compactInteger","input","bigNumPrefixes","decimalIndex","decimalPart","decimalPartArray","numberLength","numberLengths","signString","unsignedNumber","unsignedNumberCharacterArray","unsignedNumberString","wholePart","wholePartArray","_i","_len","_length","Math","max","parseInt","abs","toExponential","slice","indexOf","toFixed","intcomma","intComma","formatNumber","filesize","fileSize","pluralize","precision","thousand","decimal","commas","firstComma","mod","usePrecision","position","substr","normalizePrecision","power","pow","round","ordinal","specialCase","times","overrides","smallTimes","_ref","singular","plural","truncate","str","ending","substring","truncatewords","truncateWords","string","array","truncatenumber","boundedNumber","num","bound","oxford","limit","limitStr","extra","limitIndex","numItems","dictionary","object","joiner","separator","defs","frequency","list","verb","len","pace","intervalMs","unit","f","prefix","rate","relativePace","roundedPace","timeUnit","nl2br","replacement","br2nl","capitalize","downCaseTail","charAt","toUpperCase","toLowerCase","capitalizeAll","titlecase","titleCase","doTitleCase","internalCaps","smallWords","splitOnHyphensRegex","splitOnWhiteSpaceRegex","_string","hyphenated","firstOrLast","index","stringArray","titleCasedArray","word","test","Switch","PaymentScheduleSummary","modal","setModal","hasEqualDeadlines","prices","every","toggleFullScheduleModal","NUMBER","String","PaymentSchedulesDashboard","setPaymentSchedules","pageNumber","setPageNumber","handleRefreshList","hasSchedules","max_length","concat","PaymentSchedulesList","PlanCard","monthly","plan","userId","subscribedPlanId","onSelectPlan","isSelected","duration","interval_count","interval","humanize","hasSubscribedToThisPlan","canBeScheduled","monthly_payment","handleSelectPlan","base_name","asMonths","description","plan_file_url","Member","isNil","SelectSchedule","show","selected","checked","cgvFile","CgvFile","StripeModal","afterSuccess","setWallet","setPrice","ready","setReady","submitState","setSubmitState","tos","setTos","cgv","WalletAPI","getByUser","PriceAPI","compute","terms","hasCgv","isPaymentSchedule","handleFormSuccess","medium","DEADLINES","required","controller","$scope","Setting","CustomAsset","aboutTitle","aboutBody","aboutContacts","privacyPolicy","cgu","Abuse","abusesPromise","dialogs","growl","_t","abuses","confirmProcess","abuseId","resolve","msg","remove","success","filter","signaled_type","METHODS","check_oauth2_id_is_mapped","mappings","from","mapping","local_model","local_field","_destroy","AuthenticationController","$uibModal","mappingFieldsPromise","authMethods","mappingFields","methodName","method","defineDataMapping","open","templateUrl","field","datatype","$uibModalInstance","transformation","rules","formats","addIntegerMapping","to","ok","dismiss","transfo_rules","authProvidersPromise","providers","getType","text","getState","destroyProvider","provider","TYPE","providable_type","NAME","splice","elem","mode","providable_attributes","updateProvidable","o_auth2_mappings_attributes","registerProvider","save","auth_provider","base_url","$stateParams","providerPromise","updateProvider","update","AuthService","Availability","Slot","Export","bookingWindowStart","bookingWindowEnd","machinesPromise","plansPromise","groupsPromise","settingsPromise","uiCalendarConfig","CalendarConfig","uiTourService","SLOT_MULTIPLE","slot_duration","machines","availability","availabilityDom","eventsInCalendar","events_in_calendar","eventSources","url","textColor","calendarConfig","slotDuration","snapDuration","selectable","selectHelper","minTime","maxTime","select","jsEvent","view","calendarSelectCb","eventClick","calendarEventClickCb","eventRender","element","eventRenderCb","viewRender","viewRenderCb","isLoading","loadingCb","cancelBooking","slot","GENDER","getGender","USER","start_at","TIME","RESERVATION","reservable","slot_id","reservations","resa","canceled_at","removeMachine","machine","machine_ids","MACHINE","m_id","machines_attributes","calendars","calendar","fullCalendar","removePlan","PLAN","drop","plan_ids","plans_attributes","plans","availabilityPlans","alertExport","category","exists","toggleLockReservations","locked","lock","prevent","forEach","r","console","removeSlot","animation","availabilityPromise","$promise","availabilities","setupCalendarTour","uitour","getTourByName","createStep","selector","stepId","order","placement","orphan","popupClass","isAuthorized","on","getStatus","Status","ON","profile","tours","completeTour","tour","feature_tour_display","statistic_profile","gender","plansClassifiedByGroup","_plans","includes","group","groupObj","group_id","tz","toISOString","subtract","startOf","Date","trunc","valueOf","warning","slots","Number","isInteger","upper","ceil","add","backdrop","keyboard","Machine","trainingsPromise","Training","spacesPromise","Space","tagsPromise","Tag","Plan","Group","slotDurationPromise","end_at","backgroundColor","borderColor","tag_ids","tags","classList","closest","$","hasClass","available_type","find","prepend","html","tag","append","$sce","m","trainings","spaces","s","isOnlySubscriptions","selectedPlans","selectedPlansBinding","selectedMachines","selectedMachinesBinding","selectedTraining","selectedSpace","step","endDateReadOnly","timepickers","hstep","mstep","is_recurrent","period","nb_periods","end_date","occurrences","reservableName","tagsName","plansName","slots_nb","toggleSelection","toggleAll","count","toggleSelectPlan","toggleAllPlans","training_ids","space_ids","next","validateType","validateSelection","validateTimes","validateRecurrence","previous","setNbTotalPlaces","nb_total_places","default_places","isTypeDivided","isSameOrBefore","computeOccurrences","computeNames","diff","endOf","isBefore","occur_end","localizedList","trustAsHtml","$watch","g","newValue","oldValue","scope","startSlot","slotsCurrentRange","upperSlots","endSlot","isAfter","initialize","isRecurrent","deleteMode","deleted","START","COUNT","END","details","d","TOTAL","iCalendars","ICalendar","newCalendar","text_color","text_hidden","i_calendar","calendarStyle","idx","info","sync","VALIDITIES","Coupon","coupon","active","validities","datePicker","uibDateFormat","opened","minDate","startingDay","weekStartingDay","validityName","validity","toggleDatePicker","$event","saveCoupon","couponPromise","updateCoupon","valid_until","EventsController","startOpened","endOpened","recurrenceEndOpened","submited","onSubmited","fileinputClass","v","addFile","event_files_attributes","deleteFile","file","toggleStartDatePicker","toggleEndDatePicker","toggleRecurrenceEnd","addPrice","removePrice","Event","Category","EventTheme","AgeRange","PriceCategory","eventsPromise","categoriesPromise","themesPromise","ageRangesPromise","priceCategoriesPromise","paginateActive","events","inserted","age_range","categories","themes","ageRanges","priceCategories","eventsScope","tabs","loadMoreEvents","paginationCheck","saveElement","model","getModel","resp","removeElement","related_to","ELEMENT","addElement","cancelElement","rowform","$cancel","newPriceCategory","p_cat","cat","editPriceCategory","price_category","removePriceCategory","changeScope","setupEventsTour","nextStep","lastEvents","nb_total_events","eventPromise","reservationsPromise","isCancelled","CSRF","setMetaTags","actionUrl","start_date","start_time","end_time","all_day","recurrence","category_id","recurrenceTypes","alerts","k","initialDates","editMode","isShowEditModeModal","recurrence_events","editRecurrent","currentEvent","click","updated","hasDateChanged","isSame","es","Statistics","X_AXIS_LABEL","Y_AXIS_LABEL","CHART_COLORS","preventRefresh","statistics","selectedIndex","selectedTab","ranking","sortCriterion","groupCriterion","datePickerStart","maxDate","utc","datePickerEnd","setActiveTab","tab","ca","types","refreshChart","hiddenTab","graph","es_type_key","modules","validateDateChange","aggregations","chart_type","formatAggregations","datum","updateChart","formatRankingAggregations","xAxisTickFormatFunction","x","y","d3","time","d3DateFormat","aggs","type_key","subgroups","buckets","subgroup","cur_type","it_st","subtypes","cur_subtype","dataSource","values","area","intervals","typeKey","it","bucket","getRankingLabel","stableSort","subtype","additional_fields","data_type","callback","stat_types","type_it","results","recursiveCb","queryElasticStats","prevResults","prevError","queryElasticRanking","esType","statType","search","buildElasticAggregationsQuery","groupKey","sortKey","buildElasticAggregationsRankingQuery","intervalBegin","intervalEnd","q","date_histogram","offset","utcOffset","bool","must","term","sum","selectAll","nv","addGraph","chart","models","stackedAreaChart","useInteractiveGuideline","lineChart","setTimeScale","xAxis","xScale","day","week","month","tickFormat","yAxis","axisLabel","discreteBarChart","tooltip","enabled","showValues","prepareDataForBarChart","margin","left","right","noData","transition","utils","windowResize","nvd3Axis","nvd3Scale","argsArray","scale","oldTicks","axis","ticks","apply","newData","getValue","keys_order","sort","b","val_a","val_b","stats","keys","groups","groupFiltering","filterDisabled","cancelGroup","addGroup","saveGroup","removeGroup","toggleDisableGroup","users","USERS","STATUS","AccountingPeriod","invoices","closedPeriods","$filter","settings","stripeSecretKey","Payment","onlinePaymentStatus","STRIPE_SK_HIDDEN","invoicing_module","searchInvoice","noMoreResults","orderInvoice","invoice_prefix","nextId","invoice","logo","help","code","VAT","legals","journalCode","accounting_journal_code","cardClientCode","accounting_card_client_code","cardClientLabel","accounting_card_client_label","walletClientCode","accounting_wallet_client_code","walletClientLabel","accounting_wallet_client_label","otherClientCode","accounting_other_client_code","otherClientLabel","accounting_other_client_label","walletCode","accounting_wallet_code","walletLabel","accounting_wallet_label","vatCode","accounting_VAT_code","vatLabel","accounting_VAT_label","subscriptionCode","accounting_subscription_code","subscriptionLabel","accounting_subscription_label","machineCode","accounting_Machine_code","machineLabel","accounting_Machine_label","trainingCode","accounting_Training_code","trainingLabel","accounting_Training_label","eventCode","accounting_Event_code","eventLabel","accounting_Event_label","spaceCode","accounting_Space_code","spaceLabel","accounting_Space_label","allSettings","isPresent","inOneWeek","inOneWeekAndOneHour","setOrderInvoice","resetSearchInvoice","invoiceSearch","generateAvoirForInvoice","lastClosingEnd","unshift","avoir","has_avoir","mkReference","sample","padWithZeros","p1","mkNumber","openEditReference","openEditCode","codeModel","openEditInvoiceNb","openEditVAT","rateHistory","history","activeHistory","openEditPrefix","textEditEnd","parsed","parseHtml","legalsEditEnd","handleFilterChange","searchTimeout","clearTimeout","setTimeout","showNextInvoices","closeAnAccountingPeriod","periods","toggleExportModal","isDateClosed","isBetween","bulkUpdate","operatorName","first_name","last_name","requireStripeKeys","onlinePaymentModule","modalInstance","stripeKeys","stripe_public_key","setupInvoicesTour","order_by","maxInvoices","invoice_legals","invoice_text","invoice_reference","filetype","filename","base64","invoice_logo","partial","subscription_to_expire","invoice_items_ids","last_end_date","avoirModes","subscriptionExpireOptions","openDatePicker","itemId","avoir_item_id","$window","YESTERDAY","h","ms","LAST_CLOSING","MAX_END","invoiceErrorRE","accountingPeriods","pendingCreation","accounting_period","downloadArchive","location","SETTINGS","acd","encoding","dateFormat","labelMaxLength","decimalSeparator","exportInvoicesAtZero","columns","csrfToken","exportTarget","software","startDate","endDate","firstInvoice","statusQry","mkQuery","picker","fillSettings","extension","date_format","label_max_length","decimal_separator","export_invoices_at_zero","first","$http","$httpParamSerializerJQLike","publicKey","publicKeyStatus","secretKey","stripe_secret_key","secretKeyStatus","testSecretKey","Authorization","testPublicKey","MembersController","slug","subscription_date_opened","openSubscriptionDatePicker","membersPromise","adminsPromise","partnersPromise","managersPromise","User","members","member","searchText","noMore","memberFilter","memberFilters","admins","superadminId","orderAdmin","partners","orderPartner","managers","orderManager","sub","setOrderMember","resetSearchMember","memberSearch","setOrderAdmin","setOrderPartner","setOrderManager","openPartnerNewModal","partner","deleteMember","memberId","findItemIdxById","destroyAdmin","admin","destroyPartner","destroyManager","manager","showNextMembers","updateTextSearch","updateMemberFilter","setupMembersTour","maxMembers","Subscription","memberPromise","walletPromise","transactionsPromise","activeProviderPromise","Wallet","password","change","phoneRequired","phone_required","addressRequired","address_required","subscribed_plan","nameToDisplay","transactions","activeProvider","changeUserRole","roles","notAnOption","updateRole","_res","OLD","NEW","updateSubscriptionModal","free","new_expired_at","copy","expired_at","ev","_subscription","createSubscriptionModal","humanReadablePlanName","short","allowMonthlySchedule","toggleSchedule","$apply","reload","createWalletCreditModal","generate_avoir","avoir_date","credit","avoir_description","_wallet","filterDisabledPlans","birthday","plan_interval","invoicing_profile","toggleOrganization","organization","onImportResult","Import","importItem","parse","statistic_profile_attributes","profile_attributes","invoicing_profile_attributes","saveAdmin","saveManager","clientsPromise","OpenAPIClient","clients","clientFormVisible","createClient","setOrder","cancelEdit","clientOriginalName","saveClient","open_api_client","clientResp","editClient","deleteClient","resetToken","setupOpenAPITour","PlanController","assign","translateLabel","prop","group_pricing","limitDescriptionSize","alert","training","intervalCount","is_rolling","partnerId","partnerContact","ui_weight","partnerIsValid","email","toggleMonthlyPayment","toggle","toggleIsRolling","afterSubmit","property","planPromise","allGroups","selectedGroup","copyPricesFromPlan","parent","parentPlan","parentPrice","childKey","childPrice","priceable_type","priceable_id","getMachine","machine_id","getSpace","space_id","space","TrainingsPricing","Credit","Pricing","machinesPricesPromise","Price","trainingsPricingsPromise","machineCreditsPromise","trainingCreditsPromise","couponsPromise","spacesPricesPromise","spacesCreditsPromise","machinesPrices","trainingsPricings","enabledPlans","enabledGroups","machineCredits","trainingCredits","trainingCreditsGroups","enabledMachines","coupons","couponsPage","enabledSpaces","spaceCredits","spacesPrices","orderPlans","isopen","planFiltering","couponStatus","findTrainingsPricing","trainingId","groupId","trainingsPricing","training_id","updateTrainingsPricing","trainings_pricing","getPlanFromId","getGroupFromId","showTrainings","saveTrainingCredits","newdata","planId","training_credit_nb","training_credits","noop","original","oldTrainingId","tc","findTrainingCredit","$delete","TRAINING","creditable","newTrainingId","creditable_id","creditable_type","newTc","getTrainingFromId","cancelTrainingCredit","addMachineCredit","showCreditableName","getCreditable","saveMachineCredit","mc","pop","cancelMachineCredit","removeMachineCredit","addSpaceCredit","saveSpaceCredit","sc","cancelSpaceCredit","removeSpaceCredit","getPlanType","setOrderPlans","findPriceBy","machineId","updatePrice","deletePlan","deleteCoupon","sendCouponToUser","ctrl","send","coupon_code","loadMore","updateCouponFilter","examplePrice","setupPricingTour","$root","groupCreditsByPlan","credits","creditsMap","Component","Licence","Theme","componentsPromise","licencesPromise","components","licences","saveComponent","removeComponent","addComponent","cancelComponent","saveTheme","removeTheme","addTheme","cancelTheme","saveLicence","removeLicence","addLicence","cancelLicence","onTestFileComplete","removeInitialDot","lower","setupProjectElementsTour","privacyDraftsPromise","cguFile","logoFile","logoBlackFile","faviconFile","profileImageFile","timepicker","logoBlack","favicon","profileImage","methods","loader","privacyDraftsHistory","aboutTitleSetting","about_title","aboutBodySetting","about_body","privacyDpoSetting","privacy_dpo","aboutContactsSetting","about_contacts","homeBlogpostSetting","home_blogpost","homeContent","home_content","homeCss","home_css","machineExplicationsAlert","machine_explications_alert","trainingExplicationsAlert","training_explications_alert","trainingInformationMessage","training_information_message","subscriptionExplicationsAlert","subscription_explications_alert","eventExplicationsAlert","event_explications_alert","spaceExplicationsAlert","space_explications_alert","windowStart","booking_window_start","windowEnd","booking_window_end","mainColorSetting","main_color","secondColorSetting","secondary_color","nameGenre","name_genre","customLogo","customLogoBlack","customFavicon","version","bodyTemp","privacy_body","summernoteOptsHomePage","nugget","codeMirrorEditor","codemirrorOpts","matchBrackets","lineNumbers","advancedSettings","SETTING","log","savePrivacyPolicy","saveCb","draft","orderedHistory","last","addLoader","handlePolicyRevisionChange","analyticsModal","analyticsData","FabAnalytics","resetHomePage","reset","codemirrorLoaded","editor","setupSettingsTour","refresh","sessionTours","publish","statisticsPromise","searchDate","scrollId","totalHits","agePicker","sumCA","averageAge","sumStat","customAggs","sorting","customFilter","criterion","exclude","filters","customFieldName","toggleCustomDatePicker","buildCustomFiltersList","refreshStats","table","validateFilterChange","formatSex","sex","formatSubtype","getCustomValueInputType","toggleSorting","getUserNameFromId","showMoreResults","scroll","ES_SCROLL_TIME","body","_scroll_id","hits","exportToExcel","dates","custom","buildCustomFilterQuery","buildElasticDataQuery","setupStatisticsTour","total_ca","average_age","total_stat","custom_aggregations","buildElasticCustomCriterion","ageMin","ageMax","sortings","range","gte","lte","age","must_not","buildElasticSortCriteria","avg","criteria","crits","simple","findIndex","exportStart","exportEnd","setRequest","exportData","cancelTag","addTag","saveTag","removeTag","TrainingsController","onDisableToggled","public_page","trainingPromise","monitoring","groupedAvailabilities","accordions","trainingFiltering","showMachines","cancelTraining","showReservations","usersToValid","u","is_valid","removeTraining","formatMonth","formatDay","year","selectTrainingToMonitor","groupAvailabilities","now","isOpenFirst","setupTrainingsTour","tree","autoNgTemplateLoaderTemplate1","autoNgTemplateLoaderTemplate2","autoNgTemplateLoaderTemplate3","autoNgTemplateLoaderTemplate4","autoNgTemplateLoaderTemplate5","autoNgTemplateLoaderTemplate6","$locale","$timeout","Session","Notification","$interval","Version","Help","current","currencySymbol","NUMBER_FORMATS","CURRENCY_SYM","setCurrentUser","getNotifications","origin","login","openLoginModal","logout","destroy","toCheckNotifications","notifications","unread","signup","recaptchaSiteKey","recaptcha_site_key","is_allow_contact","is_allow_newsletter","recaptcha","closeAlert","orga","register","confirmation_required","_currentUser","editPassword","reset_password_token","changePassword","toggleNavSize","$classes","$targets","toggler","$class","$target","attr","$tmp","each","patt","RegExp","cn","trim","toggleClass","versionModal","up_to_date","evt","KeyboardEvent","dispatchEvent","checkNotificationsIsInit","last_unread","lastCheck","totals","toDisplay","n","notification","polling","last_poll","confirmationRequired","openSignup","openConfirmationNewModal","openResetPassword","reason","sendReset","submitConfirmationNewForm","onPageVisible","hidden","onchange","evtMap","focus","focusin","pageshow","blur","focusout","pagehide","addEventListener","onfocusin","onfocusout","onpageshow","onpagehide","onfocus","onblur","transitionTo","authorizedRoles","isAuthenticated","fablabName","fablab_name","linkName","link_name","$aside","iCalendarPromise","currentMachineEvent","isSelectAll","externals","filterAvailabilities","dispo","availabilitySourceUrl","some","toggleFilter","openFilterAside","event_id","defaultView","intervalStart","defaultDate","slotEventOverlap","toggleSlotEventOverlap","param","header","center","innerWidth","$cookies","cookiesState","learnMoreUrl","declineCookies","expires","readCookie","acceptCookies","o","arguments","l","createElement","getElementsByTagName","async","parentNode","insertBefore","ga","SocialNetworks","social","showAllLinks","networks","hasUsedTrainingCredit","getTrainingName","filterNetworks","network","__range__","inclusive","ascending","theme_id","age_range_id","monthNames","groupEvents","showEvent","filterEvents","eventsGroupByMonth","monthOrder","onSingleDay","eventsGroupedByMonth","groupBy","obj","Reservation","helpers","reserve","nbPlaces","normal","nbReservePlaces","tickets","toReserve","amountTotal","totalNoCoupon","totalSeats","applied","enableBookingMove","booking_move_enable","moveBookingDelay","booking_move_delay","enableBookingCancel","booking_cancel_enable","cancelBookingDelay","booking_cancel_delay","deleteEvent","changeNbPlaces","remain","nb_free_places","ticket","fullPriceRemains","priceRemain","computeEventAmount","cancelReserve","resetEventReserve","reserveEvent","reserveSuccess","sameTimeReservations","findReservationsAtSameTime","showReserveSlotSameTimeModal","updateMember","getReservations","payEvent","mkReservation","getWalletByUser","amountToPay","getAmountToPay","online_payment_module","payByStripe","payOnSite","validReserveEvent","reservable_id","reservable_type","slots_attributes","nb_reserve_places","tickets_attributes","price_id","availability_id","seats","event_price_category_id","booked","attempting","afterPayment","cancelReservation","total_booked_seats","modifyReservation","eventToPlace","reservationCanModify","slotStart","isAble","reservationCanCancel","mkRequestParams","price_without_coupon","shareOnFacebook","absolute","shareOnTwitter","encodeURIComponent","getPriceCategoryConditions","conditions","offered","evt_px_cat","objectToPay","eventToReserve","stripeKey","numberFilter","onPaymentSuccess","validButtonName","ROLE","walletAmount","union","bookOverlappingSlotsPromise","$translatePartialLoader","news","projects","twitter","setupHomeTour","setupWelcomeTour","insertDirectives","node","innerHTML","newsNode","replaceChild","projectsNode","twitterNode","membersNode","eventsNode","outerHTML","$parent","hasStep","MachinesController","machine_files_attributes","_reserveMachine","_this","current_user_is_training","current_user_training_reservation","reduce","acc","humanizeTrainings","showMachine","reserveMachine","bind","machineFiltering","setupMachinesTour","machinePromise","FREE_SLOT_BORDER_COLOR","plansAreShown","selectedPlan","planSelectionTime","reserved","modifiable","placable","paid","moved","selectionTime","selectedEvent","markSlotAsAdded","updateEvents","markSlotAsRemoved","isValid","is_reserved","can_modify","slotCancelled","markSlotAsModifying","changeModifyMachineSlot","_id","modifyMachineSlot","slotId","refetchCalendar","cancelModifyMachineSlot","doNotSubscribePlan","selectPlan","showPlans","machineSlot","updateMachineSlot","realEvents","navLinks","linkText","linkIcon","class","adminNavLinks","requested_attributes","$injector","userGroup","preventPassword","cookiesStatus","preventField","isSuperAdmin","getUserGroup","selectGroup","user_avatar","deleteUser","hasSsoFields","syncProfile","oldUser","link_to_sso_connect","resetCookies","notificationsRead","notificationsUnread","totalUnread","markAsRead","is_read","updatedNotif","markAllAsRead","addMoreNotifications","notif","subscriptionExplicationsPromise","member_id","isInFuture","dateTime","actives","privacyBody","privacyDpo","registerAuthToken","merge","auth_token","ssoEmail","duplicate","hasDuplicate","resendCode","send_code","hideNewAccountConfirmation","previous_provider","ProjectsController","Project","$document","Diacritics","allowedExtensions","totalSteps","project","project_steps_attributes","scrollTop","project_caos_attributes","addStep","step_nb","project_step_images_attributes","deleteStep","changeStepIndex","newIdx","autoCompleteName","nameLookup","asciiName","matchingMembers","addProjectStepImage","deleteProjectStepImage","image","saveButtonValue","paginationService","OpenlabProject","$location","openLabActive","openlabAppId","openlab_app_id","openlab","projectsActive","searchOverWholeNetwork","$$search","component_id","searchOverWholeNetworkChanged","resetFiltersAndTriggerSearch","projectsPagination","setUrlQueryParams","triggerSearch","currentPage","updateUrlParam","Instance","loadMoreOpenlabCallback","per_page","projectsPromise","totalCount","meta","normalizeProjectsAttrs","loadMoreCallback","showProject","app_id","project_url","reloadOnSearch","project_image","image_url","whole_network","openlab_default","projectPromise","project_users","full_name","author_id","user_ids","shortnamePromise","projectUrl","absUrl","disqusShortname","projectEditableBy","canEdit","projectDeletableBy","deleteProject","signalAbuse","signaler","signaled_id","abuse","SpacesController","space_files_attributes","showSpace","reserveSpace","spaceFiltering","setupSpacesTour","spacePromise","deleteSpace","is_completed","changeModifySpaceSlot","modifySpaceSlot","cancelModifySpaceSlot","spaceId","spaceSlot","updateSpaceSlotId","machine_credits","reserveTraining","showTraining","changeModifyTrainingSlot","modifyTrainingSlot","cancelModifyTrainingSlot","trainingSlot","updateTrainingSlotId","factory","$translate","interpolations","instant","$resource","service","mapping_fields","params","defaultOptions","fullcalendar_locale","firstDay","scrollTime","allDayDefault","buttonIcons","slotLabelFormat","views","agendaWeek","timeFormat","allDaySlot","editable","validate","replaceWith","defaultDiacriticsRemovalap","letters","diacriticsMap","j","defaultOpts","isObject","extend","isFunction","esFactory","host","upcoming","TOURS","tourName","onTour","onGuide","lastSubscribed","interceptor","perPage","_pageCount","pageCount","resourceService","defaultQueryParams","functionName","hasNextPage","queryParams","_queryParams","dataPromise","lastPublished","transformRequest","toJson","stateName","addPart","directive","elm","attrs","requiredCtrls","ngModelCtrl","fileinput","parents","filetypeRegex","bsJasnyFileinput","$setViewValue","$setPristine","files","$setValidity","restrict","slotSelectionTime","modePlans","onSlotAddedToCart","onSlotRemovedFromCart","onSlotStartToModify","onSlotModifySuccess","onSlotModifyCancel","onSlotModifyUnselect","onSlotCancelSuccess","reservableId","reservableType","limitToOneSlot","attributes","amountPaid","requested_schedule","showModal","validateSlot","validateTags","validateSameTimeReservations","updateCartPrice","isSlotsValid","isSelectedUser","areFutureSlots","payCart","slotNotValid","slotNotValidError","slotValidations","paySlots","modifySlot","newSlot","oldSlot","cancelModifySlot","removeSlotToPlace","tagMissmatch","togglePaymentSchedule","toggleStripeModal","beforeApply","afterStripeSuccess","interTags","intersection","slotTags","userTags","userName","slotSelectionChanged","plansGrouped","group_ids","resetCartState","slotCanBeModified","slotCanBeCanceled","movable","cancelable","paidPlan","planSelectionChanged","setSlotsDetails","promo","request","mkSubscription","mkCartItems","paymentResult","hasOtherDeadlines","isOpenStripeModal","rsrv","afterCreatePaymentSchedule","computeValidButtonName","METHOD","bookSlotAtSameTime","$compile","$eval","compile","contents","priority","terminal","confirmationNeeded","clickAction","ngClick","confirmationNeededIf","couponCode","validateCode","PERCENT","percent_off","amount_off","CURRENCY","validity_per_user","closeMessage","fileread","changeEvent","Holder","background","foreground","font","$pristine","$modelValue","currentValue","triggerHandler","submit","$animate","$observe","parentForm","$$parentForm","$removeControl","userAvatar","avatarClass","upcomingEvents","isOneDayEvent","homeBlogpost","lastProjects","activeSlide","twitterName","configProfile","twitterFetcher","fetch","lastMembers","transclude","postRender","isLoadingMembers","classes","onBeforeSave","toggleSetting","refreshComponent","saveValue","resetValue","faIcon","helperText","min","titleNew","descriptionNew","beforeAdd","selection","removeItem","opt","addItem","option1","option2","option3","option4","option5","placeholder","maxLength","minLength","readOnly","altText","faClass","Stripe","fontFamily","fontSmoothing","displayError","getElementById","handleServerResponse","payment_intent_id","confirmResult","mount","button","URL_REGEXP","$validators","modelValue","viewValue","$isEmpty","ENDPOINT_REGEXP","endpoint","arrayLength","asc","selectedMachine","filteredElements","selectedMember","isDefined","filteredProject","selectedTheme","filteredProjects","theme_ids","selectedComponent","component_ids","authorId","selectedScope","reverse","memoize","defineProperty","__proto__","isMoment","boolean","___HTML_LOADER_REPLACEMENT_0___","___HTML_LOADER_REPLACEMENT_1___","___HTML_LOADER_REPLACEMENT_2___","importAll","varArgs","TypeError","nextSource","nextKey","writable","configurable","floor","webpackContext","req","webpackContextResolve","__webpack_require__","deviseModal","deferred","fn","arg","$templateCache","disqus_shortname","disqus_identifier","disqus_title","disqus_url","disqus_category_id","disqus_disable_mobile","readyToBind","template","isReady","DISQUS","identifier","dsq","appendChild","define","summernote","Nugget","Insert_nugget","plugins","context","ui","langInfo","propertyName","buttonGroup","dropdown","li","setAttribute","invoke","firstChild","render","$stateProvider","$urlRouterProvider","$locationProvider","hashPrefix","otherwise","abstract","leftnav","cookies","main","sharedTranslations","Translations","modulesPromise","onEnter","spaces_module","plans_module","trainings_module","invoicing","wallet_module","statistics_module","publicTranslations","loggedTranslations","adminTranslations","walletModule","spacesModule","trainingsModule","explicationAlertPromise","plansModule","statisticsModule"],"mappings":"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aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,gBAAiB,IACjB,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,UAAW,IACX,aAAc,IACd,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IA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W,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,gBAAiB,IACjB,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,UAAW,IACX,aAAc,IACd,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,UAAW,IACX,aAAc,IACd,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,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","file":"js/application-b242c0d294dbd5b29fad.chunk.js","sourcesContent":["'use strict';\n\n/**\n* The application file bootstraps the angular app by initializing the main module and\n* creating namespaces and moduled for controllers, filters, services, and directives.\n*/\n\n// eslint-disable-next-line no-use-before-define\nvar Application = Application || {};\n\nApplication.Components = angular.module('application.components', []);\nApplication.Services = angular.module('application.services', []);\nApplication.Controllers = angular.module('application.controllers', []);\nApplication.Filters = angular.module('application.filters', []);\nApplication.Directives = angular.module('application.directives', []);\n\nangular.module('application', ['ngCookies', 'ngResource', 'ngSanitize', 'ui.router', 'ui.bootstrap',\n 'ngUpload', 'duScroll', 'application.filters', 'application.services', 'application.directives',\n 'frapontillo.bootstrap-switch', 'application.controllers', 'application.router', 'application.components',\n 'ui.select', 'ui.calendar', 'angularMoment', 'Devise', 'angular-growl', 'xeditable',\n 'checklist-model', 'unsavedChanges', 'angular-loading-bar', 'ngTouch', 'angular-google-analytics',\n 'angularUtils.directives.dirDisqus', 'summernote', 'elasticsearch', 'angular-medium-editor', 'naif.base64',\n 'minicolors', 'pascalprecht.translate', 'ngFitText', 'ngAside', 'ngCapsLock', 'vcRecaptcha', 'ui.codemirror',\n 'bm.uiTour'])\n .config(['$httpProvider', 'AuthProvider', 'growlProvider', 'unsavedWarningsConfigProvider', 'AnalyticsProvider', 'uibDatepickerPopupConfig', '$provide', '$translateProvider', 'TourConfigProvider',\n function ($httpProvider, AuthProvider, growlProvider, unsavedWarningsConfigProvider, AnalyticsProvider, uibDatepickerPopupConfig, $provide, $translateProvider, TourConfigProvider) {\n // Google analytics\n // first we check the user acceptance\n const cookiesConsent = document.cookie.replace(/(?:(?:^|.*;\\s*)fab-manager-cookies-consent\\s*=\\s*([^;]*).*$)|^.*$/, '$1');\n if (cookiesConsent === 'accept') {\n AnalyticsProvider.setAccount(Fablab.trackingId);\n // track all routes (or not)\n AnalyticsProvider.trackPages(true);\n AnalyticsProvider.setDomainName(Fablab.baseHostUrl);\n AnalyticsProvider.useAnalytics(true);\n AnalyticsProvider.setPageEvent('$stateChangeSuccess');\n } else {\n // if the cookies were not explicitly accepted, delete them\n document.cookie = '_ga=; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n document.cookie = '_gid=; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n }\n\n // Custom messages for the date-picker widget\n uibDatepickerPopupConfig.closeText = Fablab.translations.app.shared.buttons.close;\n uibDatepickerPopupConfig.clearText = Fablab.translations.app.shared.buttons.clear;\n uibDatepickerPopupConfig.currentText = Fablab.translations.app.shared.buttons.today;\n\n // Custom messages for angular-unsavedChanges\n unsavedWarningsConfigProvider.navigateMessage = Fablab.translations.app.shared.messages.you_will_lose_any_unsaved_modification_if_you_quit_this_page;\n unsavedWarningsConfigProvider.reloadMessage = Fablab.translations.app.shared.messages.you_will_lose_any_unsaved_modification_if_you_reload_this_page;\n\n // Set how long the popup messages (growl) will remain\n growlProvider.globalTimeToLive(5000);\n\n // Configure the i18n module to load the partial translations from the given API URL\n $translateProvider.useLoader('$translatePartialLoader', {\n urlTemplate: '/api/translations/{lang}/{part}'\n });\n // Enable the cache to speed-up the loading times on already seen pages\n $translateProvider.useLoaderCache(true);\n // Secure i18n module against XSS attacks by escaping the output\n $translateProvider.useSanitizeValueStrategy('escapeParameters');\n // Use the MessageFormat interpolation by default (used for pluralization)\n $translateProvider.useMessageFormatInterpolation();\n // Set the language of the instance (from ruby configuration)\n $translateProvider.preferredLanguage(Fablab.locale);\n // End the tour when the user clicks the forward or back buttons of the browser\n TourConfigProvider.enableNavigationInterceptors();\n }]).run(['$rootScope', '$log', 'Auth', 'amMoment', '$state', 'editableOptions', 'Analytics',\n function ($rootScope, $log, Auth, amMoment, $state, editableOptions, Analytics) {\n // Angular-moment (date-time manipulations library)\n amMoment.changeLocale(Fablab.moment_locale);\n\n // Angular-xeditable (click-to-edit elements, used in admin backoffice)\n editableOptions.theme = 'bs3';\n\n // Alter the UI-Router's $state, registering into some information concerning the previous $state.\n // This is used to allow the user to navigate to the previous state\n $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {\n $state.prevState = fromState;\n $state.prevParams = fromParams;\n });\n\n // Global function to allow the user to navigate to the previous screen (ie. $state).\n // If no previous $state were recorded, navigate to the home page\n $rootScope.backPrevLocation = function (event) {\n event.preventDefault();\n event.stopPropagation();\n if ($state.prevState.name === '') {\n $state.prevState = 'app.public.home';\n }\n $state.go($state.prevState, $state.prevParams);\n };\n\n // Configuration of the summernote editor (used in project edition)\n $rootScope.summernoteOpts = {\n lang: Fablab.summernote_locale,\n height: 200,\n toolbar: [\n ['style', ['style']],\n ['font', ['bold', 'italic', 'underline', 'clear']],\n ['color', ['color']],\n ['para', ['ul', 'ol', 'paragraph']],\n ['table', ['table']],\n ['insert', ['link', 'picture', 'hr']],\n ['view', ['fullscreen', 'codeview']],\n ['group', ['video']],\n ['help', ['help']]\n ],\n styleTags: ['p', 'blockquote', 'pre', 'h4', 'h5', 'h6'],\n maximumImageFileSize: 4096\n };\n\n // Prevent the usage of the application for members with incomplete profiles: they will be redirected to\n // the 'profile completion' page. This is especially useful for user's accounts imported through SSO.\n $rootScope.$on('$stateChangeStart', function (event, toState) {\n Auth.currentUser().then(function (currentUser) {\n if (currentUser.need_completion && toState.name !== 'app.logged.profileCompletion') {\n $state.go('app.logged.profileCompletion');\n }\n }).catch(() => {\n // no one is logged, just ignore\n });\n });\n\n // This code does nothing but it is here to remember to not remove the Analytics dependency,\n // see https://github.com/revolunet/angular-google-analytics#automatic-page-view-tracking\n Analytics.pageView();\n\n /**\n * This helper method builds and return an array containing every integers between\n * the provided start and end.\n * @param start {number}\n * @param end {number}\n * @return {Array} [start .. end]\n */\n $rootScope.intArray = function (start, end) {\n const arr = [];\n for (let i = start; i < end; i++) { arr.push(i); }\n return arr;\n };\n }]).constant('angularMomentConfig', {\n timezone: Fablab.timezone\n }).constant('moment', require('moment-timezone'));\n\nangular.isUndefinedOrNull = function (val) {\n return angular.isUndefined(val) || val === null;\n};\n\nmodule.exports = { Application };\n","/**\n * This component is a wrapper that display a loader while the children components have their rendering suspended\n */\n\nimport React, { Suspense } from 'react';\n\n\nexport const Loader: React.FC = ({children }) => {\n const loading = (\n
\n \n
\n );\n return (\n \n {children}\n \n );\n}\n\n","import axios, { AxiosInstance } from 'axios'\n\nconst token: HTMLMetaElement = document.querySelector('[name=\"csrf-token\"]');\nconst client: AxiosInstance = axios.create({\n headers: {\n common: {\n 'X-CSRF-Token': token?.content || 'no-csrf-token'\n }\n }\n});\n\nclient.interceptors.response.use(function (response) {\n // Any status code that lie within the range of 2xx cause this function to trigger\n return response;\n}, function (error) {\n // Any status codes that falls outside the range of 2xx cause this function to trigger\n const message = error.response?.data || error.message || error;\n return Promise.reject(extractHumanReadableMessage(message));\n});\n\nfunction extractHumanReadableMessage(error: any): string {\n if (typeof error === 'string') {\n if (error.match(/^/)) {\n // parse ruby error pages\n const parser = new DOMParser();\n const htmlDoc = parser.parseFromString(error, 'text/html');\n if (htmlDoc.querySelectorAll('h2').length > 2) {\n return htmlDoc.querySelector('h2').textContent;\n } else {\n return htmlDoc.querySelector('h1').textContent;\n }\n }\n return error;\n }\n\n // parse Rails errors (as JSON) or API errors\n let message = '';\n if (error instanceof Object) {\n // API errors\n if (error.hasOwnProperty('error') && typeof error.error === 'string') {\n return error.error;\n }\n // iterate through all the keys to build the message\n for (const key in error) {\n if (Object.prototype.hasOwnProperty.call(error, key)) {\n message += `${key} : `;\n if (error[key] instanceof Array) {\n // standard rails messages are stored as {field: [error1, error2]}\n // we rebuild them as \"field: error1, error2\"\n message += error[key].join(', ');\n } else {\n message += error[key];\n }\n }\n }\n return message;\n }\n\n return JSON.stringify(error);\n}\n\nexport default client;\n","/**\n * This component is a template for a clickable button that wraps the application style\n */\n\nimport React, { ReactNode, SyntheticEvent } from 'react';\n\ninterface FabButtonProps {\n onClick?: (event: SyntheticEvent) => void,\n icon?: ReactNode,\n className?: string,\n disabled?: boolean,\n type?: 'submit' | 'reset' | 'button',\n form?: string,\n}\n\n\nexport const FabButton: React.FC = ({ onClick, icon, className, disabled, type, form, children }) => {\n /**\n * Check if the current component was provided an icon to display\n */\n const hasIcon = (): boolean => {\n return !!icon;\n }\n\n /**\n * Handle the action of the button\n */\n const handleClick = (e: SyntheticEvent): void => {\n if (typeof onClick === 'function') {\n onClick(e);\n }\n }\n\n return (\n \n );\n}\n\nFabButton.defaultProps = { type: 'button' };\n\n","/**\n * This component is a template for a modal dialog that wraps the application style\n */\n\nimport React, { ReactNode, SyntheticEvent } from 'react';\nimport Modal from 'react-modal';\nimport { useTranslation } from 'react-i18next';\nimport { Loader } from './loader';\nimport CustomAssetAPI from '../api/custom-asset';\nimport { CustomAssetName } from '../models/custom-asset';\nimport { FabButton } from './fab-button';\n\nModal.setAppElement('body');\n\nexport enum ModalSize {\n small = 'sm',\n medium = 'md',\n large = 'lg'\n}\n\ninterface FabModalProps {\n title: string,\n isOpen: boolean,\n toggleModal: () => void,\n confirmButton?: ReactNode,\n closeButton?: boolean,\n className?: string,\n width?: ModalSize,\n customFooter?: ReactNode,\n onConfirm?: (event: SyntheticEvent) => void,\n preventConfirm?: boolean\n}\n\nconst blackLogoFile = CustomAssetAPI.get(CustomAssetName.LogoBlackFile);\n\nexport const FabModal: React.FC = ({ title, isOpen, toggleModal, children, confirmButton, className, width = 'sm', closeButton, customFooter, onConfirm, preventConfirm }) => {\n const { t } = useTranslation('shared');\n const blackLogo = blackLogoFile.read();\n\n /**\n * Check if the confirm button should be present\n */\n const hasConfirmButton = (): boolean => {\n return confirmButton !== undefined;\n }\n\n /**\n * Should we display the close button?\n */\n const hasCloseButton = (): boolean => {\n return closeButton;\n }\n\n /**\n * Check if there's a custom footer\n */\n const hasCustomFooter = (): boolean => {\n return customFooter !== undefined;\n }\n\n return (\n \n
\n \n {blackLogo.custom_asset_file_attributes.attachment}\n\n \n

{ title }

\n
\n
\n {children}\n
\n
\n \n {hasCloseButton() &&{t('app.shared.buttons.close')}}\n {hasConfirmButton() && {confirmButton}}\n {hasCustomFooter() && customFooter}\n \n
\n
\n );\n}\n\n","import apiClient from './api-client';\nimport { AxiosResponse } from 'axios';\nimport {\n CancelScheduleResponse,\n CashCheckResponse, PayItemResponse,\n PaymentSchedule,\n PaymentScheduleIndexRequest, RefreshItemResponse\n} from '../models/payment-schedule';\nimport wrapPromise, { IWrapPromise } from '../lib/wrap-promise';\n\nexport default class PaymentScheduleAPI {\n async list (query: PaymentScheduleIndexRequest): Promise> {\n const res: AxiosResponse = await apiClient.post(`/api/payment_schedules/list`, query);\n return res?.data;\n }\n\n async index (query: PaymentScheduleIndexRequest): Promise> {\n const res: AxiosResponse = await apiClient.get(`/api/payment_schedules?page=${query.query.page}&size=${query.query.size}`);\n return res?.data;\n }\n\n async cashCheck(paymentScheduleItemId: number): Promise {\n const res: AxiosResponse = await apiClient.post(`/api/payment_schedules/items/${paymentScheduleItemId}/cash_check`);\n return res?.data;\n }\n\n async refreshItem(paymentScheduleItemId: number): Promise {\n const res: AxiosResponse = await apiClient.post(`/api/payment_schedules/items/${paymentScheduleItemId}/refresh_item`);\n return res?.data;\n }\n\n async payItem(paymentScheduleItemId: number): Promise {\n const res: AxiosResponse = await apiClient.post(`/api/payment_schedules/items/${paymentScheduleItemId}/pay_item`);\n return res?.data;\n }\n\n async cancel (paymentScheduleId: number): Promise {\n const res: AxiosResponse = await apiClient.put(`/api/payment_schedules/${paymentScheduleId}/cancel`);\n return res?.data;\n }\n}\n\n","import apiClient from './api-client';\nimport { AxiosResponse } from 'axios';\nimport { CartItems, IntentConfirmation, PaymentConfirmation, UpdateCardResponse } from '../models/payment';\n\nexport default class PaymentAPI {\n static async confirm (stp_payment_method_id: string, cart_items: CartItems): Promise {\n const res: AxiosResponse = await apiClient.post(`/api/payments/confirm_payment`, {\n payment_method_id: stp_payment_method_id,\n cart_items\n });\n return res?.data;\n }\n\n static async setupIntent (user_id: number): Promise {\n const res: AxiosResponse = await apiClient.get(`/api/payments/setup_intent/${user_id}`);\n return res?.data;\n }\n\n // TODO, type the response\n static async confirmPaymentSchedule (setup_intent_id: string, cart_items: CartItems): Promise {\n const res: AxiosResponse = await apiClient.post(`/api/payments/confirm_payment_schedule`, {\n setup_intent_id,\n cart_items\n });\n return res?.data;\n }\n\n static async updateCard (user_id: number, stp_payment_method_id: string): Promise {\n const res: AxiosResponse = await apiClient.post(`/api/payments/update_card`, {\n user_id,\n payment_method_id: stp_payment_method_id,\n });\n return res?.data;\n }\n}\n\n","import { Plan } from './plan';\n\n\nexport enum UserRole {\n Member = 'member',\n Manager = 'manager',\n Admin = 'admin'\n}\n\nexport interface User {\n id: number,\n username: string,\n email: string,\n group_id: number,\n role: UserRole\n name: string,\n need_completion: boolean,\n ip_address: string,\n profile: {\n id: number,\n first_name: string,\n last_name: string,\n interest: string,\n software_mastered: string,\n phone: string,\n website: string,\n job: string,\n tours: Array,\n facebook: string,\n twitter: string,\n google_plus: string,\n viadeo: string,\n linkedin: string,\n instagram: string,\n youtube: string,\n vimeo: string,\n dailymotion: string,\n github: string,\n echosciences: string,\n pinterest: string,\n lastfm: string,\n flickr: string,\n user_avatar: {\n id: number,\n attachment_url: string\n }\n },\n invoicing_profile: {\n id: number,\n address: {\n id: number,\n address: string\n },\n organization: {\n id: number,\n name: string,\n address: {\n id: number,\n address: string\n }\n }\n },\n statistic_profile: {\n id: number,\n gender: string,\n birthday: Date\n },\n subscribed_plan: Plan,\n subscription: {\n id: number,\n expired_at: Date,\n canceled_at: Date,\n stripe: boolean,\n plan: {\n id: number,\n base_name: string,\n name: string,\n interval: string,\n interval_count: number,\n amount: number\n }\n },\n training_credits: Array,\n machine_credits: Array<{machine_id: number, hours_used: number}>,\n last_sign_in_at: Date\n}\n","module.exports = __webpack_public_path__ + \"media/images/powered_by_stripe-a43f123c8b2030f5781f56cdeecc8f5d.png\";","module.exports = __webpack_public_path__ + \"media/images/mastercard-a0dda355ba619ab1f12e55be5320eec8.png\";","module.exports = __webpack_public_path__ + \"media/images/visa-e31b5cb84a808cb0dfd02617680fa931.png\";","import { HistoryValue } from './history-value';\n\nexport enum SettingName {\n AboutTitle = 'about_title',\n AboutBody = 'about_body',\n AboutContacts = 'about_contacts',\n PrivacyDraft = 'privacy_draft',\n PrivacyBody = 'privacy_body',\n PrivacyDpo = 'privacy_dpo',\n TwitterName = 'twitter_name',\n HomeBlogpost = 'home_blogpost',\n MachineExplicationsAlert = 'machine_explications_alert',\n TrainingExplicationsAlert = 'training_explications_alert',\n TrainingInformationMessage = 'training_information_message',\n SubscriptionExplicationsAlert = 'subscription_explications_alert',\n InvoiceLogo = 'invoice_logo',\n InvoiceReference = 'invoice_reference',\n InvoiceCodeActive = 'invoice_code-active',\n InvoiceCodeValue = 'invoice_code-value',\n InvoiceOrderNb = 'invoice_order-nb',\n InvoiceVATActive = 'invoice_VAT-active',\n InvoiceVATRate = 'invoice_VAT-rate',\n InvoiceText = 'invoice_text',\n InvoiceLegals = 'invoice_legals',\n BookingWindowStart = 'booking_window_start',\n BookingWindowEnd = 'booking_window_end',\n BookingSlotDuration = 'booking_slot_duration',\n BookingMoveEnable = 'booking_move_enable',\n BookingMoveDelay = 'booking_move_delay',\n BookingCancelEnable = 'booking_cancel_enable',\n BookingCancelDelay = 'booking_cancel_delay',\n MainColor = 'main_color',\n SecondaryColor = 'secondary_color',\n FablabName = 'fablab_name',\n NameGenre = 'name_genre',\n ReminderEnable = 'reminder_enable',\n ReminderDelay = 'reminder_delay',\n EventExplicationsAlert = 'event_explications_alert',\n SpaceExplicationsAlert = 'space_explications_alert',\n VisibilityYearly = 'visibility_yearly',\n VisibilityOthers = 'visibility_others',\n DisplayNameEnable = 'display_name_enable',\n MachinesSortBy = 'machines_sort_by',\n AccountingJournalCode = 'accounting_journal_code',\n AccountingCardClientCode = 'accounting_card_client_code',\n AccountingCardClientLabel = 'accounting_card_client_label',\n AccountingWalletClientCode = 'accounting_wallet_client_code',\n AccountingWalletClientLabel = 'accounting_wallet_client_label',\n AccountingOtherClientCode = 'accounting_other_client_code',\n AccountingOtherClientLabel = 'accounting_other_client_label',\n AccountingWalletCode = 'accounting_wallet_code',\n AccountingWalletLabel = 'accounting_wallet_label',\n AccountingVATCode = 'accounting_VAT_code',\n AccountingVATLabel = 'accounting_VAT_label',\n AccountingSubscriptionCode = 'accounting_subscription_code',\n AccountingSubscriptionLabel = 'accounting_subscription_label',\n AccountingMachineCode = 'accounting_Machine_code',\n AccountingMachineLabel = 'accounting_Machine_label',\n AccountingTrainingCode = 'accounting_Training_code',\n AccountingTrainingLabel = 'accounting_Training_label',\n AccountingEventCode = 'accounting_Event_code',\n AccountingEventLabel = 'accounting_Event_label',\n AccountingSpaceCode = 'accounting_Space_code',\n AccountingSpaceLabel = 'accounting_Space_label',\n HubLastVersion = 'hub_last_version',\n HubPublicKey = 'hub_public_key',\n FabAnalytics = 'fab_analytics',\n LinkName = 'link_name',\n HomeContent = 'home_content',\n HomeCss = 'home_css',\n Origin = 'origin',\n Uuid = 'uuid',\n PhoneRequired = 'phone_required',\n TrackingId = 'tracking_id',\n BookOverlappingSlots = 'book_overlapping_slots',\n SlotDuration = 'slot_duration',\n EventsInCalendar = 'events_in_calendar',\n SpacesModule = 'spaces_module',\n PlansModule = 'plans_module',\n InvoicingModule = 'invoicing_module',\n FacebookAppId = 'facebook_app_id',\n TwitterAnalytics = 'twitter_analytics',\n RecaptchaSiteKey = 'recaptcha_site_key',\n RecaptchaSecretKey = 'recaptcha_secret_key',\n FeatureTourDisplay = 'feature_tour_display',\n EmailFrom = 'email_from',\n DisqusShortname = 'disqus_shortname',\n AllowedCadExtensions = 'allowed_cad_extensions',\n AllowedCadMimeTypes = 'allowed_cad_mime_types',\n OpenlabAppId = 'openlab_app_id',\n OpenlabAppSecret = 'openlab_app_secret',\n OpenlabDefault = 'openlab_default',\n OnlinePaymentModule = 'online_payment_module',\n StripePublicKey = 'stripe_public_key',\n StripeSecretKey = 'stripe_secret_key',\n StripeCurrency = 'stripe_currency',\n InvoicePrefix = 'invoice_prefix',\n ConfirmationRequired = 'confirmation_required',\n WalletModule = 'wallet_module',\n StatisticsModule = 'statistics_module',\n UpcomingEventsShown = 'upcoming_events_shown',\n PaymentSchedulePrefix = 'payment_schedule_prefix',\n TrainingsModule = 'trainings_module',\n AddressRequired = 'address_required'\n}\n\nexport interface Setting {\n name: SettingName,\n value: string,\n last_update: Date,\n history: Array\n}\n","import apiClient from './api-client';\nimport { AxiosResponse } from 'axios';\nimport { Setting, SettingName } from '../models/setting';\nimport wrapPromise, { IWrapPromise } from '../lib/wrap-promise';\n\nexport default class SettingAPI {\n async get (name: SettingName): Promise {\n const res: AxiosResponse = await apiClient.get(`/api/settings/${name}`);\n return res?.data?.setting;\n }\n\n async query (names: Array): Promise> {\n const res: AxiosResponse = await apiClient.get(`/api/settings/?names=[${names.join(',')}]`);\n return res?.data;\n }\n\n static get (name: SettingName): IWrapPromise {\n const api = new SettingAPI();\n return wrapPromise(api.get(name));\n }\n\n static query(names: Array): IWrapPromise> {\n const api = new SettingAPI();\n return wrapPromise(api.query(names));\n }\n}\n\n","/**\n * This component initializes the stripe's Elements tag with the API key\n */\n\nimport React, { memo, useEffect, useState } from 'react';\nimport { Elements } from '@stripe/react-stripe-js';\nimport { loadStripe } from \"@stripe/stripe-js\";\nimport SettingAPI from '../api/setting';\nimport { SettingName } from '../models/setting';\n\nconst stripePublicKey = SettingAPI.get(SettingName.StripePublicKey);\n\nexport const StripeElements: React.FC = memo(({ children }) => {\n const [stripe, setStripe] = useState(undefined);\n\n useEffect(() => {\n const key = stripePublicKey.read();\n const promise = loadStripe(key.value);\n setStripe(promise);\n }, [])\n\n return (\n
\n {stripe && \n {children}\n }\n
\n );\n})\n","import { StripeIbanElement } from '@stripe/stripe-js';\n\nexport enum PaymentScheduleItemState {\n New = 'new',\n Pending = 'pending',\n RequirePaymentMethod = 'requires_payment_method',\n RequireAction = 'requires_action',\n Paid = 'paid',\n Error = 'error'\n}\n\nexport enum PaymentMethod {\n Stripe = 'stripe',\n Check = 'check'\n}\nexport interface PaymentScheduleItem {\n id: number,\n amount: number,\n due_date: Date,\n state: PaymentScheduleItemState,\n invoice_id: number,\n payment_method: PaymentMethod,\n client_secret?: string,\n details: {\n recurring: number,\n adjustment?: number,\n other_items?: number,\n without_coupon?: number,\n subscription_id: number\n }\n}\n\nexport interface PaymentSchedule {\n max_length: number;\n id: number,\n scheduled_type: string,\n scheduled_id: number,\n total: number,\n stp_subscription_id: string,\n reference: string,\n payment_method: string,\n wallet_amount: number,\n items: Array,\n created_at: Date,\n chained_footprint: boolean,\n user: {\n id: number,\n name: string\n },\n operator: {\n id: number,\n first_name: string,\n last_name: string,\n }\n}\n\nexport interface PaymentScheduleIndexRequest {\n query: {\n reference?: string,\n customer?: string,\n date?: Date,\n page: number,\n size: number\n }\n}\n\nexport interface CashCheckResponse {\n state: PaymentScheduleItemState,\n payment_method: PaymentMethod\n}\n\nexport interface RefreshItemResponse {\n state: 'refreshed'\n}\n\nexport interface PayItemResponse {\n status: 'draft' | 'open' | 'paid' | 'uncollectible' | 'void',\n error?: string\n}\n\nexport interface CancelScheduleResponse {\n canceled_at: Date\n}\n","/**\n * This component shows a list of all payment schedules with their associated deadlines (aka. PaymentScheduleItem) and invoices\n */\n\nimport React, { ReactEventHandler, ReactNode, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Loader } from './loader';\nimport moment from 'moment';\nimport { IFablab } from '../models/fablab';\nimport _ from 'lodash';\nimport { PaymentSchedule, PaymentScheduleItem, PaymentScheduleItemState } from '../models/payment-schedule';\nimport { FabButton } from './fab-button';\nimport { FabModal } from './fab-modal';\nimport PaymentScheduleAPI from '../api/payment-schedule';\nimport { StripeElements } from './stripe-elements';\nimport { StripeConfirm } from './stripe-confirm';\nimport stripeLogo from '../../../images/powered_by_stripe.png';\nimport mastercardLogo from '../../../images/mastercard.png';\nimport visaLogo from '../../../images/visa.png';\nimport { StripeCardUpdate } from './stripe-card-update';\nimport { User, UserRole } from '../models/user';\n\ndeclare var Fablab: IFablab;\n\ninterface PaymentSchedulesTableProps {\n paymentSchedules: Array,\n showCustomer?: boolean,\n refreshList: (onError: (msg: any) => void) => void,\n operator: User,\n}\n\nconst PaymentSchedulesTableComponent: React.FC = ({ paymentSchedules, showCustomer, refreshList, operator }) => {\n const { t } = useTranslation('shared');\n\n const [showExpanded, setShowExpanded] = useState>(new Map());\n const [showConfirmCashing, setShowConfirmCashing] = useState(false);\n const [showResolveAction, setShowResolveAction] = useState(false);\n const [isConfirmActionDisabled, setConfirmActionDisabled] = useState(true);\n const [showUpdateCard, setShowUpdateCard] = useState(false);\n const [tempDeadline, setTempDeadline] = useState(null);\n const [tempSchedule, setTempSchedule] = useState(null);\n const [canSubmitUpdateCard, setCanSubmitUpdateCard] = useState(true);\n const [errors, setErrors] = useState(null);\n const [showCancelSubscription, setShowCancelSubscription] = useState(false);\n\n /**\n * Check if the requested payment schedule is displayed with its deadlines (PaymentScheduleItem) or without them\n */\n const isExpanded = (paymentScheduleId: number): boolean => {\n return showExpanded.get(paymentScheduleId);\n }\n\n /**\n * Return the formatted localized date for the given date\n */\n const formatDate = (date: Date): string => {\n return Intl.DateTimeFormat().format(moment(date).toDate());\n }\n /**\n * Return the formatted localized amount for the given price (eg. 20.5 => \"20,50 €\")\n */\n const formatPrice = (price: number): string => {\n return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(price);\n }\n\n /**\n * Return the value for the CSS property 'display', for the payment schedule deadlines\n */\n const statusDisplay = (paymentScheduleId: number): string => {\n if (isExpanded(paymentScheduleId)) {\n return 'table-row'\n } else {\n return 'none';\n }\n }\n\n /**\n * Return the action icon for showing/hiding the deadlines\n */\n const expandCollapseIcon = (paymentScheduleId: number): JSX.Element => {\n if (isExpanded(paymentScheduleId)) {\n return ;\n } else {\n return \n }\n }\n\n /**\n * Show or hide the deadlines for the provided payment schedule, inverting their current status\n */\n const togglePaymentScheduleDetails = (paymentScheduleId: number): ReactEventHandler => {\n return (): void => {\n if (isExpanded(paymentScheduleId)) {\n setShowExpanded((prev) => new Map(prev).set(paymentScheduleId, false));\n } else {\n setShowExpanded((prev) => new Map(prev).set(paymentScheduleId, true));\n }\n }\n }\n\n /**\n * For use with downloadButton()\n */\n enum TargetType {\n Invoice = 'invoices',\n PaymentSchedule = 'payment_schedules'\n }\n\n /**\n * Return a button to download a PDF file, may be an invoice, or a payment schedule, depending or the provided parameters\n */\n const downloadButton = (target: TargetType, id: number): JSX.Element => {\n const link = `api/${target}/${id}/download`;\n return (\n \n \n {t('app.shared.schedules_table.download')}\n \n );\n }\n\n /**\n * Return the human-readable string for the status of the provided deadline.\n */\n const formatState = (item: PaymentScheduleItem): JSX.Element => {\n let res = t(`app.shared.schedules_table.state_${item.state}`);\n if (item.state === PaymentScheduleItemState.Paid) {\n const key = `app.shared.schedules_table.method_${item.payment_method}`\n res += ` (${t(key)})`;\n }\n return {res};\n }\n\n /**\n * Check if the current operator has administrative rights or is a normal member\n */\n const isPrivileged = (): boolean => {\n return (operator.role === UserRole.Admin || operator.role == UserRole.Manager);\n }\n\n /**\n * Return the action button(s) for the given deadline\n */\n const itemButtons = (item: PaymentScheduleItem, schedule: PaymentSchedule): JSX.Element => {\n switch (item.state) {\n case PaymentScheduleItemState.Paid:\n return downloadButton(TargetType.Invoice, item.invoice_id);\n case PaymentScheduleItemState.Pending:\n if (isPrivileged()) {\n return (\n }>\n {t('app.shared.schedules_table.confirm_payment')}\n \n );\n } else {\n return {t('app.shared.schedules_table.please_ask_reception')}\n }\n case PaymentScheduleItemState.RequireAction:\n return (\n }>\n {t('app.shared.schedules_table.solve')}\n \n );\n case PaymentScheduleItemState.RequirePaymentMethod:\n return (\n }>\n {t('app.shared.schedules_table.update_card')}\n \n );\n case PaymentScheduleItemState.Error:\n if (isPrivileged()) {\n return (\n }>\n {t('app.shared.schedules_table.cancel_subscription')}\n \n )\n } else {\n return {t('app.shared.schedules_table.please_ask_reception')}\n }\n default:\n return \n }\n }\n\n /**\n * Callback triggered when the user's clicks on the \"cash check\" button: show a confirmation modal\n */\n const handleConfirmCheckPayment = (item: PaymentScheduleItem): ReactEventHandler => {\n return (): void => {\n setTempDeadline(item);\n toggleConfirmCashingModal();\n }\n }\n\n /**\n * After the user has confirmed that he wants to cash the check, update the API, refresh the list and close the modal.\n */\n const onCheckCashingConfirmed = (): void => {\n const api = new PaymentScheduleAPI();\n api.cashCheck(tempDeadline.id).then((res) => {\n if (res.state === PaymentScheduleItemState.Paid) {\n refreshSchedulesTable();\n toggleConfirmCashingModal();\n }\n });\n }\n\n /**\n * Refresh all payment schedules in the table\n */\n const refreshSchedulesTable = (): void => {\n refreshList(setErrors);\n }\n\n /**\n * Show/hide the modal dialog that enable to confirm the cashing of the check for a given deadline.\n */\n const toggleConfirmCashingModal = (): void => {\n setShowConfirmCashing(!showConfirmCashing);\n }\n\n /**\n * Show/hide the modal dialog that trigger the card \"action\".\n */\n const toggleResolveActionModal = (): void => {\n setShowResolveAction(!showResolveAction);\n }\n\n /**\n * Callback triggered when the user's clicks on the \"resolve\" button: show a modal that will trigger the action\n */\n const handleSolveAction = (item: PaymentScheduleItem): ReactEventHandler => {\n return (): void => {\n setTempDeadline(item);\n toggleResolveActionModal();\n }\n }\n\n /**\n * After the action was done (successfully or not), ask the API to refresh the item status, then refresh the list and close the modal\n */\n const afterAction = (): void => {\n toggleConfirmActionButton();\n const api = new PaymentScheduleAPI();\n api.refreshItem(tempDeadline.id).then(() => {\n refreshSchedulesTable();\n toggleResolveActionModal();\n });\n }\n\n /**\n * Enable/disable the confirm button of the \"action\" modal\n */\n const toggleConfirmActionButton = (): void => {\n setConfirmActionDisabled(!isConfirmActionDisabled);\n }\n\n /**\n * Callback triggered when the user's clicks on the \"update card\" button: show a modal to input a new card\n */\n const handleUpdateCard = (item: PaymentScheduleItem, paymentSchedule: PaymentSchedule): ReactEventHandler => {\n return (): void => {\n setTempDeadline(item);\n setTempSchedule(paymentSchedule);\n toggleUpdateCardModal();\n }\n }\n\n /**\n * Show/hide the modal dialog to update the bank card details\n */\n const toggleUpdateCardModal = (): void => {\n setShowUpdateCard(!showUpdateCard);\n }\n\n /**\n * Return the logos, shown in the modal footer.\n */\n const logoFooter = (): ReactNode => {\n return (\n
\n \n \"powered\n \"mastercard\"\n \"visa\"\n
\n );\n }\n\n /**\n * When the submit button is pushed, disable it to prevent double form submission\n */\n const handleCardUpdateSubmit = (): void => {\n setCanSubmitUpdateCard(false);\n }\n\n /**\n * When the card was successfully updated, pay the invoice (using the new payment method) and close the modal\n */\n const handleCardUpdateSuccess = (): void => {\n const api = new PaymentScheduleAPI();\n api.payItem(tempDeadline.id).then(() => {\n refreshSchedulesTable();\n toggleUpdateCardModal();\n }).catch((err) => {\n handleCardUpdateError(err);\n });\n }\n\n /**\n * When the card was not updated, show the error\n */\n const handleCardUpdateError = (error): void => {\n setErrors(error);\n setCanSubmitUpdateCard(true);\n }\n\n /**\n * Callback triggered when the user clicks on the \"cancel subscription\" button\n */\n const handleCancelSubscription = (schedule: PaymentSchedule): ReactEventHandler => {\n return (): void => {\n setTempSchedule(schedule);\n toggleCancelSubscriptionModal();\n }\n }\n\n /**\n * Show/hide the modal dialog to cancel the current subscription\n */\n const toggleCancelSubscriptionModal = (): void => {\n setShowCancelSubscription(!showCancelSubscription);\n }\n\n /**\n * When the user has confirmed the cancellation, we transfer the request to the API\n */\n const onCancelSubscriptionConfirmed = (): void => {\n const api = new PaymentScheduleAPI();\n api.cancel(tempSchedule.id).then(() => {\n refreshSchedulesTable();\n toggleCancelSubscriptionModal();\n });\n }\n\n return (\n
\n \n \n \n \n \n \n {showCustomer && }\n \n \n \n {paymentSchedules.map(p => \n \n )}\n \n
\n {t('app.shared.schedules_table.schedule_num')}{t('app.shared.schedules_table.date')}{t('app.shared.schedules_table.price')}{t('app.shared.schedules_table.customer')}\n
\n \n \n \n \n \n \n \n {showCustomer && }\n \n \n \n \n \n \n
{expandCollapseIcon(p.id)}{p.reference}{formatDate(p.created_at)}{formatPrice(p.total)}{p.user.name}{downloadButton(TargetType.PaymentSchedule, p.id)}
\n \n
\n \n \n \n \n \n \n \n \n \n {_.orderBy(p.items, 'due_date').map(item => \n \n \n \n \n )}\n \n
{t('app.shared.schedules_table.deadline')}{t('app.shared.schedules_table.amount')}{t('app.shared.schedules_table.state')}\n
{formatDate(item.due_date)}{formatPrice(item.amount)}{formatState(item)}{itemButtons(item, p)}
\n
\n
\n
\n
\n \n {tempDeadline && \n {t('app.shared.schedules_table.confirm_check_cashing_body', {\n AMOUNT: formatPrice(tempDeadline.amount),\n DATE: formatDate(tempDeadline.due_date)\n })}\n }\n \n \n {t('app.shared.schedules_table.confirm_cancel_subscription')}\n \n \n \n {tempDeadline && }\n \n \n {tempDeadline && tempSchedule && \n {errors &&
\n {errors}\n
}\n
}\n
\n {canSubmitUpdateCard && }\n {!canSubmitUpdateCard &&
\n
\n \n
\n
}\n
\n
\n
\n
\n
\n );\n};\nPaymentSchedulesTableComponent.defaultProps = { showCustomer: false };\n\n\nexport const PaymentSchedulesTable: React.FC = ({ paymentSchedules, showCustomer, refreshList, operator }) => {\n return (\n \n \n \n );\n}\n","/**\n * This component shows input field with its label, styled\n */\n\nimport React from 'react';\n\ninterface LabelledInputProps {\n id: string,\n type: string,\n label: string,\n value: any,\n onChange: (value: any) => void\n}\n\nexport const LabelledInput: React.FC = ({ id, type, label, value, onChange }) => {\n return (\n
\n \n \n
\n );\n}\n","/**\n * This function wraps a Promise to make it compatible with react Suspense\n */\nexport interface IWrapPromise {\n read: () => T\n}\n\nfunction wrapPromise(promise: Promise): IWrapPromise {\n let status: string = 'pending';\n let response: any;\n\n const suspender: Promise = promise.then(\n (res) => {\n status = 'success'\n response = res\n },\n (err) => {\n status = 'error'\n response = err\n },\n );\n\n const read = (): any => {\n switch (status) {\n case 'pending':\n throw suspender\n case 'error':\n throw response\n default:\n return response\n }\n };\n\n return { read };\n}\n\nexport default wrapPromise;\n","import i18n from 'i18next';\nimport ICU from 'i18next-icu';\nimport HttpApi from 'i18next-http-backend';\nimport { initReactI18next } from 'react-i18next';\n\ndeclare var Fablab: any;\n\ni18n\n .use(ICU)\n .use(HttpApi)\n .use(initReactI18next)\n .init({\n lng: Fablab.locale,\n fallbackLng: 'en',\n ns: ['admin', 'logged', 'public', 'shared'],\n defaultNS: 'shared',\n backend: {\n loadPath: '/api/translations/{{lng}}/app.{{ns}}'\n },\n interpolation: {\n escapeValue: false\n }\n });\n\nexport default i18n;\n","module.exports = __webpack_public_path__ + \"media/images/arrow-left-6cfe3d9e2c18a348cde19e3fc775c5d8.png\";","module.exports = __webpack_public_path__ + \"media/images/no_avatar-5997afd4951fd3ce4e624a2d09d0ca8a.png\";","// Module\nvar code = \"

{{ 'app.admin.manage_abuses.abuses_list' }}

{{ 'app.admin.manage_abuses.no_reports' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/abuses/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.members.authentication_form.name' }} {{ 'app.admin.members.authentication_form.strategy_name' }} {{ 'app.admin.members.authentication_form.type' }} {{ 'app.admin.members.authentication_form.state' }}
{{ provider.name }} {{ provider.strategy_name }} {{ getType(provider.providable_type) }} {{ getState(provider.status) }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/authentications/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.events.fablab_events' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/events/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.members.group_form.group_name' }}
{{group.name}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/groups/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.members.users_management' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.pricing.pricing_management' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/pricing/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.projects.projects_settings' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/projects/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.settings.customize_the_application' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.statistics.statistics' }}

  • {{ 'app.admin.statistics.start' }}
  • {{ 'app.admin.statistics.end' }}
  • {{ 'app.admin.statistics.criterion' }}
  • {{ 'app.admin.statistics.value' }}
  • {{ 'app.admin.statistics.start' }}
  • {{ 'app.admin.statistics.end' }}
  • {{ 'app.admin.statistics.entries' | translate }} {{totalHits}}
  • {{ 'app.admin.statistics.revenue_' | translate }} {{sumCA | currency}}
  • {{ 'app.admin.statistics.average_age' | translate }} {{averageAge}} {{ 'app.admin.statistics.years_old' | translate }}
  • {{ 'app.admin.statistics.total' | translate }} {{type.active.label}} : {{sumStat}}
  • {{ customFieldName(custom.field) }} {{customAggs[custom.field]}}
{{ 'app.admin.statistics.create_plans_to_start' }} {{ 'app.admin.statistics.click_here' }}
{{ 'app.admin.statistics.date' }} {{ 'app.admin.statistics.user' }} {{ 'app.admin.statistics.gender' }} {{ 'app.admin.statistics.age' }} {{ 'app.admin.statistics.type' }} {{type.active.label}} {{field.label}} {{ 'app.admin.statistics.revenue' | translate }}
{{formatDate(datum._source.date)}} {{getUserNameFromId(datum._source.userId)}} {{ 'app.admin.statistics.deleted_user' }} {{formatSex(datum._source.gender)}} {{datum._source.age}} {{ 'app.admin.statistics.years_old' | translate }} {{ 'app.admin.statistics.unknown' }} {{formatSubtype(datum._source.subType)}} {{datum._source.stat}} {{formatDate(datum._source[field.key])}}
  • {{elem.name}}
{{datum._source[field.key]}}
{{datum._source.ca | currency}}{{ 'app.admin.statistics.unknown' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/statistics/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.members.tag_form.tag_name' }}
{{tag.name}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/tags/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.trainings.trainings_monitoring' }}

{{ 'app.admin.trainings.name' }} {{ 'app.admin.trainings.associated_machines' }} {{ 'app.admin.trainings.number_of_tickets' }}
{{ training.name }} {{ showMachines(training) }} {{ training.nb_total_places }}
{{ 'app.admin.trainings.training' }} {{ 'app.admin.trainings.date' }}
{{training_name}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/trainings/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.public.events_list.the_fablab_s_events' }}

0\\\">
0\\\">
0\\\">
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/events/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.public.machines_list.the_fablab_s_machines' }}

{{machine.name}}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/machines/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.logged.members.the_fablab_members' }}

{{ 'app.logged.members.avatar' }} {{ 'app.logged.members.user' }} {{ 'app.logged.members.pseudonym' }} {{ 'app.logged.members.email_address' }}
{{ member.name }} {{ member.username }} {{ member.email }}

{{ 'app.logged.members.no_members_for_now' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/members/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.logged.notifications.notifications_center' }}

0\\\">
{{ 'app.logged.notifications.date' }} {{ 'app.logged.notifications.notif_title' }}
{{ notification.created_at | amDateFormat:'LLL' }}
{{ 'app.logged.notifications.no_new_notifications' }}
{{ 'app.logged.notifications.archives' }}
0\\\">
{{ n.created_at | amDateFormat:'LLL' }}
{{ 'app.logged.notifications.no_archived_notifications' }}
{{ 'app.logged.notifications.load_the_next_notifications' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/notifications/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n

{{ 'app.public.plans.subscriptions' }}

\\n
\\n
\\n
\\n
\\n\\n\\n
\\n
\\n\\n
\\n\\n
0\\\">\\n
\\n

{{plansGroup.name}}

\\n
\\n
\\n
\\n\\n \\n
\\n\\n\\n
\\n \\n {{ 'app.public.plans.your_subscription_expires_on_the_DATE' | translate:{DATE:(ctrl.member.subscription.expired_at | amDateFormat:'L' )} }}\\n \\n
\\n\\n
\\n
\\n
\\n {{ 'app.public.plans.no_plans' }}\\n
\\n\\n
\\n\\n
\\n\\n
\\n\\n
\\n \\n
\\n\\n
\\n
\\n

{{ 'app.public.plans.my_group' }}

\\n

{{ 'app.public.plans.his_group' }}

\\n
\\n
\\n
\\n
\\n {{getUserGroup().name}}\\n
\\n \\n
\\n
\\n \\n \\n
\\n
\\n
\\n\\n
\\n
\\n

{{ 'app.public.plans.summary' }}

\\n
\\n\\n
\\n {{ 'app.public.plans.your_subscription_has_expired_on_the_DATE' | translate:{DATE:(ctrl.member.subscription.expired_at | amDateFormat:'LL')} }}\\n\\n
\\n {{ctrl.member.subscription.plan | humanReadablePlanName }}\\n
{{ 'app.public.plans.subscription_price' | translate }} {{ctrl.member.subscription.plan.amount | currency}}
\\n
\\n
\\n
\\n\\n \\n\\n\\n
\\n
\\n

{{ 'app.public.plans.summary' }}

\\n
\\n\\n
\\n {{ 'app.public.plans.you_ve_just_payed_the_subscription_html' }}\\n\\n
\\n {{ paid.plan | humanReadablePlanName }}\\n
{{ 'app.public.plans.subscription_price' | translate }} {{paid.plan.amount | currency}}
\\n
\\n\\n
{{ 'app.public.plans.thank_you_your_subscription_is_successful' | translate }}
\\n {{ 'app.public.plans.your_invoice_will_be_available_soon_from_your_dashboard' }}
\\n\\n
\\n
\\n\\n\\n \\n

\\n \\n

\\n
\\n\\n
\\n
\\n\";\n// Exports\nvar _module_exports = code;;\nvar path = '/plans/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.public.projects_list.the_fablab_projects' }}

{{ 'app.public.projects_list.reset_all_filters' | translate }} {{ searchOverWholeNetwork }}
{{ 'app.public.projects_list.project_search_result_is_empty' | translate }}

{{ project.app_name }}

{{project.name}}

{{ 'app.public.projects_list.rough_draft' }}
{{ 'app.shared.buttons.consult' | translate }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/projects/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.public.spaces_list.the_spaces' }}

{{space.name}}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/spaces/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.public.trainings_list.the_trainings' }}

{{training.name}}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/trainings/index.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","/**\n * This component shows 3 input fields for filtering invoices/payment-schedules by reference, customer name and date\n */\n\nimport React, { useEffect, useState } from 'react';\nimport { LabelledInput } from './labelled-input';\nimport { useTranslation } from 'react-i18next';\n\ninterface DocumentFiltersProps {\n onFilterChange: (value: { reference: string, customer: string, date: Date }) => void\n}\n\nexport const DocumentFilters: React.FC = ({ onFilterChange }) => {\n const { t } = useTranslation('admin');\n\n const [referenceFilter, setReferenceFilter] = useState('');\n const [customerFilter, setCustomerFilter] = useState('');\n const [dateFilter, setDateFilter] = useState(null);\n\n useEffect(() => {\n onFilterChange({ reference: referenceFilter, customer: customerFilter, date: dateFilter });\n }, [referenceFilter, customerFilter, dateFilter])\n\n const handleReferenceUpdate = (e) => {\n setReferenceFilter(e.target.value);\n }\n\n const handleCustomerUpdate = (e) => {\n setCustomerFilter(e.target.value);\n }\n\n const handleDateUpdate = (e) => {\n let date = e.target.value;\n if (e.target.value === '') date = null;\n setDateFilter(date);\n }\n\n return (\n
\n \n \n \n
\n );\n}\n","/**\n * This component renders a translation with some HTML content.\n */\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\ninterface HtmlTranslateProps {\n trKey: string,\n options?: any\n}\n\nexport const HtmlTranslate: React.FC = ({ trKey, options }) => {\n const { t } = useTranslation(trKey?.split('.')[1]);\n\n return (\n \n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { useStripe } from '@stripe/react-stripe-js';\nimport { useTranslation } from 'react-i18next';\n\ninterface StripeConfirmProps {\n clientSecret: string,\n onResponse: () => void,\n}\n\nexport const StripeConfirm: React.FC = ({ clientSecret, onResponse }) => {\n const stripe = useStripe();\n const { t } = useTranslation('shared');\n\n const [message, setMessage] = useState(t('app.shared.stripe_confirm.pending'));\n const [type, setType] = useState('info');\n\n useEffect(() => {\n stripe.confirmCardPayment(clientSecret).then(function(result) {\n onResponse();\n if (result.error) {\n // Display error.message in your UI.\n setType('error');\n setMessage(result.error.message);\n } else {\n // The setup has succeeded. Display a success message.\n setType('success');\n setMessage(t('app.shared.stripe_confirm.success'));\n }\n });\n }, [])\n return
\n
{message}
\n
;\n}\n","import React, { FormEvent } from 'react';\nimport { CardElement, useElements, useStripe } from '@stripe/react-stripe-js';\nimport { SetupIntent } from \"@stripe/stripe-js\";\nimport PaymentAPI from '../api/payment';\nimport { PaymentConfirmation } from '../models/payment';\nimport { User } from '../models/user';\n\ninterface StripeCardUpdateProps {\n onSubmit: () => void,\n onSuccess: (result: SetupIntent|PaymentConfirmation|any) => void,\n onError: (message: string) => void,\n customerId: number,\n operator: User,\n className?: string,\n}\n\n/**\n * A simple form component to collect and update the credit card details, for Stripe.\n *\n * The form validation button must be created elsewhere, using the attribute form=\"stripe-card\".\n */\nexport const StripeCardUpdate: React.FC = ({ onSubmit, onSuccess, onError, className, customerId, operator, children }) => {\n\n const stripe = useStripe();\n const elements = useElements();\n\n /**\n * Handle the submission of the form. Depending on the configuration, it will create the payment method on Stripe,\n * or it will process a payment with the inputted card.\n */\n const handleSubmit = async (event: FormEvent): Promise => {\n event.preventDefault();\n onSubmit();\n\n // Stripe.js has not loaded yet\n if (!stripe || !elements) { return; }\n\n const cardElement = elements.getElement(CardElement);\n const { error, paymentMethod } = await stripe.createPaymentMethod({\n type: 'card',\n card: cardElement,\n });\n\n if (error) {\n // stripe error\n onError(error.message);\n } else {\n try {\n // we start by associating the payment method with the user\n const { client_secret } = await PaymentAPI.setupIntent(customerId);\n const { error } = await stripe.confirmCardSetup(client_secret, {\n payment_method: paymentMethod.id,\n mandate_data: {\n customer_acceptance: {\n type: 'online',\n online: {\n ip_address: operator.ip_address,\n user_agent: navigator.userAgent\n }\n }\n }\n })\n if (error) {\n onError(error.message);\n } else {\n // then we update the default payment method\n const res = await PaymentAPI.updateCard(customerId, paymentMethod.id);\n onSuccess(res);\n }\n } catch (err) {\n // catch api errors\n onError(err);\n }\n }\n }\n\n /**\n * Options for the Stripe's card input\n */\n const cardOptions = {\n style: {\n base: {\n fontSize: '16px',\n color: '#424770',\n '::placeholder': { color: '#aab7c4' }\n },\n invalid: {\n color: '#9e2146',\n iconColor: '#9e2146'\n },\n },\n hidePostalCode: true\n };\n\n return (\n
\n \n {children}\n \n );\n}\n","import React, { FormEvent } from 'react';\nimport { CardElement, useElements, useStripe } from '@stripe/react-stripe-js';\nimport { SetupIntent } from \"@stripe/stripe-js\";\nimport PaymentAPI from '../api/payment';\nimport { CartItems, PaymentConfirmation } from '../models/payment';\nimport { useTranslation } from 'react-i18next';\nimport { User } from '../models/user';\n\ninterface StripeFormProps {\n onSubmit: () => void,\n onSuccess: (result: SetupIntent|PaymentConfirmation|any) => void,\n onError: (message: string) => void,\n customer: User,\n operator: User,\n className?: string,\n paymentSchedule?: boolean,\n cartItems?: CartItems\n}\n\n/**\n * A form component to collect the credit card details and to create the payment method on Stripe.\n * The form validation button must be created elsewhere, using the attribute form=\"stripe-form\".\n */\nexport const StripeForm: React.FC = ({ onSubmit, onSuccess, onError, children, className, paymentSchedule = false, cartItems, customer, operator }) => {\n\n const { t } = useTranslation('shared');\n\n const stripe = useStripe();\n const elements = useElements();\n\n /**\n * Handle the submission of the form. Depending on the configuration, it will create the payment method on Stripe,\n * or it will process a payment with the inputted card.\n */\n const handleSubmit = async (event: FormEvent): Promise => {\n event.preventDefault();\n onSubmit();\n\n // Stripe.js has not loaded yet\n if (!stripe || !elements) { return; }\n\n const cardElement = elements.getElement(CardElement);\n const { error, paymentMethod } = await stripe.createPaymentMethod({\n type: 'card',\n card: cardElement,\n });\n\n if (error) {\n // stripe error\n onError(error.message);\n } else {\n try {\n if (!paymentSchedule) {\n // process the normal payment pipeline, including SCA validation\n const res = await PaymentAPI.confirm(paymentMethod.id, cartItems);\n await handleServerConfirmation(res);\n } else {\n // we start by associating the payment method with the user\n const { client_secret } = await PaymentAPI.setupIntent(customer.id);\n const { setupIntent, error } = await stripe.confirmCardSetup(client_secret, {\n payment_method: paymentMethod.id,\n mandate_data: {\n customer_acceptance: {\n type: 'online',\n online: {\n ip_address: operator.ip_address,\n user_agent: navigator.userAgent\n }\n }\n }\n })\n if (error) {\n onError(error.message);\n } else {\n // then we confirm the payment schedule\n const res = await PaymentAPI.confirmPaymentSchedule(setupIntent.id, cartItems);\n onSuccess(res);\n }\n }\n } catch (err) {\n // catch api errors\n onError(err);\n }\n }\n }\n\n /**\n * Process the server response about the Strong-customer authentication (SCA)\n * @param response can be a PaymentConfirmation, or a Reservation (if the reservation succeeded), or a Subscription (if the subscription succeeded)\n * @see app/controllers/api/payments_controller.rb#on_reservation_success\n * @see app/controllers/api/payments_controller.rb#on_subscription_success\n * @see app/controllers/api/payments_controller.rb#generate_payment_response\n */\n const handleServerConfirmation = async (response: PaymentConfirmation|any) => {\n if (response.error) {\n if (response.error.statusText) {\n onError(response.error.statusText);\n } else {\n onError(`${t('app.shared.messages.payment_card_error')} ${response.error}`);\n }\n } else if (response.requires_action) {\n // Use Stripe.js to handle required card action\n const result = await stripe.handleCardAction(response.payment_intent_client_secret);\n if (result.error) {\n onError(result.error.message);\n } else {\n // The card action has been handled\n // The PaymentIntent can be confirmed again on the server\n try {\n const confirmation = await PaymentAPI.confirm(result.paymentIntent.id, cartItems);\n await handleServerConfirmation(confirmation);\n } catch (e) {\n onError(e);\n }\n }\n } else {\n onSuccess(response);\n }\n }\n\n\n /**\n * Options for the Stripe's card input\n */\n const cardOptions = {\n style: {\n base: {\n fontSize: '16px',\n color: '#424770',\n '::placeholder': { color: '#aab7c4' }\n },\n invalid: {\n color: '#9e2146',\n iconColor: '#9e2146'\n },\n },\n hidePostalCode: true\n };\n\n return (\n
\n \n {children}\n \n );\n}\n","/**\n * This component displays a summary of the amount paid with the virtual wallet, for the current transaction\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { react2angular } from 'react2angular';\nimport { IApplication } from '../models/application';\nimport '../lib/i18n';\nimport { Loader } from './loader';\nimport { User } from '../models/user';\nimport { Wallet } from '../models/wallet';\nimport { IFablab } from '../models/fablab';\nimport WalletLib from '../lib/wallet';\nimport { CartItems } from '../models/payment';\nimport { Reservation } from '../models/reservation';\nimport { SubscriptionRequest } from '../models/subscription';\n\ndeclare var Application: IApplication;\ndeclare var Fablab: IFablab;\n\ninterface WalletInfoProps {\n cartItems: CartItems,\n currentUser: User,\n wallet: Wallet,\n price: number,\n}\n\nexport const WalletInfo: React.FC = ({ cartItems, currentUser, wallet, price }) => {\n const { t } = useTranslation('shared');\n const [remainingPrice, setRemainingPrice] = useState(0);\n\n /**\n * Refresh the remaining price on each display\n */\n useEffect(() => {\n const wLib = new WalletLib(wallet);\n setRemainingPrice(wLib.computeRemainingPrice(price));\n });\n\n /**\n * Return the formatted localized amount for the given price (e.g. 20.5 => \"20,50 €\")\n */\n const formatPrice = (price: number): string => {\n return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(price);\n }\n /**\n * Check if the currently connected used is also the person making the reservation.\n * If the currently connected user (i.e. the operator), is an admin or a manager, he may book the reservation for someone else.\n */\n const isOperatorAndClient = (): boolean => {\n return currentUser.id == buyingItem().user_id;\n }\n /**\n * Return the item currently bought (reservation or subscription)\n */\n const buyingItem = (): Reservation|SubscriptionRequest => {\n return cartItems.reservation || cartItems.subscription;\n }\n /**\n * If the client has some money in his wallet & the price is not zero, then we should display this component.\n */\n const shouldBeShown = (): boolean => {\n return wallet.amount > 0 && price > 0;\n }\n /**\n * If the amount in the wallet is not enough to cover the whole price, then the user must pay the remaining price\n * using another payment mean.\n */\n const hasRemainingPrice = (): boolean => {\n return remainingPrice > 0;\n }\n /**\n * Does the current cart contains a payment schedule?\n */\n const isPaymentSchedule = (): boolean => {\n return buyingItem().plan_id && buyingItem().payment_schedule;\n }\n /**\n * Return the human-readable name of the item currently bought with the wallet\n */\n const getPriceItem = (): string => {\n let item = 'other';\n if (cartItems.reservation) {\n item = 'reservation';\n } else if (cartItems.subscription) {\n if (cartItems.subscription.payment_schedule) {\n item = 'first_deadline';\n } else item = 'subscription';\n }\n\n return t(`app.shared.wallet.wallet_info.item_${item}`);\n }\n\n return (\n
\n {shouldBeShown() &&
\n {isOperatorAndClient() &&
\n

{t('app.shared.wallet.wallet_info.you_have_AMOUNT_in_wallet', {AMOUNT: formatPrice(wallet.amount)})}

\n {!hasRemainingPrice() &&

\n {t('app.shared.wallet.wallet_info.wallet_pay_ITEM', {ITEM: getPriceItem()})}\n

}\n {hasRemainingPrice() &&

\n {t('app.shared.wallet.wallet_info.credit_AMOUNT_for_pay_ITEM', {\n AMOUNT: formatPrice(remainingPrice),\n ITEM: getPriceItem()\n })}\n

}\n
}\n {!isOperatorAndClient() &&
\n

{t('app.shared.wallet.wallet_info.client_have_AMOUNT_in_wallet', {AMOUNT: formatPrice(wallet.amount)})}

\n {!hasRemainingPrice() &&

\n {t('app.shared.wallet.wallet_info.client_wallet_pay_ITEM', {ITEM: getPriceItem()})}\n

}\n {hasRemainingPrice() &&

\n {t('app.shared.wallet.wallet_info.client_credit_AMOUNT_for_pay_ITEM', {\n AMOUNT: formatPrice(remainingPrice),\n ITEM: getPriceItem()\n })}\n

}\n
}\n {!hasRemainingPrice() && isPaymentSchedule() &&

\n \n {t('app.shared.wallet.wallet_info.other_deadlines_no_wallet')}\n

}\n
}\n
\n );\n}\n\nconst WalletInfoWrapper: React.FC = ({ currentUser, cartItems, price, wallet }) => {\n return (\n \n \n \n );\n}\n\nApplication.Components.component('walletInfo', react2angular(WalletInfoWrapper, ['currentUser', 'price', 'cartItems', 'wallet']));\n","import apiClient from './api-client';\nimport { AxiosResponse } from 'axios';\nimport { CustomAsset, CustomAssetName } from '../models/custom-asset';\nimport wrapPromise, { IWrapPromise } from '../lib/wrap-promise';\n\nexport default class CustomAssetAPI {\n async get (name: CustomAssetName): Promise {\n const res: AxiosResponse = await apiClient.get(`/api/custom_assets/${name}`);\n return res?.data?.custom_asset;\n }\n\n static get (name: CustomAssetName): IWrapPromise {\n const api = new CustomAssetAPI();\n return wrapPromise(api.get(name));\n }\n}\n\n","export enum CustomAssetName {\n LogoFile = 'logo-file',\n LogoBlackFile = 'logo-black-file',\n CguFile = 'cgu-file',\n CgvFile = 'cgv-file',\n ProfileImageFile = 'profile-image-file',\n FaviconFile = 'favicon-file'\n}\n\nexport interface CustomAsset {\n id: number,\n name: CustomAssetName,\n custom_asset_file_attributes: {\n id: number,\n attachment: string\n attachment_url: string\n }\n}\n","import { Wallet } from '../models/wallet';\n\nexport default class WalletLib {\n private wallet: Wallet;\n\n constructor (wallet: Wallet) {\n this.wallet = wallet;\n }\n\n /**\n * Return the price remaining to pay, after we have used the maximum possible amount in the wallet\n */\n computeRemainingPrice = (price: number): number => {\n if (this.wallet.amount > price) {\n return 0;\n } else {\n return price - this.wallet.amount;\n }\n }\n}\n","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.public.common.create_your_account' }}

{{alert.msg}}
{{ 'app.public.common.gender_is_required'}}
{{ 'app.public.common.first_name_is_required' }}
{{ 'app.public.common.surname_is_required' }}
{{ 'app.public.common.pseudonym_is_required' }}
{{ 'app.public.common.email_is_required' }}
{{ 'app.public.common.password_is_required' }} {{ 'app.public.common.password_is_too_short' }}
{{ 'app.public.common.password_confirmation_is_required' }} {{ 'app.public.common.password_does_not_match_with_confirmation' }}
{{ 'app.public.common.organization_name_is_required' }}
{{ 'app.public.common.organization_address_is_required' }}
{{ 'app.public.common.user_s_profile_is_required' }}
{{ 'app.public.common.birth_date_is_required' }}
{{ 'app.public.common.phone_number_is_required' }}
{{ 'app.public.common.address_is_required' }}
{{ 'app.public.common.field_required' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/signupModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.public.common.change_your_password' }}

{{alert.msg}}
{{ 'app.public.common.password_is_required' }} {{ 'app.public.common.password_is_too_short' }}
{{ 'app.public.common.password_confirmation_is_required' }} {{ 'app.public.common.password_does_not_match_with_confirmation' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/passwordEditModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.public.common.upgrade_fabmanager' }}

{{ 'app.public.common.security_version_html' }}

{{ 'app.public.common.current_version' }}

{{ 'app.public.common.upgrade_to' }}

{{ 'app.public.common.read_more' }}

{{ 'app.public.common.how_to' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/versions/upgradeModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.public.common.connection' }}

{{alert.msg}}

{{ 'app.public.common.not_registered_to_the_fablab' }}
{{ 'app.public.common.create_an_account' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/deviseModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.public.common.password_forgotten' }}

{{alert.msg}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/passwordNewModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.public.common.confirm_my_account' }}

{{alert.msg}}

{{ 'app.public.common.you_will_receive_confirmation_instructions_by_email' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/ConfirmationNewModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.public.events_show.confirmation_required' }}

{{ 'app.public.events_show.do_you_really_want_to_delete_this_event' }}

{{ 'app.public.events_show.delete_recurring_event' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/events/deleteRecurrent.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.public.events_show.change_the_reservation' }}

{{ 'app.public.events_show.you_can_shift_this_reservation_on_the_following_slots' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/events/modify_event_reservation_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Imports\nvar ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___ = require(\"../../../../node_modules/html-loader/dist/runtime/getUrl.js\");\nvar ___HTML_LOADER_IMPORT_0___ = require(\"../../images/powered_by_stripe.png\");\nvar ___HTML_LOADER_IMPORT_1___ = require(\"../../images/mastercard.png\");\nvar ___HTML_LOADER_IMPORT_2___ = require(\"../../images/visa.png\");\n// Module\nvar ___HTML_LOADER_REPLACEMENT_0___ = ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___(___HTML_LOADER_IMPORT_0___);\nvar ___HTML_LOADER_REPLACEMENT_1___ = ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___(___HTML_LOADER_IMPORT_1___);\nvar ___HTML_LOADER_REPLACEMENT_2___ = ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___(___HTML_LOADER_IMPORT_2___);\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.shared.stripe.online_payment' }}

{{alert.msg}}

{{ 'app.shared.stripe.payment_schedule' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/stripe/payment_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

0\\\">{{ 'app.shared.valid_reservation_modal.booking_confirmation' }}

{{ 'app.shared.valid_reservation_modal.subscription_confirmation' }}

{{alert.msg}}
0\\\">

{{ 'app.shared.valid_reservation_modal.here_is_the_summary_of_the_slots_to_book_for_the_current_user' }}

  • {{slot.start_at | amDateFormat: 'LL'}} : {{slot.start_at | amDateFormat:'LT'}} - {{slot.end_at | amDateFormat:'LT'}}

{{ 'app.shared.valid_reservation_modal.here_is_the_subscription_summary' }}

{{ plan | humanReadablePlanName }}

{{ 'app.shared.valid_reservation_modal.stripe_collection_info' }}

{{ 'app.shared.valid_reservation_modal.check_collection_info' }}

  • {{item.due_date | amDateFormat: 'L'}} {{item.amount | currency}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/valid_reservation_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.shared.cart.slot_at_same_time' }}

{{ 'app.shared.cart.do_you_really_want_to_book_slot_at_same_time' }}

{{ 'app.shared.cart.unable_to_book_slot_because_really_have_reservation_at_same_time' }}

  • {{::r.reservable.name}}{{::r.reservable.title}}
    {{ 'app.shared.cart.datetime_to_time' | translate:{START_DATETIME:(r.start_at | amDateFormat:'LLLL'), END_TIME:(r.end_at | amDateFormat:'LT') } }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_reserve_slot_same_time.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.shared.training_reservation_modal.machine_reservation' }}

{{ 'app.shared.training_reservation_modal.you_must_wait_for_your_training_is_being_validated_by_the_fablab_team_to_book_this_machine' }}

{{ 'app.shared.training_reservation_modal.your_training_will_occur_' | translate }} {{machine.current_user_training_reservation.slots[0].start_at | amDateFormat: 'LL'}} : {{machine.current_user_training_reservation.slots[0].start_at | amDateFormat:'LT'}} - {{machine.current_user_training_reservation.slots[0].end_at | amDateFormat:'LT'}}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/machines/training_reservation_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"
{{member.name}}

{{ 'app.shared.request_training_modal.to_book_the_MACHINE_you_must_have_completed_the_TRAINING' }}

{{ 'app.shared.request_training_modal.i_dont_want_to_register_now' | translate }}
{{ 'app.shared.buttons.close' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/machines/request_training_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","module.exports = __webpack_public_path__ + \"media/images/social/dailymotion-a6cfb9ecfa917eaf4a421cae72178aee.png\";","module.exports = __webpack_public_path__ + \"media/images/social/echosciences-61a0f9c30e48bb1b30ff2f495bf6234e.png\";","(function() {\n var Humanize, isArray, isFinite, isNaN, objectRef, timeFormats, toString;\n\n objectRef = new function() {};\n\n toString = objectRef.toString;\n\n isNaN = function(value) {\n return value !== value;\n };\n\n isFinite = function(value) {\n return ((typeof window !== \"undefined\" && window !== null ? window.isFinite : void 0) || global.isFinite)(value) && !isNaN(parseFloat(value));\n };\n\n isArray = function(value) {\n return toString.call(value) === '[object Array]';\n };\n\n timeFormats = [\n {\n name: 'second',\n value: 1e3\n }, {\n name: 'minute',\n value: 6e4\n }, {\n name: 'hour',\n value: 36e5\n }, {\n name: 'day',\n value: 864e5\n }, {\n name: 'week',\n value: 6048e5\n }\n ];\n\n Humanize = {};\n\n Humanize.intword = function(number, charWidth, decimals) {\n if (decimals == null) {\n decimals = 2;\n }\n /*\n # This method is deprecated. Please use compactInteger instead.\n # intword will be going away in the next major version.\n */\n\n return Humanize.compactInteger(number, decimals);\n };\n\n Humanize.compactInteger = function(input, decimals) {\n var bigNumPrefixes, decimalIndex, decimalPart, decimalPartArray, length, number, numberLength, numberLengths, output, outputNumber, signString, unsignedNumber, unsignedNumberCharacterArray, unsignedNumberString, wholePart, wholePartArray, _i, _len, _length;\n if (decimals == null) {\n decimals = 0;\n }\n decimals = Math.max(decimals, 0);\n number = parseInt(input, 10);\n signString = number < 0 ? \"-\" : \"\";\n unsignedNumber = Math.abs(number);\n unsignedNumberString = \"\" + unsignedNumber;\n numberLength = unsignedNumberString.length;\n numberLengths = [13, 10, 7, 4];\n bigNumPrefixes = ['T', 'B', 'M', 'k'];\n if (unsignedNumber < 1000) {\n if (decimals > 0) {\n unsignedNumberString += \".\" + (Array(decimals + 1).join('0'));\n }\n return \"\" + signString + unsignedNumberString;\n }\n if (numberLength > numberLengths[0] + 3) {\n return number.toExponential(decimals).replace('e+', 'x10^');\n }\n for (_i = 0, _len = numberLengths.length; _i < _len; _i++) {\n _length = numberLengths[_i];\n if (numberLength >= _length) {\n length = _length;\n break;\n }\n }\n decimalIndex = numberLength - length + 1;\n unsignedNumberCharacterArray = unsignedNumberString.split(\"\");\n wholePartArray = unsignedNumberCharacterArray.slice(0, decimalIndex);\n decimalPartArray = unsignedNumberCharacterArray.slice(decimalIndex, decimalIndex + decimals + 1);\n wholePart = wholePartArray.join(\"\");\n decimalPart = decimalPartArray.join(\"\");\n if (decimalPart.length < decimals) {\n decimalPart += \"\" + (Array(decimals - decimalPart.length + 1).join('0'));\n }\n if (decimals === 0) {\n output = \"\" + signString + wholePart + bigNumPrefixes[numberLengths.indexOf(length)];\n } else {\n outputNumber = (+(\"\" + wholePart + \".\" + decimalPart)).toFixed(decimals);\n output = \"\" + signString + outputNumber + bigNumPrefixes[numberLengths.indexOf(length)];\n }\n return output;\n };\n\n Humanize.intcomma = Humanize.intComma = function(number, decimals) {\n if (decimals == null) {\n decimals = 0;\n }\n return Humanize.formatNumber(number, decimals);\n };\n\n Humanize.filesize = Humanize.fileSize = function(filesize) {\n var sizeStr;\n if (filesize >= 1073741824) {\n sizeStr = Humanize.formatNumber(filesize / 1073741824, 2, \"\") + \" GB\";\n } else if (filesize >= 1048576) {\n sizeStr = Humanize.formatNumber(filesize / 1048576, 2, \"\") + \" MB\";\n } else if (filesize >= 1024) {\n sizeStr = Humanize.formatNumber(filesize / 1024, 0) + \" KB\";\n } else {\n sizeStr = Humanize.formatNumber(filesize, 0) + Humanize.pluralize(filesize, \" byte\");\n }\n return sizeStr;\n };\n\n Humanize.formatNumber = function(number, precision, thousand, decimal) {\n var base, commas, decimals, firstComma, mod, negative, usePrecision,\n _this = this;\n if (precision == null) {\n precision = 0;\n }\n if (thousand == null) {\n thousand = \",\";\n }\n if (decimal == null) {\n decimal = \".\";\n }\n firstComma = function(number, thousand, position) {\n if (position) {\n return number.substr(0, position) + thousand;\n } else {\n return \"\";\n }\n };\n commas = function(number, thousand, position) {\n return number.substr(position).replace(/(\\d{3})(?=\\d)/g, \"$1\" + thousand);\n };\n decimals = function(number, decimal, usePrecision) {\n if (usePrecision) {\n return decimal + Humanize.toFixed(Math.abs(number), usePrecision).split(\".\")[1];\n } else {\n return \"\";\n }\n };\n usePrecision = Humanize.normalizePrecision(precision);\n negative = number < 0 && \"-\" || \"\";\n base = parseInt(Humanize.toFixed(Math.abs(number || 0), usePrecision), 10) + \"\";\n mod = base.length > 3 ? base.length % 3 : 0;\n return negative + firstComma(base, thousand, mod) + commas(base, thousand, mod) + decimals(number, decimal, usePrecision);\n };\n\n Humanize.toFixed = function(value, precision) {\n var power;\n if (precision == null) {\n precision = Humanize.normalizePrecision(precision, 0);\n }\n power = Math.pow(10, precision);\n return (Math.round(value * power) / power).toFixed(precision);\n };\n\n Humanize.normalizePrecision = function(value, base) {\n value = Math.round(Math.abs(value));\n if (isNaN(value)) {\n return base;\n } else {\n return value;\n }\n };\n\n Humanize.ordinal = function(value) {\n var end, leastSignificant, number, specialCase;\n number = parseInt(value, 10);\n if (number === 0) {\n return value;\n }\n specialCase = number % 100;\n if (specialCase === 11 || specialCase === 12 || specialCase === 13) {\n return \"\" + number + \"th\";\n }\n leastSignificant = number % 10;\n switch (leastSignificant) {\n case 1:\n end = \"st\";\n break;\n case 2:\n end = \"nd\";\n break;\n case 3:\n end = \"rd\";\n break;\n default:\n end = \"th\";\n }\n return \"\" + number + end;\n };\n\n Humanize.times = function(value, overrides) {\n var number, smallTimes, _ref;\n if (overrides == null) {\n overrides = {};\n }\n if (isFinite(value) && value >= 0) {\n number = parseFloat(value);\n smallTimes = ['never', 'once', 'twice'];\n if (overrides[number] != null) {\n return \"\" + overrides[number];\n } else {\n return \"\" + (((_ref = smallTimes[number]) != null ? _ref.toString() : void 0) || number.toString() + ' times');\n }\n }\n };\n\n Humanize.pluralize = function(number, singular, plural) {\n if (!((number != null) && (singular != null))) {\n return;\n }\n if (plural == null) {\n plural = singular + \"s\";\n }\n if (parseInt(number, 10) === 1) {\n return singular;\n } else {\n return plural;\n }\n };\n\n Humanize.truncate = function(str, length, ending) {\n if (length == null) {\n length = 100;\n }\n if (ending == null) {\n ending = '...';\n }\n if (str.length > length) {\n return str.substring(0, length - ending.length) + ending;\n } else {\n return str;\n }\n };\n\n Humanize.truncatewords = Humanize.truncateWords = function(string, length) {\n var array, i, result;\n array = string.split(\" \");\n result = \"\";\n i = 0;\n while (i < length) {\n if (array[i] != null) {\n result += \"\" + array[i] + \" \";\n }\n i++;\n }\n if (array.length > length) {\n return result += \"...\";\n }\n };\n\n Humanize.truncatenumber = Humanize.boundedNumber = function(num, bound, ending) {\n var result;\n if (bound == null) {\n bound = 100;\n }\n if (ending == null) {\n ending = \"+\";\n }\n result = null;\n if (isFinite(num) && isFinite(bound)) {\n if (num > bound) {\n result = bound + ending;\n }\n }\n return (result || num).toString();\n };\n\n Humanize.oxford = function(items, limit, limitStr) {\n var extra, limitIndex, numItems;\n numItems = items.length;\n if (numItems < 2) {\n return \"\" + items;\n } else if (numItems === 2) {\n return items.join(' and ');\n } else if ((limit != null) && numItems > limit) {\n extra = numItems - limit;\n limitIndex = limit;\n if (limitStr == null) {\n limitStr = \", and \" + extra + \" \" + (Humanize.pluralize(extra, 'other'));\n }\n } else {\n limitIndex = -1;\n limitStr = \", and \" + items[numItems - 1];\n }\n return items.slice(0, limitIndex).join(', ') + limitStr;\n };\n\n Humanize.dictionary = function(object, joiner, separator) {\n var defs, key, result, val;\n if (joiner == null) {\n joiner = ' is ';\n }\n if (separator == null) {\n separator = ', ';\n }\n result = '';\n if ((object != null) && typeof object === 'object' && Object.prototype.toString.call(object) !== '[object Array]') {\n defs = [];\n for (key in object) {\n val = object[key];\n defs.push(\"\" + key + joiner + val);\n }\n result = defs.join(separator);\n }\n return result;\n };\n\n Humanize.frequency = function(list, verb) {\n var len, str, times;\n if (!isArray(list)) {\n return;\n }\n len = list.length;\n times = Humanize.times(len);\n if (len === 0) {\n str = \"\" + times + \" \" + verb;\n } else {\n str = \"\" + verb + \" \" + times;\n }\n return str;\n };\n\n Humanize.pace = function(value, intervalMs, unit) {\n var f, prefix, rate, relativePace, roundedPace, timeUnit, _i, _len;\n if (unit == null) {\n unit = 'time';\n }\n if (value === 0 || intervalMs === 0) {\n return \"No \" + (Humanize.pluralize(unit));\n }\n prefix = 'Approximately';\n timeUnit = null;\n rate = value / intervalMs;\n for (_i = 0, _len = timeFormats.length; _i < _len; _i++) {\n f = timeFormats[_i];\n relativePace = rate * f.value;\n if (relativePace > 1) {\n timeUnit = f.name;\n break;\n }\n }\n if (!timeUnit) {\n prefix = 'Less than';\n relativePace = 1;\n timeUnit = timeFormats[timeFormats.length - 1].name;\n }\n roundedPace = Math.round(relativePace);\n unit = Humanize.pluralize(roundedPace, unit);\n return \"\" + prefix + \" \" + roundedPace + \" \" + unit + \" per \" + timeUnit;\n };\n\n Humanize.nl2br = function(string, replacement) {\n if (replacement == null) {\n replacement = '
';\n }\n return string.replace(/\\n/g, replacement);\n };\n\n Humanize.br2nl = function(string, replacement) {\n if (replacement == null) {\n replacement = '\\r\\n';\n }\n return string.replace(/\\/g, replacement);\n };\n\n Humanize.capitalize = function(string, downCaseTail) {\n if (downCaseTail == null) {\n downCaseTail = false;\n }\n return \"\" + (string.charAt(0).toUpperCase()) + (downCaseTail ? string.slice(1).toLowerCase() : string.slice(1));\n };\n\n Humanize.capitalizeAll = function(string) {\n return string.replace(/(?:^|\\s)\\S/g, function(a) {\n return a.toUpperCase();\n });\n };\n\n Humanize.titlecase = Humanize.titleCase = function(string) {\n var doTitleCase, internalCaps, smallWords, splitOnHyphensRegex, splitOnWhiteSpaceRegex,\n _this = this;\n smallWords = /\\b(a|an|and|at|but|by|de|en|for|if|in|of|on|or|the|to|via|vs?\\.?)\\b/i;\n internalCaps = /\\S+[A-Z]+\\S*/;\n splitOnWhiteSpaceRegex = /\\s+/;\n splitOnHyphensRegex = /-/;\n doTitleCase = function(_string, hyphenated, firstOrLast) {\n var index, stringArray, titleCasedArray, word, _i, _len;\n if (hyphenated == null) {\n hyphenated = false;\n }\n if (firstOrLast == null) {\n firstOrLast = true;\n }\n titleCasedArray = [];\n stringArray = _string.split(hyphenated ? splitOnHyphensRegex : splitOnWhiteSpaceRegex);\n for (index = _i = 0, _len = stringArray.length; _i < _len; index = ++_i) {\n word = stringArray[index];\n if (word.indexOf('-') !== -1) {\n titleCasedArray.push(doTitleCase(word, true, index === 0 || index === stringArray.length - 1));\n continue;\n }\n if (firstOrLast && (index === 0 || index === stringArray.length - 1)) {\n titleCasedArray.push(internalCaps.test(word) ? word : Humanize.capitalize(word));\n continue;\n }\n if (internalCaps.test(word)) {\n titleCasedArray.push(word);\n } else if (smallWords.test(word)) {\n titleCasedArray.push(word.toLowerCase());\n } else {\n titleCasedArray.push(Humanize.capitalize(word));\n }\n }\n return titleCasedArray.join(hyphenated ? '-' : ' ');\n };\n return doTitleCase(string);\n };\n\n this.Humanize = Humanize;\n\n if (typeof module !== \"undefined\" && module !== null) {\n module.exports = Humanize;\n }\n\n}).call(this);","/**\n * This is a compatibility wrapper to allow usage of react-switch inside of the angular.js app\n */\nimport Switch from 'react-switch';\nimport { react2angular } from 'react2angular';\nimport { IApplication } from '../../models/application';\n\ndeclare var Application: IApplication;\n\nApplication.Components.component('switch', react2angular(Switch, ['checked', 'onChange', 'id', 'className', 'disabled']));\n","/**\n * This component displays a summary of the monthly payment schedule for the current cart, with a subscription\n */\n\nimport React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { react2angular } from 'react2angular';\nimport moment from 'moment';\nimport { IApplication } from '../models/application';\nimport '../lib/i18n';\nimport { PaymentSchedule } from '../models/payment-schedule';\nimport { Loader } from './loader';\nimport { FabModal } from './fab-modal';\nimport { IFablab } from '../models/fablab';\n\ndeclare var Application: IApplication;\ndeclare var Fablab: IFablab;\n\ninterface PaymentScheduleSummaryProps {\n schedule: PaymentSchedule\n}\n\nconst PaymentScheduleSummary: React.FC = ({ schedule }) => {\n const { t } = useTranslation('shared');\n const [modal, setModal] = useState(false);\n\n /**\n * Return the formatted localized date for the given date\n */\n const formatDate = (date: Date): string => {\n return Intl.DateTimeFormat().format(moment(date).toDate());\n }\n /**\n * Return the formatted localized amount for the given price (eg. 20.5 => \"20,50 €\")\n */\n const formatPrice = (price: number): string => {\n return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(price);\n }\n /**\n * Test if all payment deadlines have the same amount\n */\n const hasEqualDeadlines = (): boolean => {\n const prices = schedule.items.map(i => i.amount);\n return prices.every(p => p === prices[0]);\n }\n /**\n * Open or closes the modal dialog showing the full payment schedule\n */\n const toggleFullScheduleModal = (): void => {\n setModal(!modal);\n }\n\n return (\n
\n
\n

{ t('app.shared.cart.your_payment_schedule') }

\n {hasEqualDeadlines() &&
    \n
  • \n \n {t('app.shared.cart.NUMBER_monthly_payment_of_AMOUNT', { NUMBER: schedule.items.length, AMOUNT: formatPrice(schedule.items[0].amount) })}\n \n {t('app.shared.cart.first_debit')}\n
  • \n
}\n {!hasEqualDeadlines() &&
    \n
  • \n {t('app.shared.cart.monthly_payment_NUMBER', { NUMBER: 1 })}\n {formatPrice(schedule.items[0].amount)}\n {t('app.shared.cart.debit')}\n
  • \n
  • \n \n {t('app.shared.cart.NUMBER_monthly_payment_of_AMOUNT', { NUMBER: schedule.items.length - 1, AMOUNT: formatPrice(schedule.items[1].amount) })}\n \n
  • \n
}\n \n \n
    \n {schedule.items.map(item => (\n
  • \n {formatDate(item.due_date)}\n \n {formatPrice(item.amount)}\n
  • \n ))}\n
\n
\n
\n
\n );\n}\nconst PaymentScheduleSummaryWrapper: React.FC = ({ schedule }) => {\n return (\n \n \n \n );\n}\n\nApplication.Components.component('paymentScheduleSummary', react2angular(PaymentScheduleSummaryWrapper, ['schedule']));\n","/**\n * This component shows a list of all payment schedules with their associated deadlines (aka. PaymentScheduleItem) and invoices\n * for the currentUser\n */\n\nimport React, { useEffect, useState } from 'react';\nimport { IApplication } from '../models/application';\nimport { useTranslation } from 'react-i18next';\nimport { Loader } from './loader';\nimport { react2angular } from 'react2angular';\nimport PaymentScheduleAPI from '../api/payment-schedule';\nimport { PaymentSchedulesTable } from './payment-schedules-table';\nimport { FabButton } from './fab-button';\nimport { User } from '../models/user';\nimport { PaymentSchedule } from '../models/payment-schedule';\n\ndeclare var Application: IApplication;\n\ninterface PaymentSchedulesDashboardProps {\n currentUser: User\n}\n\nconst PAGE_SIZE = 20;\n\nconst PaymentSchedulesDashboard: React.FC = ({ currentUser }) => {\n const { t } = useTranslation('logged');\n\n const [paymentSchedules, setPaymentSchedules] = useState>([]);\n const [pageNumber, setPageNumber] = useState(1);\n\n useEffect(() => {\n handleRefreshList();\n }, []);\n\n /**\n * Fetch from the API the next payment schedules to display, for the current filters, and append them to the current results table.\n */\n const handleLoadMore = (): void => {\n setPageNumber(pageNumber + 1);\n\n const api = new PaymentScheduleAPI();\n api.index({ query: { page: pageNumber + 1, size: PAGE_SIZE }}).then((res) => {\n const list = paymentSchedules.concat(res);\n setPaymentSchedules(list);\n });\n }\n\n /**\n * Reload from te API all the currently displayed payment schedules\n */\n const handleRefreshList = (onError?: (msg: any) => void): void => {\n const api = new PaymentScheduleAPI();\n api.index({ query: { page: 1, size: PAGE_SIZE * pageNumber }}).then((res) => {\n setPaymentSchedules(res);\n }).catch((err) => {\n if (typeof onError === 'function') { onError(err.message); }\n });\n }\n\n /**\n * Check if the current collection of payment schedules is empty or not.\n */\n const hasSchedules = (): boolean => {\n return paymentSchedules.length > 0;\n }\n\n /**\n * Check if there are some results for the current filters that aren't currently shown.\n */\n const hasMoreSchedules = (): boolean => {\n return hasSchedules() && paymentSchedules.length < paymentSchedules[0].max_length;\n }\n\n return (\n
\n {!hasSchedules() &&
{t('app.logged.dashboard.payment_schedules.no_payment_schedules')}
}\n {hasSchedules() &&
\n \n {hasMoreSchedules() && {t('app.logged.dashboard.payment_schedules.load_more')}}\n
}\n
\n );\n}\n\n\nconst PaymentSchedulesDashboardWrapper: React.FC = ({ currentUser }) => {\n return (\n \n \n \n );\n}\n\nApplication.Components.component('paymentSchedulesDashboard', react2angular(PaymentSchedulesDashboardWrapper, ['currentUser']));\n","/**\n * This component shows a list of all payment schedules with their associated deadlines (aka. PaymentScheduleItem) and invoices\n */\n\nimport React, { useEffect, useState } from 'react';\nimport { IApplication } from '../models/application';\nimport { useTranslation } from 'react-i18next';\nimport { Loader } from './loader';\nimport { react2angular } from 'react2angular';\nimport PaymentScheduleAPI from '../api/payment-schedule';\nimport { DocumentFilters } from './document-filters';\nimport { PaymentSchedulesTable } from './payment-schedules-table';\nimport { FabButton } from './fab-button';\nimport { User } from '../models/user';\nimport { PaymentSchedule } from '../models/payment-schedule';\n\ndeclare var Application: IApplication;\n\ninterface PaymentSchedulesListProps {\n currentUser: User\n}\n\nconst PAGE_SIZE = 20;\n\nconst PaymentSchedulesList: React.FC = ({ currentUser }) => {\n const { t } = useTranslation('admin');\n\n const [paymentSchedules, setPaymentSchedules] = useState>([]);\n const [pageNumber, setPageNumber] = useState(1);\n const [referenceFilter, setReferenceFilter] = useState(null);\n const [customerFilter, setCustomerFilter] = useState(null);\n const [dateFilter, setDateFilter] = useState(null);\n\n useEffect(() => {\n handleRefreshList();\n }, []);\n\n /**\n * Fetch from the API the payments schedules matching the given filters and reset the results table with the new schedules.\n */\n const handleFiltersChange = ({ reference, customer, date }): void => {\n setReferenceFilter(reference);\n setCustomerFilter(customer);\n setDateFilter(date);\n\n const api = new PaymentScheduleAPI();\n api.list({ query: { reference, customer, date, page: 1, size: PAGE_SIZE }}).then((res) => {\n setPaymentSchedules(res);\n });\n };\n\n /**\n * Fetch from the API the next payment schedules to display, for the current filters, and append them to the current results table.\n */\n const handleLoadMore = (): void => {\n setPageNumber(pageNumber + 1);\n\n const api = new PaymentScheduleAPI();\n api.list({ query: { reference: referenceFilter, customer: customerFilter, date: dateFilter, page: pageNumber + 1, size: PAGE_SIZE }}).then((res) => {\n const list = paymentSchedules.concat(res);\n setPaymentSchedules(list);\n });\n }\n\n /**\n * Reload from te API all the currently displayed payment schedules\n */\n const handleRefreshList = (onError?: (msg: any) => void): void => {\n const api = new PaymentScheduleAPI();\n api.list({ query: { reference: referenceFilter, customer: customerFilter, date: dateFilter, page: 1, size: PAGE_SIZE * pageNumber }}).then((res) => {\n setPaymentSchedules(res);\n }).catch((err) => {\n if (typeof onError === 'function') { onError(err.message); }\n });\n }\n\n /**\n * Check if the current collection of payment schedules is empty or not.\n */\n const hasSchedules = (): boolean => {\n return paymentSchedules.length > 0;\n }\n\n /**\n * Check if there are some results for the current filters that aren't currently shown.\n */\n const hasMoreSchedules = (): boolean => {\n return hasSchedules() && paymentSchedules.length < paymentSchedules[0].max_length;\n }\n\n return (\n
\n

\n \n {t('app.admin.invoices.payment_schedules.filter_schedules')}\n

\n
\n \n
\n {!hasSchedules() &&
{t('app.admin.invoices.payment_schedules.no_payment_schedules')}
}\n {hasSchedules() &&
\n \n {hasMoreSchedules() && {t('app.admin.invoices.payment_schedules.load_more')}}\n
}\n
\n );\n}\n\n\nconst PaymentSchedulesListWrapper: React.FC = ({ currentUser }) => {\n return (\n \n \n \n );\n}\n\nApplication.Components.component('paymentSchedulesList', react2angular(PaymentSchedulesListWrapper, ['currentUser']));\n","/**\n * This component is a \"card\" publicly presenting the details of a plan\n */\n\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { react2angular } from 'react2angular';\nimport moment from 'moment';\nimport _ from 'lodash'\nimport { IApplication } from '../models/application';\nimport { Plan } from '../models/plan';\nimport { User, UserRole } from '../models/user';\nimport { Loader } from './loader';\nimport '../lib/i18n';\nimport { IFablab } from '../models/fablab';\n\ndeclare var Application: IApplication;\ndeclare var Fablab: IFablab;\n\ninterface PlanCardProps {\n plan: Plan,\n userId?: number,\n subscribedPlanId?: number,\n operator: User,\n isSelected: boolean,\n onSelectPlan: (plan: Plan) => void,\n}\n\nconst PlanCard: React.FC = ({ plan, userId, subscribedPlanId, operator, onSelectPlan, isSelected }) => {\n const { t } = useTranslation('public');\n /**\n * Return the formatted localized amount of the given plan (eg. 20.5 => \"20,50 €\")\n */\n const amount = () : string => {\n return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(plan.amount);\n }\n /**\n * Return the formatted localized amount, divided by the number of months (eg. 120 => \"10,00 € / month\")\n */\n const monthlyAmount = (): string => {\n const monthly = plan.amount / moment.duration(plan.interval_count, plan.interval).asMonths();\n return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(monthly);\n }\n /**\n * Return the formatted localized duration of te given plan (eg. Month/3 => \"3 mois\")\n */\n const duration = (): string => {\n return moment.duration(plan.interval_count, plan.interval).humanize();\n }\n /**\n * Check if the user can subscribe to the current plan, for himself\n */\n const canSubscribeForMe = (): boolean => {\n return operator?.role === UserRole.Member || (operator?.role === UserRole.Manager && userId === operator?.id)\n }\n /**\n * Check if the user can subscribe to the current plan, for someone else\n */\n const canSubscribeForOther = (): boolean => {\n return operator?.role === UserRole.Admin || (operator?.role === UserRole.Manager && userId !== operator?.id)\n }\n /**\n * Check it the user has subscribed to this plan or not\n */\n const hasSubscribedToThisPlan = (): boolean => {\n return subscribedPlanId === plan.id;\n }\n /**\n * Check if the plan has an attached file\n */\n const hasAttachment = (): boolean => {\n return !!plan.plan_file_url;\n }\n /**\n * Check if the plan has a description\n */\n const hasDescription = (): boolean => {\n return !!plan.description;\n }\n /**\n * Check if the plan is allowing a monthly payment schedule\n */\n const canBeScheduled = (): boolean => {\n return plan.monthly_payment;\n }\n /**\n * Callback triggered when the user select the plan\n */\n const handleSelectPlan = (): void => {\n onSelectPlan(plan);\n }\n return (\n
\n

{plan.base_name}

\n
\n {canBeScheduled() &&
\n
\n
{t('app.public.plans.AMOUNT_per_month', {AMOUNT: monthlyAmount()})}
\n {duration()}\n
\n
}\n {!canBeScheduled() &&
\n
\n
{amount()}
\n {duration()}\n
\n
}\n
\n
\n {hasDescription() &&
}\n {hasAttachment() && { t('app.public.plans.more_information') }}\n {canSubscribeForMe() &&
\n {!hasSubscribedToThisPlan() && }\n {hasSubscribedToThisPlan() && }\n
}\n {canSubscribeForOther() &&
\n \n
}\n
\n
\n );\n}\n\nconst PlanCardWrapper: React.FC = ({ plan, userId, subscribedPlanId, operator, onSelectPlan, isSelected }) => {\n return (\n \n \n \n );\n}\n\nApplication.Components.component('planCard', react2angular(PlanCardWrapper, ['plan', 'userId', 'subscribedPlanId', 'operator', 'onSelectPlan', 'isSelected']));\n","/**\n * This component is a switch enabling the users to choose if they want to pay by monthly schedule\n * or with a one time payment\n */\n\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { react2angular } from 'react2angular';\nimport Switch from 'react-switch';\nimport { IApplication } from '../models/application';\nimport { Loader } from './loader';\nimport '../lib/i18n';\n\ndeclare var Application: IApplication;\n\ninterface SelectScheduleProps {\n show: boolean,\n selected: boolean,\n onChange: (selected: boolean) => void,\n className: string,\n}\n\nconst SelectSchedule: React.FC = ({ show, selected, onChange, className }) => {\n const { t } = useTranslation('shared');\n\n return (\n
\n {show &&
\n \n \n
}\n
\n );\n}\n\nconst SelectScheduleWrapper: React.FC = ({ show, selected, onChange, className }) => {\n return (\n \n \n \n );\n}\n\nApplication.Components.component('selectSchedule', react2angular(SelectScheduleWrapper, ['show', 'selected', 'onChange', 'className']));\n","/**\n * This component enables the user to input his card data or process payments.\n * Supports Strong-Customer Authentication (SCA).\n */\n\nimport React, { ReactNode, useEffect, useState } from 'react';\nimport { react2angular } from 'react2angular';\nimport { Loader } from './loader';\nimport { IApplication } from '../models/application';\nimport { StripeElements } from './stripe-elements';\nimport { useTranslation } from 'react-i18next';\nimport { FabModal, ModalSize } from './fab-modal';\nimport { SetupIntent } from '@stripe/stripe-js';\nimport { WalletInfo } from './wallet-info';\nimport { User } from '../models/user';\nimport CustomAssetAPI from '../api/custom-asset';\nimport { CustomAssetName } from '../models/custom-asset';\nimport { PaymentSchedule } from '../models/payment-schedule';\nimport { IFablab } from '../models/fablab';\nimport WalletLib from '../lib/wallet';\nimport { StripeForm } from './stripe-form';\n\nimport stripeLogo from '../../../images/powered_by_stripe.png';\nimport mastercardLogo from '../../../images/mastercard.png';\nimport visaLogo from '../../../images/visa.png';\nimport { CartItems, PaymentConfirmation } from '../models/payment';\nimport WalletAPI from '../api/wallet';\nimport PriceAPI from '../api/price';\nimport { HtmlTranslate } from './html-translate';\n\ndeclare var Application: IApplication;\ndeclare var Fablab: IFablab;\n\ninterface StripeModalProps {\n isOpen: boolean,\n toggleModal: () => void,\n afterSuccess: (result: SetupIntent|PaymentConfirmation) => void,\n cartItems: CartItems,\n currentUser: User,\n schedule: PaymentSchedule,\n customer: User\n}\n\nconst cgvFile = CustomAssetAPI.get(CustomAssetName.CgvFile);\n\nconst StripeModal: React.FC = ({ isOpen, toggleModal, afterSuccess, cartItems, currentUser, schedule, customer }) => {\n // customer's wallet\n const [wallet, setWallet] = useState(null);\n // server-computed price with all details\n const [price, setPrice] = useState(null);\n // remaining price = total price - wallet amount\n const [remainingPrice, setRemainingPrice] = useState(0);\n // is the component ready to display?\n const [ready, setReady] = useState(false);\n // errors to display in the UI (stripe errors mainly)\n const [errors, setErrors] = useState(null);\n // are we currently processing the payment (ie. the form was submit, but the process is still running)?\n const [submitState, setSubmitState] = useState(false);\n // did the user accepts the terms of services (CGV)?\n const [tos, setTos] = useState(false);\n\n const { t } = useTranslation('shared');\n const cgv = cgvFile.read();\n\n\n /**\n * On each display:\n * - Refresh the wallet\n * - Refresh the price\n * - Refresh the remaining price\n */\n useEffect(() => {\n if (!cartItems) return;\n WalletAPI.getByUser(cartItems.reservation?.user_id || cartItems.subscription?.user_id).then((wallet) => {\n setWallet(wallet);\n PriceAPI.compute(cartItems).then((res) => {\n setPrice(res);\n const wLib = new WalletLib(wallet);\n setRemainingPrice(wLib.computeRemainingPrice(res.price));\n setReady(true);\n })\n })\n }, [cartItems]);\n\n /**\n * Check if there is currently an error to display\n */\n const hasErrors = (): boolean => {\n return errors !== null;\n }\n\n /**\n * Check if the user accepts the Terms of Sales document\n */\n const hasCgv = (): boolean => {\n return cgv != null;\n }\n\n /**\n * Triggered when the user accepts or declines the Terms of Sales\n */\n const toggleTos = (): void => {\n setTos(!tos);\n }\n\n /**\n * Check if we are currently creating a payment schedule\n */\n const isPaymentSchedule = (): boolean => {\n return schedule !== undefined;\n }\n\n /**\n * Return the formatted localized amount for the given price (eg. 20.5 => \"20,50 €\")\n */\n const formatPrice = (amount: number): string => {\n return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(amount);\n }\n\n /**\n * Return the logos, shown in the modal footer.\n */\n const logoFooter = (): ReactNode => {\n return (\n
\n \n \"powered\n \"mastercard\"\n \"visa\"\n
\n );\n }\n\n /**\n * Set the component as 'currently submitting'\n */\n const handleSubmit = (): void => {\n setSubmitState(true);\n }\n\n /**\n * After sending the form with success, process the resulting payment method\n */\n const handleFormSuccess = async (result: SetupIntent|PaymentConfirmation|any): Promise => {\n setSubmitState(false);\n afterSuccess(result);\n }\n\n /**\n * When stripe-form raise an error, it is handled by this callback which display it in the modal.\n */\n const handleFormError = (message: string): void => {\n setSubmitState(false);\n setErrors(message);\n }\n\n /**\n * Check the form can be submitted.\n * => We're not currently already submitting the form, and, if the terms of service are enabled, the user agrees with them.\n */\n const canSubmit = (): boolean => {\n let terms = true;\n if (hasCgv()) { terms = tos; }\n return !submitState && terms;\n }\n\n\n return (\n \n {ready && \n \n \n {hasErrors() &&
\n {errors}\n
}\n {isPaymentSchedule() &&
\n \n
}\n {hasCgv() &&
\n \n \n
}\n
\n {!submitState && }\n {submitState &&
\n
\n \n
\n
}\n
}\n
\n );\n}\n\nconst StripeModalWrapper: React.FC = ({ isOpen, toggleModal, afterSuccess, currentUser, schedule , cartItems, customer }) => {\n return (\n \n \n \n );\n}\n\nApplication.Components.component('stripeModal', react2angular(StripeModalWrapper, ['isOpen', 'toggleModal', 'afterSuccess','currentUser', 'schedule', 'cartItems', 'customer']));\n","'use strict';\n\nApplication.Controllers.controller('AboutController', ['$scope', 'Setting', 'CustomAsset', function ($scope, Setting, CustomAsset) {\n /* PUBLIC SCOPE */\n\n Setting.get({ name: 'about_title' }, data => { $scope.aboutTitle = data.setting; });\n\n Setting.get({ name: 'about_body' }, data => { $scope.aboutBody = data.setting; });\n\n Setting.get({ name: 'about_contacts' }, data => { $scope.aboutContacts = data.setting; });\n\n Setting.get({ name: 'privacy_body' }, data => { $scope.privacyPolicy = data.setting; });\n\n // retrieve the CGU\n CustomAsset.get({ name: 'cgu-file' }, cgu => { $scope.cgu = cgu.custom_asset; });\n\n // retrieve the CGV\n CustomAsset.get({ name: 'cgv-file' }, cgv => { $scope.cgv = cgv.custom_asset; });\n}\n]);\n","/**\n * Controller used in abuses management page\n */\nApplication.Controllers.controller('AbusesController', ['$scope', '$state', 'Abuse', 'abusesPromise', 'dialogs', 'growl', '_t',\n function ($scope, $state, Abuse, abusesPromise, dialogs, growl, _t) {\n /* PUBLIC SCOPE */\n\n // List of all reported abuses\n $scope.abuses = [];\n\n /**\n * Callback handling a click on the ✓ button: confirm before delete\n */\n $scope.confirmProcess = function (abuseId) {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.manage_abuses.confirmation_required'),\n msg: _t('app.admin.manage_abuses.report_will_be_destroyed')\n };\n }\n }\n },\n function () { // cancel confirmed\n Abuse.remove({ id: abuseId }, function () { // successfully canceled\n growl.success(_t('app.admin.manage_abuses.report_removed'));\n Abuse.query({}, function (abuses) {\n $scope.abuses = abuses.abuses.filter(a => a.signaled_type === 'Project');\n });\n }\n , function () { // error while canceling\n growl.error(_t('app.admin.manage_abuses.failed_to_remove'));\n });\n }\n );\n };\n\n /* PRIVATE SCOPE */\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n // we display only abuses related to projects\n $scope.abuses = abusesPromise.abuses.filter(a => a.signaled_type === 'Project');\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n","/* eslint-disable\n camelcase,\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/* COMMON CODE */\n\n// list of supported authentication methods\nconst METHODS = {\n 'DatabaseProvider': 'local_database',\n 'OAuth2Provider': 'o_auth2'\n};\n\n/**\n * Iterate through the provided array and return the index of the requested element\n * @param elements {Array<{id:*}>}\n * @param id {*} id of the element to retrieve in the list\n * @returns {number} index of the requested element, in the provided array\n */\nconst findIdxById = function (elements, id) {\n return (elements.map(function (elem) { return elem.id; })).indexOf(id);\n};\n\n/**\n * For OAuth2 authentications, mapping the user's ID is mandatory. This function will check that this mapping\n * is effective and will return false otherwise\n * @param mappings {Array} expected: $scope.provider.providable_attributes.o_auth2_mappings_attributes\n * @returns {Boolean} true if the mapping is declared\n */\nconst check_oauth2_id_is_mapped = function (mappings) {\n for (let mapping of Array.from(mappings)) {\n if ((mapping.local_model === 'user') && (mapping.local_field === 'uid') && !mapping._destroy) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Provides a set of common callback methods and data to the $scope parameter. These methods are used\n * in the various authentication providers' controllers.\n *\n * Provides :\n * - $scope.authMethods\n * - $scope.mappingFields\n * - $scope.cancel()\n * - $scope.methodName()\n * - $scope.defineDataMapping(mapping)\n *\n * Requires :\n * - mappingFieldsPromise: retrieved by AuthProvider.mapping_fields()\n * - $state (Ui-Router) [ 'app.admin.members' ]\n * - _t : translation method\n */\nclass AuthenticationController {\n constructor ($scope, $state, $uibModal, _t, mappingFieldsPromise) {\n // list of supported authentication methods\n $scope.authMethods = METHODS;\n\n // list of fields that can be mapped through the SSO\n $scope.mappingFields = mappingFieldsPromise;\n\n /**\n * Changes the admin's view to the members list page\n */\n $scope.cancel = function () { $state.go('app.admin.members'); };\n\n /**\n * Return a localized string for the provided method\n */\n $scope.methodName = function(method) {\n return _t('app.shared.authentication.' + METHODS[method]);\n }\n\n /**\n * Open a modal allowing to specify the data mapping for the given field\n */\n $scope.defineDataMapping = function (mapping) {\n $uibModal.open({\n templateUrl: '/admin/authentications/_data_mapping.html',\n size: 'md',\n resolve: {\n field () { return mapping; },\n datatype () {\n for (let field of Array.from($scope.mappingFields[mapping.local_model])) {\n if (field[0] === mapping.local_field) {\n return field[1];\n }\n }\n }\n },\n\n controller: ['$scope', '$uibModalInstance', 'field', 'datatype', function ($scope, $uibModalInstance, field, datatype) {\n // parent field\n $scope.field = field;\n // expected data type\n $scope.datatype = datatype;\n // data transformation rules\n $scope.transformation =\n { rules: field.transformation || { type: datatype } };\n // available transformation formats\n $scope.formats = {\n date: [\n {\n label: 'ISO 8601',\n value: 'iso8601'\n },\n {\n label: 'RFC 2822',\n value: 'rfc2822'\n },\n {\n label: 'RFC 3339',\n value: 'rfc3339'\n },\n {\n label: 'Timestamp (s)',\n value: 'timestamp-s'\n },\n {\n label: 'Timestamp (ms)',\n value: 'timestamp-ms'\n }\n ]\n };\n\n // Create a new mapping between anything and an expected integer\n $scope.addIntegerMapping = function () {\n if (!angular.isArray($scope.transformation.rules.mapping)) {\n $scope.transformation.rules.mapping = [];\n }\n return $scope.transformation.rules.mapping.push({ from: '', to: 0 });\n };\n\n // close and save the modifications\n $scope.ok = function () { $uibModalInstance.close($scope.transformation.rules); };\n\n // do not save the modifications\n $scope.cancel = function () { $uibModalInstance.dismiss(); };\n }]\n })\n .result['finally'](null).then(function (transfo_rules) { mapping.transformation = transfo_rules; });\n };\n }\n}\n\n/**\n * Page listing all authentication providers\n */\nApplication.Controllers.controller('AuthentificationController', ['$scope', '$state', '$rootScope', 'dialogs', 'growl', 'authProvidersPromise', 'AuthProvider', '_t',\n function ($scope, $state, $rootScope, dialogs, growl, authProvidersPromise, AuthProvider, _t) {\n /* PUBLIC SCOPE */\n\n // full list of authentication providers\n $scope.providers = authProvidersPromise;\n\n /**\n * Translate the classname into an explicit textual message\n * @param type {string} Ruby polymorphic model classname\n * @returns {string}\n */\n $scope.getType = function (type) {\n const text = METHODS[type];\n if (typeof text !== 'undefined') {\n return _t(`app.admin.members.authentication_form.${text}`);\n } else {\n return _t('app.admin.members.authentication_form.unknown') + type;\n }\n };\n\n /**\n * Translate the status string into an explicit textual message\n * @param status {string} active | pending | previous\n * @returns {string}\n */\n $scope.getState = function (status) {\n switch (status) {\n case 'active': return _t('app.admin.members.authentication_form.active');\n case 'pending': return _t('app.admin.members.authentication_form.pending');\n case 'previous': return _t('app.admin.members.authentication_form.previous_provider');\n default: return _t('app.admin.members.authentication_form.unknown') + status;\n }\n };\n\n /**\n * Ask for confirmation then delete the specified provider\n * @param providers {Array} full list of authentication providers\n * @param provider {Object} provider to delete\n */\n $scope.destroyProvider = function (providers, provider) {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.members.authentication_form.confirmation_required'),\n msg: _t('app.admin.members.authentication_form.do_you_really_want_to_delete_the_TYPE_authentication_provider_NAME', { TYPE: $scope.getType(provider.providable_type), NAME: provider.name })\n };\n }\n }\n },\n function () {\n // the admin has confirmed, delete\n AuthProvider.delete(\n { id: provider.id },\n function () {\n providers.splice(findIdxById(providers, provider.id), 1);\n growl.success(_t('app.admin.members.authentication_form.authentication_provider_successfully_deleted'));\n },\n function () { growl.error(_t('app.admin.members.authentication_form.an_error_occurred_unable_to_delete_the_specified_provider')); }\n );\n }\n );\n };\n }\n\n]);\n\n/**\n * Page to add a new authentication provider\n */\nApplication.Controllers.controller('NewAuthenticationController', ['$scope', '$state', '$rootScope', '$uibModal', 'dialogs', 'growl', 'mappingFieldsPromise', 'authProvidersPromise', 'AuthProvider', '_t',\n function ($scope, $state, $rootScope, $uibModal, dialogs, growl, mappingFieldsPromise, authProvidersPromise, AuthProvider, _t) {\n $scope.mode = 'creation';\n\n // default parameters for the new authentication provider\n $scope.provider = {\n name: '',\n providable_type: '',\n providable_attributes: {}\n };\n\n /**\n * Initialize some provider's specific properties when selecting the provider type\n */\n $scope.updateProvidable = function () {\n // === OAuth2Provider ===\n if ($scope.provider.providable_type === 'OAuth2Provider') {\n if (typeof $scope.provider.providable_attributes.o_auth2_mappings_attributes === 'undefined') {\n return $scope.provider.providable_attributes['o_auth2_mappings_attributes'] = [];\n }\n }\n };\n // Add others providers initializers here if needed ...\n\n /**\n * Validate and save the provider parameters in database\n */\n $scope.registerProvider = function () {\n // === DatabaseProvider ===\n let provider;\n if ($scope.provider.providable_type === 'DatabaseProvider') {\n // prevent from adding mode than 1\n for (provider of Array.from(authProvidersPromise)) {\n if (provider.providable_type === 'DatabaseProvider') {\n growl.error(_t('app.admin.authentication_new.a_local_database_provider_already_exists_unable_to_create_another'));\n return false;\n }\n }\n return AuthProvider.save({ auth_provider: $scope.provider }, function (provider) {\n growl.success(_t('app.admin.authentication_new.local_provider_successfully_saved'));\n return $state.go('app.admin.members');\n });\n // === OAuth2Provider ===\n } else if ($scope.provider.providable_type === 'OAuth2Provider') {\n // check the ID mapping\n if (!check_oauth2_id_is_mapped($scope.provider.providable_attributes.o_auth2_mappings_attributes)) {\n growl.error(_t('app.admin.authentication_new.it_is_required_to_set_the_matching_between_User.uid_and_the_API_to_add_this_provider'));\n return false;\n }\n // discourage the use of unsecure SSO\n if (!($scope.provider.providable_attributes.base_url.indexOf('https://') > -1)) {\n dialogs.confirm(\n {\n size: 'l',\n resolve: {\n object () {\n return {\n title: _t('app.admin.authentication_new.security_issue_detected'),\n msg: _t('app.admin.authentication_new.beware_the_oauth2_authenticatoin_provider_you_are_about_to_add_isnt_using_HTTPS') +\n _t('app.admin.authentication_new.this_is_a_serious_security_issue_on_internet_and_should_never_be_used_except_for_testing_purposes') +\n _t('app.admin.authentication_new.do_you_really_want_to_continue')\n };\n }\n }\n },\n function () { // unsecured http confirmed\n AuthProvider.save({ auth_provider: $scope.provider }, function (provider) {\n growl.success(_t('app.admin.authentication_new.unsecured_oauth2_provider_successfully_added'));\n return $state.go('app.admin.members');\n });\n }\n );\n } else {\n AuthProvider.save({ auth_provider: $scope.provider }, function (provider) {\n growl.success(_t('app.admin.authentication_new.oauth2_provider_successfully_added'));\n return $state.go('app.admin.members');\n });\n }\n }\n };\n\n // Using the AuthenticationController\n return new AuthenticationController($scope, $state, $uibModal, _t, mappingFieldsPromise);\n }\n]);\n\n/**\n * Page to edit an already added authentication provider\n */\nApplication.Controllers.controller('EditAuthenticationController', ['$scope', '$state', '$stateParams', '$rootScope', '$uibModal', 'dialogs', 'growl', 'providerPromise', 'mappingFieldsPromise', 'AuthProvider', '_t',\n function ($scope, $state, $stateParams, $rootScope, $uibModal, dialogs, growl, providerPromise, mappingFieldsPromise, AuthProvider, _t) {\n // parameters of the currently edited authentication provider\n $scope.provider = providerPromise;\n\n $scope.mode = 'edition';\n\n /**\n * Update the current provider with the new inputs\n */\n $scope.updateProvider = function () {\n // check the ID mapping\n if (!check_oauth2_id_is_mapped($scope.provider.providable_attributes.o_auth2_mappings_attributes)) {\n growl.error(_t('app.admin.authentication_edit.it_is_required_to_set_the_matching_between_User.uid_and_the_API_to_add_this_provider'));\n return false;\n }\n return AuthProvider.update(\n { id: $scope.provider.id },\n { auth_provider: $scope.provider },\n function (provider) {\n growl.success(_t('app.admin.authentication_edit.provider_successfully_updated'));\n $state.go('app.admin.members');\n },\n function () { growl.error(_t('app.admin.authentication_edit.an_error_occurred_unable_to_update_the_provider')); }\n );\n };\n\n // Using the AuthenticationController\n return new AuthenticationController($scope, $state, $uibModal, _t, mappingFieldsPromise);\n }\n]);\n","/* eslint-disable\n camelcase,\n handle-callback-err,\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/**\n * Controller used in the calendar management page\n */\n\nApplication.Controllers.controller('AdminCalendarController', ['$scope', '$state', '$uibModal', 'moment', 'AuthService', 'Availability', 'Slot', 'Setting', 'Export', 'growl', 'dialogs', 'bookingWindowStart', 'bookingWindowEnd', 'machinesPromise', 'plansPromise', 'groupsPromise', 'settingsPromise', '_t', 'uiCalendarConfig', 'CalendarConfig', 'Member', 'uiTourService',\n function ($scope, $state, $uibModal, moment, AuthService, Availability, Slot, Setting, Export, growl, dialogs, bookingWindowStart, bookingWindowEnd, machinesPromise, plansPromise, groupsPromise, settingsPromise, _t, uiCalendarConfig, CalendarConfig, Member, uiTourService) {\n /* PRIVATE STATIC CONSTANTS */\n\n // The calendar is divided in slots of 30 minutes\n const BASE_SLOT = '00:30:00';\n\n // The bookings can be positioned every half hours\n const BOOKING_SNAP = '00:30:00';\n\n // We do not allow the creation of slots that are not a multiple of 60 minutes\n const SLOT_MULTIPLE = parseInt(settingsPromise.slot_duration, 10);\n\n /* PUBLIC SCOPE */\n\n // list of the FabLab machines\n $scope.machines = machinesPromise;\n\n // currently selected availability\n $scope.availability = null;\n\n // corresponding fullCalendar item in the DOM\n $scope.availabilityDom = null;\n\n // Should we show the scheduled events in the calendar?\n $scope.eventsInCalendar = (settingsPromise.events_in_calendar === 'true');\n\n // bind the availabilities slots with full-Calendar events\n $scope.eventSources = [{\n url: '/api/availabilities',\n textColor: 'black'\n }];\n\n // fullCalendar (v2) configuration\n $scope.calendarConfig = CalendarConfig({\n slotDuration: BASE_SLOT,\n snapDuration: BOOKING_SNAP,\n selectable: true,\n selectHelper: true,\n minTime: moment.duration(moment(bookingWindowStart.setting.value).format('HH:mm:ss')),\n maxTime: moment.duration(moment(bookingWindowEnd.setting.value).format('HH:mm:ss')),\n select (start, end, jsEvent, view) {\n return calendarSelectCb(start, end, jsEvent, view);\n },\n eventClick (event, jsEvent, view) {\n return calendarEventClickCb(event, jsEvent, view);\n },\n eventRender (event, element, view) {\n return eventRenderCb(event, element, view);\n },\n viewRender (view, element) {\n return viewRenderCb(view, element);\n },\n loading (isLoading, view) {\n return loadingCb(isLoading, view);\n }\n });\n\n /**\n * Open a confirmation modal to cancel the booking of a user for the currently selected event.\n * @param slot {Object} reservation slot of a user, inherited from $resource\n */\n $scope.cancelBooking = function (slot) {\n // open a confirmation dialog\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.calendar.confirmation_required'),\n msg: _t('app.admin.calendar.do_you_really_want_to_cancel_the_USER_s_reservation_the_DATE_at_TIME_concerning_RESERVATION'\n , { GENDER: getGender($scope.currentUser), USER: slot.user.name, DATE: moment(slot.start_at).format('L'), TIME: moment(slot.start_at).format('LT'), RESERVATION: slot.reservable.name })\n };\n }\n }\n },\n function () {\n // the admin has confirmed, cancel the subscription\n Slot.cancel(\n { id: slot.slot_id },\n function (data, status) { // success\n // update the canceled_at attribute\n for (const resa of Array.from($scope.reservations)) {\n if (resa.slot_id === data.id) {\n resa.canceled_at = data.canceled_at;\n break;\n }\n }\n // notify the admin\n return growl.success(_t('app.admin.calendar.reservation_was_successfully_cancelled'));\n },\n function (data, status) { // failed\n growl.error(_t('app.admin.calendar.reservation_cancellation_failed'));\n }\n );\n }\n );\n };\n\n /**\n * Open a confirmation modal to remove a machine for the currently selected availability,\n * except if it is the last machine of the reservation.\n * @param machine {Object} must contain the machine ID and name\n */\n $scope.removeMachine = function (machine) {\n if ($scope.availability.machine_ids.length === 1) {\n return growl.error(_t('app.admin.calendar.unable_to_remove_the_last_machine_of_the_slot_delete_the_slot_rather'));\n } else {\n // open a confirmation dialog\n return dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.admin.calendar.confirmation_required'),\n msg: _t('app.admin.calendar.do_you_really_want_to_remove_MACHINE_from_this_slot', { GENDER: getGender($scope.currentUser), MACHINE: machine.name }) + ' ' +\n _t('app.admin.calendar.this_will_prevent_any_new_reservation_on_this_slot_but_wont_cancel_those_existing') + '
' +\n _t('app.admin.calendar.beware_this_cannot_be_reverted') + ''\n };\n }\n }\n }\n , function () {\n // the admin has confirmed, remove the machine\n const machines = $scope.availability.machine_ids;\n for (let m_id = 0; m_id < machines.length; m_id++) {\n const key = machines[m_id];\n if (m_id === machine.id) {\n machines.splice(key, 1);\n }\n }\n\n return Availability.update({ id: $scope.availability.id }, { availability: { machines_attributes: [{ id: machine.id, _destroy: true }] } }\n , function (data, status) { // success\n // update the machine_ids attribute\n $scope.availability.machine_ids = data.machine_ids;\n $scope.availability.title = data.title;\n uiCalendarConfig.calendars.calendar.fullCalendar('rerenderEvents');\n // notify the admin\n return growl.success(_t('app.admin.calendar.the_machine_was_successfully_removed_from_the_slot'));\n }\n , function (data, status) { // failed\n growl.error(_t('app.admin.calendar.deletion_failed'));\n }\n );\n });\n }\n };\n\n /**\n * Open a confirmation modal to remove a plan for the currently selected availability,\n * @param plan {Object} must contain the machine ID and name\n */\n $scope.removePlan = function (plan) {\n // open a confirmation dialog\n return dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.admin.calendar.confirmation_required'),\n msg: _t('app.admin.calendar.do_you_really_want_to_remove_PLAN_from_this_slot', { GENDER: getGender($scope.currentUser), PLAN: plan.name })\n };\n }\n }\n },\n function () {\n // the admin has confirmed, remove the plan\n _.drop($scope.availability.plan_ids, plan.id);\n\n Availability.update({ id: $scope.availability.id }, { availability: { plans_attributes: [{ id: plan.id, _destroy: true }] } }\n , function (data, status) { // success\n // update the plan_ids attribute\n $scope.availability.plan_ids = data.plan_ids;\n $scope.availability.plans = availabilityPlans();\n uiCalendarConfig.calendars.calendar.fullCalendar('rerenderEvents');\n // notify the admin\n return growl.success(_t('app.admin.calendar.the_plan_was_successfully_removed_from_the_slot'));\n }\n , function (data, status) { // failed\n growl.error(_t('app.admin.calendar.deletion_failed'));\n }\n );\n });\n };\n\n /**\n * Callback to alert the admin that the export request was acknowledged and is\n * processing right now.\n */\n $scope.alertExport = function (type) {\n Export.status({ category: 'availabilities', type }).then(function (res) {\n if (!res.data.exists) {\n return growl.success(_t('app.admin.calendar.export_is_running_you_ll_be_notified_when_its_ready'));\n }\n });\n };\n\n /**\n * Mark the selected slot as unavailable for new reservations or allow reservations again on it\n */\n $scope.toggleLockReservations = function () {\n // first, define a shortcut to the lock property\n const locked = $scope.availability.lock;\n // then check if we'll allow reservations locking\n let prevent = !locked; // if currently locked, allow unlock anyway\n if (!locked) {\n prevent = false;\n angular.forEach($scope.reservations, function (r) {\n if (r.canceled_at === null) {\n return prevent = true;\n }\n }); // if currently unlocked and has any non-cancelled reservation, disallow locking\n }\n if (!prevent) {\n // open a confirmation dialog\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.calendar.confirmation_required'),\n msg: locked ? _t('app.admin.calendar.do_you_really_want_to_allow_reservations') : _t('app.admin.calendar.do_you_really_want_to_block_this_slot')\n };\n }\n }\n },\n function () {\n // the admin has confirmed, lock/unlock the slot\n Availability.lock(\n { id: $scope.availability.id },\n { lock: !locked },\n function (data) { // success\n $scope.availability = data;\n growl.success(locked ? _t('app.admin.calendar.unlocking_success') : _t('app.admin.calendar.locking_success'));\n uiCalendarConfig.calendars.calendar.fullCalendar('refetchEvents');\n },\n function (error) { // failed\n growl.error(locked ? _t('app.admin.calendar.unlocking_failed') : _t('app.admin.calendar.locking_failed'));\n console.error(error);\n }\n );\n }\n );\n } else {\n return growl.error(_t('app.admin.calendar.unlockable_because_reservations'));\n }\n };\n\n /**\n * Confirm and destroy the slot in $scope.availability\n */\n $scope.removeSlot = function () {\n // open a confirmation dialog\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/admin/calendar/deleteRecurrent.html',\n size: 'md',\n controller: 'DeleteRecurrentAvailabilityController',\n resolve: {\n availabilityPromise: ['Availability', function (Availability) { return Availability.get({ id: $scope.availability.id }).$promise; }]\n }\n });\n // once the dialog was closed, do things depending on the result\n modalInstance.result.then(function (res) {\n if (res.status === 'success') {\n $scope.availability = null;\n }\n for (const availability of res.availabilities) {\n uiCalendarConfig.calendars.calendar.fullCalendar('removeEvents', availability);\n }\n });\n };\n\n /**\n * Setup the feature-tour for the admin/calendar page.\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupCalendarTour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('calendar');\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.admin.tour.calendar.welcome.title'),\n content: _t('app.admin.tour.calendar.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n uitour.createStep({\n selector: '.admin-calendar .fc-view-container',\n stepId: 'agenda',\n order: 1,\n title: _t('app.admin.tour.calendar.agenda.title'),\n content: _t('app.admin.tour.calendar.agenda.content'),\n placement: 'right',\n popupClass: 'width-350'\n });\n if (AuthService.isAuthorized('admin')) {\n uitour.createStep({\n selector: '.admin-calendar .export-xls-button',\n stepId: 'export',\n order: 2,\n title: _t('app.admin.tour.calendar.export.title'),\n content: _t('app.admin.tour.calendar.export.content'),\n placement: 'left'\n });\n }\n uitour.createStep({\n selector: '.heading .import-ics-button',\n stepId: 'import',\n order: 3,\n title: _t('app.admin.tour.calendar.import.title'),\n content: _t('app.admin.tour.calendar.import.content'),\n placement: 'left'\n });\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 4,\n title: _t('app.admin.tour.conclusion.title'),\n content: _t('app.admin.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('calendar') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'calendar' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('calendar') < 0) {\n uitour.start();\n }\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {};\n\n /**\n * Return an enumerable meaninful string for the gender of the provider user\n * @param user {Object} Database user record\n * @return {string} 'male' or 'female'\n */\n const getGender = function (user) {\n if (user.statistic_profile) {\n if (user.statistic_profile.gender === 'true') { return 'male'; } else { return 'female'; }\n } else { return 'other'; }\n };\n\n /**\n * Return a list of plans classified by group\n *\n * @returns {array}\n */\n const availabilityPlans = function () {\n const plansClassifiedByGroup = [];\n const _plans = _.filter(plansPromise, function (p) { return _.includes($scope.availability.plan_ids, p.id); });\n for (const group of Array.from(groupsPromise)) {\n const groupObj = { id: group.id, name: group.name, plans: [] };\n for (const plan of Array.from(_plans)) {\n if (plan.group_id === group.id) { groupObj.plans.push(plan); }\n }\n if (groupObj.plans.length > 0) {\n plansClassifiedByGroup.push(groupObj);\n }\n }\n return plansClassifiedByGroup;\n };\n\n // Triggered when the admin drag on the agenda to create a new reservable slot.\n // @see http://fullcalendar.io/docs/selection/select_callback/\n //\n const calendarSelectCb = function (start, end, jsEvent, view) {\n start = moment.tz(start.toISOString(), Fablab.timezone);\n end = moment.tz(end.toISOString(), Fablab.timezone);\n if (view.name === 'month') {\n end = end.subtract(1, 'day').startOf('day');\n }\n\n // check if slot is not in the past\n const today = new Date();\n if (Math.trunc((start.valueOf() - today) / (60 * 1000)) < 0) {\n growl.warning(_t('app.admin.calendar.event_in_the_past'));\n return uiCalendarConfig.calendars.calendar.fullCalendar('unselect');\n }\n\n // check that the selected slot is an multiple of SLOT_MULTIPLE (ie. not decimal)\n const slots = Math.trunc((end.valueOf() - start.valueOf()) / (60 * 1000)) / SLOT_MULTIPLE;\n if (!Number.isInteger(slots)) {\n // otherwise, round it to upper decimal\n const upper = (Math.ceil(slots) || 1) * SLOT_MULTIPLE;\n end = moment(start).add(upper, 'minutes');\n }\n\n // then we open a modal window to let the admin specify the slot type\n const modalInstance = $uibModal.open({\n templateUrl: '/admin/calendar/eventModal.html',\n controller: 'CreateEventModalController',\n backdrop: 'static',\n keyboard: false,\n resolve: {\n start () { return start; },\n end () { return end; },\n slots () { return Math.ceil(slots); },\n machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }],\n trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }],\n spacesPromise: ['Space', function (Space) { return Space.query().$promise; }],\n tagsPromise: ['Tag', function (Tag) { return Tag.query().$promise; }],\n plansPromise: ['Plan', function (Plan) { return Plan.query().$promise; }],\n groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],\n slotDurationPromise: ['Setting', function (Setting) { return Setting.get({ name: 'slot_duration' }).$promise; }]\n }\n });\n // when the modal is closed, we send the slot to the server for saving\n modalInstance.result.then(\n function (availability) {\n uiCalendarConfig.calendars.calendar.fullCalendar(\n 'renderEvent',\n {\n id: availability.id,\n title: availability.title,\n start: availability.start_at,\n end: availability.end_at,\n textColor: 'black',\n backgroundColor: availability.backgroundColor,\n borderColor: availability.borderColor,\n tag_ids: availability.tag_ids,\n tags: availability.tags,\n machine_ids: availability.machine_ids,\n plan_ids: availability.plan_ids,\n slot_duration: availability.slot_duration\n },\n true\n );\n },\n function () { uiCalendarConfig.calendars.calendar.fullCalendar('unselect'); }\n );\n\n return uiCalendarConfig.calendars.calendar.fullCalendar('unselect');\n };\n\n /**\n * Triggered when the admin clicks on a availability slot in the agenda.\n * @see http://fullcalendar.io/docs/mouse/eventClick/\n */\n const calendarEventClickCb = function (event, jsEvent, view) {\n $scope.availability = event;\n $scope.availability.plans = availabilityPlans();\n\n if ($scope.availabilityDom) {\n $scope.availabilityDom.classList.remove('fc-selected');\n }\n $scope.availabilityDom = jsEvent.target.closest('.fc-event');\n $scope.availabilityDom.classList.add('fc-selected');\n\n // if the user has clicked on the delete event button, delete the event\n if ($(jsEvent.target).hasClass('remove-event')) {\n return $scope.removeSlot();\n // if the user has only clicked on the event, display its reservations\n } else {\n return Availability.reservations({ id: event.id }, function (reservations) { $scope.reservations = reservations; });\n }\n };\n\n /**\n * Triggered when fullCalendar tries to graphicaly render an event block.\n * Append the event tag into the block, just after the event title.\n * @see http://fullcalendar.io/docs/event_rendering/eventRender/\n */\n const eventRenderCb = function (event, element) {\n if (event.available_type !== 'event') {\n element.find('.fc-content').prepend('');\n }\n if (event.tags && event.tags.length > 0) {\n let html = '';\n for (const tag of Array.from(event.tags)) {\n html += `${tag.name} `;\n }\n element.find('.fc-title').append(`
${html}`);\n }\n };\n\n /**\n * Triggered when resource fetching starts/stops.\n * @see https://fullcalendar.io/docs/resource_data/loading/\n */\n const loadingCb = function (isLoading, view) {\n if (isLoading && uiCalendarConfig.calendars.calendar) {\n // we remove existing events when fetching starts to prevent duplicates\n uiCalendarConfig.calendars.calendar.fullCalendar('removeEvents');\n }\n };\n\n /**\n * Triggered when the view is changed\n * @see https://fullcalendar.io/docs/v3/viewRender#v2\n */\n const viewRenderCb = function (view, element) {\n // we unselect the current event to keep consistency\n $scope.availability = null;\n $scope.availabilityDom = null;\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n\n]);\n\n/**\n * Controller used in the slot creation modal window\n */\nApplication.Controllers.controller('CreateEventModalController', ['$scope', '$uibModalInstance', '$sce', 'moment', 'start', 'end', 'slots', 'machinesPromise', 'Availability', 'trainingsPromise', 'spacesPromise', 'tagsPromise', 'plansPromise', 'groupsPromise', 'slotDurationPromise', 'growl', '_t',\n function ($scope, $uibModalInstance, $sce, moment, start, end, slots, machinesPromise, Availability, trainingsPromise, spacesPromise, tagsPromise, plansPromise, groupsPromise, slotDurationPromise, growl, _t) {\n // $uibModal parameter\n $scope.start = start;\n\n // $uibModal parameter\n $scope.end = end;\n\n // machines list\n $scope.machines = machinesPromise.filter(function (m) { return !m.disabled; });\n\n // trainings list\n $scope.trainings = trainingsPromise.filter(function (t) { return !t.disabled; });\n\n // spaces list\n $scope.spaces = spacesPromise.filter(function (s) { return !s.disabled; });\n\n // all tags list\n $scope.tags = tagsPromise;\n\n $scope.isOnlySubscriptions = false;\n $scope.selectedPlans = [];\n $scope.selectedPlansBinding = {};\n // list of plans, classified by group\n $scope.plansClassifiedByGroup = [];\n\n // machines associated with the created slot\n $scope.selectedMachines = [];\n $scope.selectedMachinesBinding = {};\n\n // training associated with the created slot\n $scope.selectedTraining = null;\n\n // space associated with the created slot\n $scope.selectedSpace = null;\n\n // UI step\n $scope.step = 1;\n\n // the user is not able to edit the ending time of the availability, unless he set the type to 'training'\n $scope.endDateReadOnly = true;\n\n // timepickers configuration\n $scope.timepickers = {\n start: {\n hstep: 1,\n mstep: 5\n },\n end: {\n hstep: 1,\n mstep: 5\n }\n };\n\n // slot details\n $scope.availability = {\n start_at: start,\n end_at: end,\n available_type: 'machines', // default\n tag_ids: [],\n is_recurrent: false,\n period: 'week',\n nb_periods: 1,\n end_date: undefined, // recurrence end\n slot_duration: parseInt(slotDurationPromise.setting.value, 10)\n };\n\n // recurrent slots\n $scope.occurrences = [];\n\n // localized name(s) of the reservable item(s)\n $scope.reservableName = '';\n\n // localized name(s) of the selected tag(s)\n $scope.tagsName = '';\n\n // localized name(s) of the selected plan(s)\n $scope.plansName = '';\n\n // number of slots for this availability\n $scope.slots_nb = slots;\n\n /**\n * Adds or removes the provided machine from the current slot\n * @param machine {Object}\n */\n $scope.toggleSelection = function (machine) {\n const index = $scope.selectedMachines.indexOf(machine);\n if (index > -1) {\n return $scope.selectedMachines.splice(index, 1);\n } else {\n return $scope.selectedMachines.push(machine);\n }\n };\n\n /**\n * Select/unselect all the machines\n */\n $scope.toggleAll = function () {\n const count = $scope.selectedMachines.length;\n $scope.selectedMachines = [];\n $scope.selectedMachinesBinding = {};\n if (count === 0) {\n $scope.machines.forEach(function (machine) {\n $scope.selectedMachines.push(machine);\n $scope.selectedMachinesBinding[machine.id] = true;\n });\n }\n };\n\n /**\n * Adds or removes the provided plan from the current slot\n * @param plan {Object}\n */\n $scope.toggleSelectPlan = function (plan) {\n const index = $scope.selectedPlans.indexOf(plan);\n if (index > -1) {\n return $scope.selectedPlans.splice(index, 1);\n } else {\n return $scope.selectedPlans.push(plan);\n }\n };\n\n /**\n * Select/unselect all the plans\n */\n $scope.toggleAllPlans = function () {\n const count = $scope.selectedPlans.length;\n $scope.selectedPlans = [];\n $scope.selectedPlansBinding = {};\n if (count === 0) {\n plansPromise.filter(p => !p.disabled).forEach(function (plan) {\n $scope.selectedPlans.push(plan);\n $scope.selectedPlansBinding[plan.id] = true;\n });\n }\n };\n\n /**\n * Callback for the modal window validation: save the slot and closes the modal\n */\n $scope.ok = function () {\n if ($scope.availability.available_type === 'machines') {\n if ($scope.selectedMachines.length > 0) {\n $scope.availability.machine_ids = $scope.selectedMachines.map(function (m) { return m.id; });\n } else {\n growl.error(_t('app.admin.calendar.you_should_select_at_least_a_machine'));\n return;\n }\n } else if ($scope.availability.available_type === 'training') {\n $scope.availability.training_ids = [$scope.selectedTraining.id];\n } else if ($scope.availability.available_type === 'space') {\n $scope.availability.space_ids = [$scope.selectedSpace.id];\n }\n if ($scope.availability.is_recurrent) {\n $scope.availability.occurrences = $scope.occurrences;\n }\n if ($scope.isOnlySubscriptions && $scope.selectedPlans.length > 0) {\n $scope.availability.plan_ids = $scope.selectedPlans.map(function (p) { return p.id; });\n }\n return Availability.save(\n { availability: $scope.availability },\n function (availability) { $uibModalInstance.close(availability); }\n );\n };\n\n /**\n * Move the modal UI to the next step\n */\n $scope.next = function () {\n if ($scope.step === 1) { return validateType(); }\n if ($scope.step === 2) { return validateSelection(); }\n if ($scope.step === 3) { return validateTimes(); }\n if ($scope.step === 5) { return validateRecurrence(); }\n return $scope.step++;\n };\n\n /**\n * Move the modal UI to the next step\n */\n $scope.previous = function () { return $scope.step--; };\n\n /**\n * Callback to cancel the slot creation\n */\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n\n /**\n * For training/space availabilities, set the maximum number of people allowed registering on this slot.\n * Also, set the default slot duration\n */\n $scope.setNbTotalPlaces = function () {\n if ($scope.availability.available_type === 'training') {\n $scope.availability.nb_total_places = $scope.selectedTraining.nb_total_places;\n } else if ($scope.availability.available_type === 'space') {\n $scope.availability.nb_total_places = $scope.selectedSpace.default_places;\n }\n };\n\n /*\n * Test if the current availability type is divided in slots\n */\n $scope.isTypeDivided = function () {\n return isTypeDivided($scope.availability.available_type);\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n if ($scope.trainings.length > 0) {\n $scope.selectedTraining = $scope.trainings[0];\n }\n if ($scope.spaces.length > 0) {\n $scope.selectedSpace = $scope.spaces[0];\n }\n\n // when disable is only subscriptions option, reset all selected plans\n $scope.$watch('isOnlySubscriptions', function (value) {\n if (!value) {\n $scope.selectedPlans = [];\n $scope.selectedPlansBinding = {};\n }\n });\n\n // group plans by Group\n for (const group of groupsPromise.filter(g => !g.disabled)) {\n const groupObj = { id: group.id, name: group.name, plans: [] };\n for (const plan of plansPromise.filter(g => !g.disabled)) {\n if (plan.group_id === group.id) { groupObj.plans.push(plan); }\n }\n if (groupObj.plans.length > 0) {\n $scope.plansClassifiedByGroup.push(groupObj);\n }\n }\n\n // When the slot duration changes, we increment the availability to match the value\n $scope.$watch('availability.slot_duration', function (newValue, oldValue, scope) {\n if (newValue === undefined) return;\n\n const startSlot = moment($scope.start);\n startSlot.add(newValue * $scope.slots_nb, 'minutes');\n $scope.end = startSlot.toDate();\n });\n\n // When the number of slot changes, we increment the availability to match the value\n $scope.$watch('slots_nb', function (newValue, oldValue, scope) {\n const startSlot = moment($scope.start);\n startSlot.add($scope.availability.slot_duration * newValue, 'minutes');\n $scope.end = startSlot.toDate();\n });\n\n // When we configure a machine/space availability, do not let the user change the end time, as the total\n // time must be dividable by $scope.availability.slot_duration minutes (base slot duration). For training availabilities, the user\n // can configure any duration as it does not matters.\n $scope.$watch('availability.available_type', function (newValue, oldValue, scope) {\n if (isTypeDivided(newValue)) {\n $scope.endDateReadOnly = true;\n const slotDuration = $scope.availability.slot_duration || parseInt(slotDurationPromise.setting.value, 10);\n const slotsCurrentRange = Math.trunc(($scope.end.valueOf() - $scope.start.valueOf()) / (60 * 1000)) / slotDuration;\n if (!Number.isInteger(slotsCurrentRange)) {\n // otherwise, round it to upper decimal\n const upperSlots = Math.ceil(slotsCurrentRange);\n const upper = upperSlots * $scope.availability.slot_duration;\n $scope.end = moment($scope.start).add(upper, 'minutes').toDate();\n $scope.slots_nb = upperSlots;\n } else {\n $scope.slots_nb = slotsCurrentRange;\n }\n $scope.availability.end_at = $scope.end;\n } else {\n $scope.endDateReadOnly = false;\n }\n });\n\n // When the start date is changed, if we are configuring a machine/space availability,\n // maintain the relative length of the slot (ie. change the end time accordingly)\n $scope.$watch('start', function (newValue, oldValue, scope) {\n // adjust the end time\n const endSlot = moment($scope.end);\n endSlot.add(moment(newValue).diff(oldValue), 'milliseconds');\n $scope.end = endSlot.toDate();\n\n // update availability object\n $scope.availability.start_at = $scope.start;\n });\n\n // Maintain consistency between the end time and the date object in the availability object\n $scope.$watch('end', function (newValue, oldValue, scope) {\n if (newValue.valueOf() !== oldValue.valueOf()) {\n // we prevent the admin from setting the end of the availability before its beginning\n if (moment($scope.start).add($scope.availability.slot_duration, 'minutes').isAfter(newValue)) {\n $scope.end = oldValue;\n }\n // update availability object\n $scope.availability.end_at = $scope.end;\n }\n });\n };\n\n /*\n * Test if the provided availability type is divided in slots\n */\n const isTypeDivided = function (type) {\n return ((type === 'machines') || (type === 'space'));\n };\n\n /**\n * Validates that a machine or more was/were selected before continuing to step 3 (adjust time + tags)\n */\n const validateSelection = function () {\n if ($scope.availability.available_type === 'machines') {\n if ($scope.selectedMachines.length === 0) {\n return growl.error(_t('app.admin.calendar.you_should_select_at_least_a_machine'));\n }\n }\n $scope.step++;\n };\n\n /**\n * Validates that the slots/availability date and times are correct\n */\n const validateTimes = function () {\n if (moment($scope.end).isSameOrBefore($scope.start)) {\n return growl.error(_t('app.admin.calendar.inconsistent_times'));\n }\n if ($scope.isTypeDivided()) {\n if (!$scope.slots_nb) {\n return growl.error(_t('app.admin.calendar.min_one_slot'));\n }\n if (!$scope.availability.slot_duration) {\n return growl.error(_t('app.admin.calendar.min_slot_duration'));\n }\n }\n $scope.step++;\n };\n\n /**\n * Validates that the recurrence parameters were correctly set before continuing to step 5 (summary)\n */\n const validateRecurrence = function () {\n if ($scope.availability.is_recurrent) {\n if (!$scope.availability.period) {\n return growl.error(_t('app.admin.calendar.select_period'));\n }\n if (!$scope.availability.nb_periods || $scope.availability.nb_periods < 1) {\n return growl.error(_t('app.admin.calendar.select_nb_period'));\n }\n if (!$scope.availability.end_date) {\n return growl.error(_t('app.admin.calendar.select_end_date'));\n }\n }\n // settings are ok\n computeOccurrences();\n computeNames();\n $scope.step++;\n };\n\n /**\n * Initialize some settings, depending on the availability type, before continuing to step 2 (select a machine/training/space)\n */\n const validateType = function () {\n $scope.setNbTotalPlaces();\n if ($scope.availability.available_type === 'training') {\n $scope.availability.slot_duration = undefined;\n } else {\n $scope.availability.slot_duration = parseInt(slotDurationPromise.setting.value, 10);\n }\n $scope.step++;\n };\n\n /**\n * Compute the various occurrences of the availability, according to the recurrence settings\n */\n const computeOccurrences = function () {\n $scope.occurrences = [];\n\n if ($scope.availability.is_recurrent) {\n const date = moment($scope.availability.start_at);\n const diff = moment($scope.availability.end_at).diff($scope.availability.start_at);\n const end = moment($scope.availability.end_date).endOf('day');\n while (date.isBefore(end)) {\n const occur_end = moment(date).add(diff, 'ms');\n $scope.occurrences.push({\n start_at: date.toDate(),\n end_at: occur_end.toDate()\n });\n date.add($scope.availability.nb_periods, $scope.availability.period);\n }\n } else {\n $scope.occurrences.push({\n start_at: $scope.availability.start_at,\n end_at: $scope.availability.end_at\n });\n }\n };\n\n const computeNames = function () {\n $scope.reservableName = '';\n switch ($scope.availability.available_type) {\n case 'machines':\n $scope.reservableName = localizedList($scope.selectedMachines);\n break;\n case 'training':\n $scope.reservableName = `${$scope.selectedTraining.name}`;\n break;\n case 'space':\n $scope.reservableName = `${$scope.selectedSpace.name}`;\n break;\n default:\n $scope.reservableName = `${_t('app.admin.calendar.none')}`;\n }\n const tags = $scope.tags.filter(function (t) {\n return $scope.availability.tag_ids.indexOf(t.id) > -1;\n });\n $scope.tagsName = localizedList(tags);\n if ($scope.isOnlySubscriptions && $scope.selectedPlans.length > 0) {\n $scope.plansName = localizedList($scope.selectedPlans);\n }\n };\n\n const localizedList = function (items) {\n if (items.length === 0) return `${_t('app.admin.calendar.none')}`;\n\n const names = items.map(function (i) { return $sce.trustAsHtml(`${i.name}`); });\n if (items.length > 1) return names.slice(0, -1).join(', ') + ` ${_t('app.admin.calendar.and')} ` + names[names.length - 1];\n\n return names[0];\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the slot deletion modal window\n */\nApplication.Controllers.controller('DeleteRecurrentAvailabilityController', ['$scope', '$uibModalInstance', 'Availability', 'availabilityPromise', 'growl', '_t',\n function ($scope, $uibModalInstance, Availability, availabilityPromise, growl, _t) {\n // is the current slot (to be deleted) recurrent?\n $scope.isRecurrent = availabilityPromise.is_recurrent;\n\n // with recurrent slots: how many slots should we delete?\n $scope.deleteMode = 'single';\n\n /**\n * Confirmation callback\n */\n $scope.ok = function () {\n const { id, start_at, end_at } = availabilityPromise;\n // the admin has confirmed, delete the slot\n Availability.delete(\n { id, mode: $scope.deleteMode },\n function (res) {\n // delete success\n if (res.deleted > 1) {\n growl.success(_t(\n 'app.admin.calendar.slots_deleted',\n { START: moment(start_at).format('LL LT'), COUNT: res.deleted - 1 }\n ));\n } else {\n growl.success(_t(\n 'app.admin.calendar.slot_successfully_deleted',\n { START: moment(start_at).format('LL LT'), END: moment(end_at).format('LT') }\n ));\n }\n $uibModalInstance.close({\n status: 'success',\n availabilities: res.details.map(function (d) { return d.availability.id; })\n });\n },\n function (res) {\n // not everything was deleted\n const { data } = res;\n if (data.total > 1) {\n growl.warning(_t(\n 'app.admin.calendar.slots_not_deleted',\n { TOTAL: data.total, COUNT: data.total - data.deleted }\n ));\n } else {\n growl.error(_t(\n 'app.admin.calendar.unable_to_delete_the_slot',\n { START: moment(start_at).format('LL LT'), END: moment(end_at).format('LT') }\n ));\n }\n $uibModalInstance.close({\n status: 'failed',\n availabilities: data.details.filter(function (d) { return d.status; }).map(function (d) { return d.availability.id; })\n });\n });\n };\n\n /**\n * Cancellation callback\n */\n $scope.cancel = function () {\n $uibModalInstance.dismiss('cancel');\n };\n }\n]);\n\n/**\n * Controller used in the iCalendar (ICS) imports management page\n */\n\nApplication.Controllers.controller('AdminICalendarController', ['$scope', 'iCalendars', 'ICalendar', 'dialogs', 'growl', '_t',\n function ($scope, iCalendars, ICalendar, dialogs, growl, _t) {\n // list of ICS sources\n $scope.calendars = iCalendars;\n\n // configuration of a new ICS source\n $scope.newCalendar = {\n color: undefined,\n text_color: undefined,\n url: undefined,\n name: undefined,\n text_hidden: false\n };\n\n /**\n * Save the new iCalendar in database\n */\n $scope.save = function () {\n ICalendar.save({}, { i_calendar: $scope.newCalendar }, function (data) {\n // success\n $scope.calendars.push(data);\n $scope.newCalendar.url = undefined;\n $scope.newCalendar.name = undefined;\n $scope.newCalendar.color = null;\n $scope.newCalendar.text_color = null;\n $scope.newCalendar.text_hidden = false;\n }, function (error) {\n // failed\n growl.error(_t('app.admin.icalendar.create_error'));\n console.error(error);\n });\n };\n\n /**\n * Return a CSS-like style of the given calendar configuration\n * @param calendar\n */\n $scope.calendarStyle = function (calendar) {\n return {\n 'border-color': calendar.color,\n color: calendar.text_color,\n width: calendar.text_hidden ? '50px' : 'auto',\n height: calendar.text_hidden ? '21px' : 'auto'\n };\n };\n\n /**\n * Delete the given calendar from the database\n * @param calendar\n */\n $scope.delete = function (calendar) {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.icalendar.confirmation_required'),\n msg: _t('app.admin.icalendar.confirm_delete_import')\n };\n }\n }\n },\n function () {\n ICalendar.delete(\n { id: calendar.id },\n function () {\n // success\n const idx = $scope.calendars.indexOf(calendar);\n $scope.calendars.splice(idx, 1);\n growl.info(_t('app.admin.icalendar.delete_success'));\n }, function (error) {\n // failed\n growl.error(_t('app.admin.icalendar.delete_failed'));\n console.error(error);\n }\n );\n }\n );\n };\n\n /**\n * Asynchronously re-fetches the events from the given calendar\n * @param calendar\n */\n $scope.sync = function (calendar) {\n ICalendar.sync(\n { id: calendar.id },\n function () {\n // success\n growl.info(_t('app.admin.icalendar.refresh'));\n }, function (error) {\n // failed\n growl.error(_t('app.admin.icalendar.sync_failed'));\n console.error(error);\n }\n );\n };\n }\n]);\n","/* COMMON CODE */\n\n// The validity per user defines how many time a user may ba able to use the same coupon\n// Here are the various options for this parameter\nconst VALIDITIES = ['once', 'forever'];\n\n/**\n * Controller used in the coupon creation page\n */\nApplication.Controllers.controller('NewCouponController', ['$scope', '$state', 'Coupon', 'growl', '_t',\n function ($scope, $state, Coupon, growl, _t) {\n // Values for the coupon currently created\n $scope.coupon = {\n active: true,\n type: 'percent_off'\n };\n\n // Options for the validity per user\n $scope.validities = VALIDITIES;\n\n // Default parameters for AngularUI-Bootstrap datepicker (used for coupon validity limit selection)\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n minDate: moment().toDate(),\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * Return a localized human-readable name for the provided validity\n */\n $scope.validityName = function (validity) {\n return _t(`app.shared.coupon.${validity}`);\n };\n\n /**\n * Shows/hides the validity limit datepicker\n * @param $event {Object} jQuery event object\n */\n $scope.toggleDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n $scope.datePicker.opened = !$scope.datePicker.opened;\n };\n\n /**\n * Callback to save the new coupon in $scope.coupon and redirect the user to the listing page\n */\n $scope.saveCoupon = () =>\n Coupon.save({ coupon: $scope.coupon }, coupon => $state.go('app.admin.pricing')\n , function (err) {\n growl.error(_t('app.admin.coupons_new.unable_to_create_the_coupon_check_code_already_used'));\n console.error(err);\n });\n }\n]);\n\n/**\n * Controller used in the coupon edition page\n */\nApplication.Controllers.controller('EditCouponController', ['$scope', '$state', 'Coupon', 'couponPromise', '_t', 'growl',\n function ($scope, $state, Coupon, couponPromise, _t, growl) {\n /* PUBLIC SCOPE */\n\n // Used in the form to freeze unmodifiable fields\n $scope.mode = 'EDIT';\n\n // Coupon to edit\n $scope.coupon = couponPromise;\n\n // Options for the validity per user\n $scope.validities = VALIDITIES;\n\n // Mapping for validation errors\n $scope.errors = {};\n\n // Default parameters for AngularUI-Bootstrap datepicker (used for coupon validity limit selection)\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n minDate: moment().toDate(),\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * Return a localized human-readable name for the provided validity\n */\n $scope.validityName = function (validity) {\n return _t(`app.shared.coupon.${validity}`);\n };\n\n /**\n * Shows/hides the validity limit datepicker\n * @param $event {Object} jQuery event object\n */\n $scope.toggleDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n $scope.datePicker.opened = !$scope.datePicker.opened;\n };\n\n /**\n * Callback to save the coupon's changes to the API\n */\n $scope.updateCoupon = function () {\n $scope.errors = {};\n Coupon.update({ id: $scope.coupon.id }, { coupon: $scope.coupon }, coupon => $state.go('app.admin.pricing')\n , function (err) {\n growl.error(_t('app.admin.coupons_edit.unable_to_update_the_coupon_an_error_occurred'));\n $scope.errors = err.data;\n });\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n // parse the date if any\n if (couponPromise.valid_until) {\n $scope.coupon.valid_until = moment(couponPromise.valid_until).toDate();\n }\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n","/* eslint-disable\n camelcase,\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/* COMMON CODE */\n\n/**\n * Provides a set of common properties and methods to the $scope parameter. They are used\n * in the various events' admin controllers.\n *\n * Provides :\n * - $scope.datePicker = {}\n * - $scope.submited(content)\n * - $scope.cancel()\n * - $scope.addFile()\n * - $scope.deleteFile(file)\n * - $scope.fileinputClass(v)\n * - $scope.toggleStartDatePicker($event)\n * - $scope.toggleEndDatePicker($event)\n * - $scope.toggleRecurrenceEnd(e)\n * - $scope.addPrice()\n * - $scope.removePrice(price, $event)\n *\n * Requires :\n * - $scope.event.event_files_attributes = []\n * - $state (Ui-Router) [ 'app.public.events_list' ]\n */\nclass EventsController {\n constructor ($scope, $state) {\n // default parameters for AngularUI-Bootstrap datepicker\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n startOpened: false, // default: datePicker is not shown\n endOpened: false,\n recurrenceEndOpened: false,\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * For use with ngUpload (https://github.com/twilson63/ngUpload).\n * Intended to be the callback when an upload is done: any raised error will be stacked in the\n * $scope.alerts array. If everything goes fine, the user is redirected to the project page.\n * @param content {Object} JSON - The upload's result\n */\n $scope.submited = function (content) {\n $scope.onSubmited(content);\n };\n\n /**\n * Changes the user's view to the events list page\n */\n $scope.cancel = function () { $state.go('app.public.events_list'); };\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n\n /**\n * This will create a single new empty entry into the event's attachements list.\n */\n $scope.addFile = function () { $scope.event.event_files_attributes.push({}); };\n\n /**\n * This will remove the given file from the event's attachements list. If the file was previously uploaded\n * to the server, it will be marked for deletion on the server. Otherwise, it will be simply truncated from\n * the attachements array.\n * @param file {Object} the file to delete\n */\n $scope.deleteFile = function (file) {\n const index = $scope.event.event_files_attributes.indexOf(file);\n if (file.id != null) {\n return file._destroy = true;\n } else {\n return $scope.event.event_files_attributes.splice(index, 1);\n }\n };\n\n /**\n * Show/Hide the \"start\" datepicker (open the drop down/close it)\n */\n $scope.toggleStartDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n return $scope.datePicker.startOpened = !$scope.datePicker.startOpened;\n };\n\n /**\n * Show/Hide the \"end\" datepicker (open the drop down/close it)\n */\n $scope.toggleEndDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n return $scope.datePicker.endOpened = !$scope.datePicker.endOpened;\n };\n\n /**\n * Masks/displays the recurrence pane allowing the admin to set the current event as recursive\n */\n $scope.toggleRecurrenceEnd = function (e) {\n e.preventDefault();\n e.stopPropagation();\n return $scope.datePicker.recurrenceEndOpened = !$scope.datePicker.recurrenceEndOpened;\n };\n\n /**\n * Initialize a new price item in the additional prices list\n */\n $scope.addPrice = function () {\n $scope.event.prices.push({\n category: null,\n amount: null\n });\n };\n\n /**\n * Remove the price or mark it as 'to delete'\n */\n $scope.removePrice = function (price, event) {\n event.preventDefault();\n event.stopPropagation();\n if (price.id) {\n price._destroy = true;\n } else {\n const index = $scope.event.prices.indexOf(price);\n $scope.event.prices.splice(index, 1);\n }\n };\n }\n}\n\n/**\n * Controller used in the events listing page (admin view)\n */\nApplication.Controllers.controller('AdminEventsController', ['$scope', '$state', 'dialogs', '$uibModal', 'growl', 'AuthService', 'Event', 'Category', 'EventTheme', 'AgeRange', 'PriceCategory', 'eventsPromise', 'categoriesPromise', 'themesPromise', 'ageRangesPromise', 'priceCategoriesPromise', '_t', 'Member', 'uiTourService', 'settingsPromise',\n function ($scope, $state, dialogs, $uibModal, growl, AuthService, Event, Category, EventTheme, AgeRange, PriceCategory, eventsPromise, categoriesPromise, themesPromise, ageRangesPromise, priceCategoriesPromise, _t, Member, uiTourService, settingsPromise) {\n /* PUBLIC SCOPE */\n\n // By default, the pagination mode is activated to limit the page size\n $scope.paginateActive = true;\n\n // The events displayed on the page\n $scope.events = eventsPromise;\n\n // Current virtual page\n $scope.page = 1;\n\n // Temporary datastore for creating new elements\n $scope.inserted = {\n category: null,\n theme: null,\n age_range: null\n };\n\n // List of categories for the events\n $scope.categories = categoriesPromise;\n\n // List of events themes\n $scope.themes = themesPromise;\n\n // List of age ranges\n $scope.ageRanges = ageRangesPromise;\n\n // List of price categories for the events\n $scope.priceCategories = priceCategoriesPromise;\n\n // Default: we display all events (no restriction)\n $scope.eventsScope =\n { selected: '' };\n\n // default tab: events list\n $scope.tabs = { active: 0 };\n\n /**\n * Adds a bucket of events to the bottom of the page, grouped by month\n */\n $scope.loadMoreEvents = function () {\n $scope.page += 1;\n return Event.query({ page: $scope.page, scope: $scope.eventsScope.selected }, function (data) {\n $scope.events = $scope.events.concat(data);\n return paginationCheck(data, $scope.events);\n });\n };\n\n /**\n * Saves a new element / Update an existing one to the server (form validation callback)\n * @param model {string} model name\n * @param data {Object} element name\n * @param [id] {number} element id, in case of update\n */\n $scope.saveElement = function (model, data, id) {\n if (id != null) {\n return getModel(model)[0].update({ id }, data);\n } else {\n return getModel(model)[0].save(data, function (resp) { getModel(model)[1][getModel(model)[1].length - 1].id = resp.id; });\n }\n };\n\n /**\n * Deletes the element at the specified index\n * @param model {string} model name\n * @param index {number} element index in the $scope[model] array\n */\n $scope.removeElement = function (model, index) {\n if ((model === 'category') && (getModel(model)[1].length === 1)) {\n growl.error(_t('app.admin.events.at_least_one_category_is_required') + ' ' + _t('app.admin.events.unable_to_delete_the_last_one'));\n return false;\n }\n if (getModel(model)[1][index].related_to > 0) {\n growl.error(_t('app.admin.events.unable_to_delete_ELEMENT_already_in_use_NUMBER_times', { ELEMENT: model, NUMBER: getModel(model)[1][index].related_to }));\n return false;\n }\n return dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.admin.events.confirmation_required'),\n msg: _t('app.admin.events.do_you_really_want_to_delete_this_ELEMENT', { ELEMENT: model })\n };\n }\n }\n }\n , function () { // delete confirmed\n getModel(model)[0].delete(getModel(model)[1][index], null, function () { getModel(model)[1].splice(index, 1); }\n , function () { growl.error(_t('app.admin.events.unable_to_delete_an_error_occured')); });\n });\n };\n\n /**\n * Creates a new empty entry in the $scope[model] array\n * @param model {string} model name\n */\n $scope.addElement = function (model) {\n $scope.inserted[model] = {\n name: '',\n related_to: 0\n };\n return getModel(model)[1].push($scope.inserted[model]);\n };\n\n /**\n * Removes the newly inserted but not saved element / Cancel the current element modification\n * @param model {string} model name\n * @param rowform {Object} see http://vitalets.github.io/angular-xeditable/\n * @param index {number} element index in the $scope[model] array\n */\n $scope.cancelElement = function (model, rowform, index) {\n if (getModel(model)[1][index].id != null) {\n return rowform.$cancel();\n } else {\n return getModel(model)[1].splice(index, 1);\n }\n };\n\n /**\n * Open a modal dialog allowing the definition of a new price category.\n * Save it once filled and handle the result.\n */\n $scope.newPriceCategory = function () {\n $uibModal.open({\n templateUrl: '/admin/events/price_form.html',\n size: 'md',\n resolve: {\n category () { return {}; }\n },\n controller: 'PriceCategoryController' }).result['finally'](null).then(function (p_cat) {\n // save the price category to the API\n PriceCategory.save(p_cat, function (cat) {\n $scope.priceCategories.push(cat);\n return growl.success(_t('app.admin.events.price_category_successfully_created'));\n }\n , function (err) {\n growl.error(_t('app.admin.events.unable_to_add_the_price_category_check_name_already_used'));\n return console.error(err);\n });\n });\n };\n /**\n * Update the given price category with the new properties\n * to specify in a modal dialog\n * @param index {number} index of the caterory in the $scope.priceCategories array\n * @param id {number} price category ID, must match the ID of the category at the index specified above\n */\n $scope.editPriceCategory = function (id, index) {\n if ($scope.priceCategories[index].id !== id) {\n return growl.error(_t('app.admin.events.unexpected_error_occurred_please_refresh'));\n } else {\n return $uibModal.open({\n templateUrl: '/admin/events/price_form.html',\n size: 'md',\n resolve: {\n category () { return $scope.priceCategories[index]; }\n },\n controller: 'PriceCategoryController' }).result['finally'](null).then(function (p_cat) {\n // update the price category to the API\n PriceCategory.update({ id }, { price_category: p_cat }, function (cat) {\n $scope.priceCategories[index] = cat;\n return growl.success(_t('app.admin.events.price_category_successfully_updated'));\n }\n , function (err) {\n growl.error(_t('app.admin.events.unable_to_update_the_price_category'));\n return console.error(err);\n });\n });\n }\n };\n\n /**\n * Delete the given price category from the API\n * @param index {number} index of the caterory in the $scope.priceCategories array\n * @param id {number} price category ID, must match the ID of the category at the index specified above\n */\n $scope.removePriceCategory = function (id, index) {\n if ($scope.priceCategories[index].id !== id) {\n return growl.error(_t('app.admin.events.unexpected_error_occurred_please_refresh'));\n } else if ($scope.priceCategories[index].events > 0) {\n return growl.error(_t('app.admin.events.unable_to_delete_this_price_category_because_it_is_already_used'));\n } else {\n return dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.events.confirmation_required'),\n msg: _t('app.admin.events.do_you_really_want_to_delete_this_price_category')\n };\n }\n }\n },\n function () { // delete confirmed\n PriceCategory.remove(\n { id },\n function () { // successfully deleted\n growl.success(_t('app.admin.events.price_category_successfully_deleted'));\n $scope.priceCategories.splice(index, 1);\n },\n function () { growl.error(_t('app.admin.events.price_category_deletion_failed')); }\n );\n }\n );\n }\n };\n\n /**\n * Triggered when the admin changes the events filter (all, passed, future).\n * We request the first page of corresponding events to the API\n */\n $scope.changeScope = function () {\n Event.query({ page: 1, scope: $scope.eventsScope.selected }, function (data) {\n $scope.events = data;\n return paginationCheck(data, $scope.events);\n });\n return $scope.page = 1;\n };\n\n\n /**\n * Setup the feature-tour for the admin/events page.\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupEventsTour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('events');\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.admin.tour.events.welcome.title'),\n content: _t('app.admin.tour.events.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n uitour.createStep({\n selector: '.events-management .events-list',\n stepId: 'list',\n order: 1,\n title: _t('app.admin.tour.events.list.title'),\n content: _t('app.admin.tour.events.list.content'),\n placement: 'top'\n });\n uitour.createStep({\n selector: '.events-management .events-list-filter',\n stepId: 'filter',\n order: 2,\n title: _t('app.admin.tour.events.filter.title'),\n content: _t('app.admin.tour.events.filter.content'),\n placement: 'bottom'\n });\n if (AuthService.isAuthorized('admin')) {\n uitour.createStep({\n selector: '.events-management .events-categories',\n stepId: 'categories',\n order: 3,\n title: _t('app.admin.tour.events.categories.title'),\n content: _t('app.admin.tour.events.categories.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.events-management .events-themes',\n stepId: 'themes',\n order: 4,\n title: _t('app.admin.tour.events.themes.title'),\n content: _t('app.admin.tour.events.themes.content'),\n placement: 'top'\n });\n uitour.createStep({\n selector: '.events-management .events-age-ranges',\n stepId: 'ages',\n order: 5,\n title: _t('app.admin.tour.events.ages.title'),\n content: _t('app.admin.tour.events.ages.content'),\n placement: 'top'\n });\n uitour.createStep({\n selector: '.events-management .prices-tab',\n stepId: 'prices',\n order: 6,\n title: _t('app.admin.tour.events.prices.title'),\n content: _t('app.admin.tour.events.prices.content'),\n placement: 'bottom'\n });\n }\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 7,\n title: _t('app.admin.tour.conclusion.title'),\n content: _t('app.admin.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on step change, change the active tab if needed\n uitour.on('stepChanged', function (nextStep) {\n if (nextStep.stepId === 'list' || nextStep.stepId === 'filter') { $scope.tabs.active = 0; }\n if (nextStep.stepId === 'categories' || nextStep.stepId === 'ages') { $scope.tabs.active = 1; }\n if (nextStep.stepId === 'prices') { $scope.tabs.active = 2; }\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('events') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'events' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('events') < 0) {\n uitour.start();\n }\n }\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n paginationCheck(eventsPromise, $scope.events);\n };\n\n /**\n * Check if all events are already displayed OR if the button 'load more events'\n * is required\n * @param lastEvents {Array} last events loaded onto the diplay (ie. last \"page\")\n * @param events {Array} full list of events displayed on the page (not only the last retrieved)\n */\n const paginationCheck = function (lastEvents, events) {\n if (lastEvents.length > 0) {\n if (events.length >= lastEvents[0].nb_total_events) {\n return $scope.paginateActive = false;\n } else {\n return $scope.paginateActive = true;\n }\n } else {\n return $scope.paginateActive = false;\n }\n };\n\n /**\n * Return the model and the datastore matching the given name\n * @param name {string} 'category', 'theme' or 'age_range'\n * @return {[Object, Array]} model and datastore\n */\n const getModel = function (name) {\n switch (name) {\n case 'category': return [Category, $scope.categories];\n case 'theme': return [EventTheme, $scope.themes];\n case 'age_range': return [AgeRange, $scope.ageRanges];\n default: return [null, []];\n }\n };\n\n // init the controller (call at the end !)\n return initialize();\n }\n\n]);\n\n/**\n * Controller used in the reservations listing page for a specific event\n */\nApplication.Controllers.controller('ShowEventReservationsController', ['$scope', 'eventPromise', 'reservationsPromise', function ($scope, eventPromise, reservationsPromise) {\n // retrieve the event from the ID provided in the current URL\n $scope.event = eventPromise;\n\n // list of reservations for the current event\n $scope.reservations = reservationsPromise;\n\n /**\n * Test if the provided reservation has been cancelled\n * @param reservation {Reservation}\n * @returns {boolean}\n */\n $scope.isCancelled = function(reservation) {\n return !!(reservation.slots[0].canceled_at);\n }\n}]);\n\n/**\n * Controller used in the event creation page\n */\nApplication.Controllers.controller('NewEventController', ['$scope', '$state', 'CSRF', 'categoriesPromise', 'themesPromise', 'ageRangesPromise', 'priceCategoriesPromise', '_t',\n function ($scope, $state, CSRF, categoriesPromise, themesPromise, ageRangesPromise, priceCategoriesPromise, _t) {\n CSRF.setMetaTags();\n\n // API URL where the form will be posted\n $scope.actionUrl = '/api/events/';\n\n // Form action on the above URL\n $scope.method = 'post';\n\n // List of categories for the events\n $scope.categories = categoriesPromise;\n\n // List of events themes\n $scope.themes = themesPromise;\n\n // List of age ranges\n $scope.ageRanges = ageRangesPromise;\n\n // List of availables price's categories\n $scope.priceCategories = priceCategoriesPromise;\n\n // Default event parameters\n $scope.event = {\n event_files_attributes: [],\n start_date: new Date(),\n end_date: new Date(),\n start_time: new Date(),\n end_time: new Date(),\n all_day: 'false',\n recurrence: 'none',\n category_id: null,\n prices: []\n };\n\n // Possible types of recurrences for an event\n $scope.recurrenceTypes = [\n { label: _t('app.admin.events_new.none'), value: 'none' },\n { label: _t('app.admin.events_new.every_days'), value: 'day' },\n { label: _t('app.admin.events_new.every_week'), value: 'week' },\n { label: _t('app.admin.events_new.every_month'), value: 'month' },\n { label: _t('app.admin.events_new.every_year'), value: 'year' }\n ];\n\n // triggered when the new event form was submitted to the API and have received an answer\n $scope.onSubmited = function(content) {\n if ((content.id == null)) {\n $scope.alerts = [];\n angular.forEach(content, function (v, k) {\n angular.forEach(v, function (err) { $scope.alerts.push({ msg: k + ': ' + err, type: 'danger' }); });\n });\n } else {\n $state.go('app.public.events_list');\n }\n };\n\n // Using the EventsController\n return new EventsController($scope, $state);\n }\n]);\n\n/**\n * Controller used in the events edition page\n */\nApplication.Controllers.controller('EditEventController', ['$scope', '$state', '$stateParams', 'CSRF', 'eventPromise', 'categoriesPromise', 'themesPromise', 'ageRangesPromise', 'priceCategoriesPromise', '$uibModal', 'growl', '_t',\n function ($scope, $state, $stateParams, CSRF, eventPromise, categoriesPromise, themesPromise, ageRangesPromise, priceCategoriesPromise, $uibModal, growl, _t) {\n /* PUBLIC SCOPE */\n\n // API URL where the form will be posted\n $scope.actionUrl = `/api/events/${$stateParams.id}`;\n\n // Form action on the above URL\n $scope.method = 'put';\n\n // Retrieve the event details, in case of error the user is redirected to the events listing\n $scope.event = eventPromise;\n\n // We'll keep track of the initial dates here, for later comparison\n $scope.initialDates = {};\n\n // List of categories for the events\n $scope.categories = categoriesPromise;\n\n // List of available price's categories\n $scope.priceCategories = priceCategoriesPromise;\n\n // List of events themes\n $scope.themes = themesPromise;\n\n // List of age ranges\n $scope.ageRanges = ageRangesPromise;\n\n // Default edit-mode for periodic event\n $scope.editMode = 'single';\n\n // show edit-mode modal if event is recurrent\n $scope.isShowEditModeModal = $scope.event.recurrence_events.length > 0;\n\n $scope.editRecurrent = function (e) {\n if ($scope.isShowEditModeModal && $scope.event.recurrence_events.length > 0) {\n e.preventDefault();\n\n // open a choice edit-mode dialog\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/events/editRecurrent.html',\n size: 'md',\n controller: 'EditRecurrentEventController',\n resolve: {\n editMode: function () { return $scope.editMode; },\n initialDates: function () { return $scope.initialDates; },\n currentEvent: function () { return $scope.event; }\n }\n });\n // submit form event by edit-mode\n modalInstance.result.then(function(res) {\n $scope.isShowEditModeModal = false;\n $scope.editMode = res.editMode;\n e.target.click();\n });\n }\n };\n\n // triggered when the edit event form was submitted to the API and have received an answer\n $scope.onSubmited = function(data) {\n if (data.total === data.updated) {\n if (data.updated > 1) {\n growl.success(_t(\n 'app.admin.events_edit.events_updated',\n {COUNT: data.updated - 1}\n ));\n } else {\n growl.success(_t(\n 'app.admin.events_edit.event_successfully_updated'\n ));\n }\n } else {\n if (data.total > 1) {\n growl.warning(_t(\n 'app.admin.events_edit.events_not_updated',\n {TOTAL: data.total, COUNT: data.total - data.updated}\n ));\n if (_.find(data.details, { error: 'EventPriceCategory' })) {\n growl.error(_t(\n 'app.admin.events_edit.error_deleting_reserved_price'\n ));\n } else {\n growl.error(_t(\n 'app.admin.events_edit.other_error'\n ));\n }\n } else {\n growl.error(_t(\n 'app.admin.events_edit.unable_to_update_the_event'\n ));\n if (data.details[0].error === 'EventPriceCategory') {\n growl.error(_t(\n 'app.admin.events_edit.error_deleting_reserved_price'\n ));\n } else {\n growl.error(_t(\n 'app.admin.events_edit.other_error'\n ));\n }\n }\n }\n $state.go('app.public.events_list');\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n CSRF.setMetaTags();\n\n // init the dates to JS objects\n $scope.event.start_date = moment($scope.event.start_date).toDate();\n $scope.event.end_date = moment($scope.event.end_date).toDate();\n\n $scope.initialDates = {\n start: new Date($scope.event.start_date.valueOf()),\n end: new Date($scope.event.end_date.valueOf())\n };\n\n // Using the EventsController\n return new EventsController($scope, $state);\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the event edit-mode modal window\n */\nApplication.Controllers.controller('EditRecurrentEventController', ['$scope', '$uibModalInstance', 'editMode', 'growl', 'initialDates', 'currentEvent', '_t',\n function ($scope, $uibModalInstance, editMode, growl, initialDates, currentEvent, _t) {\n // with recurrent slots: how many slots should we update?\n $scope.editMode = editMode;\n\n /**\n * Confirmation callback\n */\n $scope.ok = function () {\n $uibModalInstance.close({\n editMode: $scope.editMode\n });\n }\n\n /**\n * Test if any of the dates of the event has changed\n */\n $scope.hasDateChanged = function() {\n return (!moment(initialDates.start).isSame(currentEvent.start_date, 'day') || !moment(initialDates.end).isSame(currentEvent.end_date, 'day'));\n }\n\n /**\n * Cancellation callback\n */\n $scope.cancel = function () {\n $uibModalInstance.dismiss('cancel');\n }\n }\n]);\n","/* eslint-disable\n camelcase,\n no-return-assign,\n no-undef,\n no-unreachable,\n no-unused-vars,\n standard/no-callback-literal,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\nApplication.Controllers.controller('GraphsController', ['$scope', '$state', '$rootScope', 'es', 'Statistics', '_t',\n function ($scope, $state, $rootScope, es, Statistics, _t) {\n /* PRIVATE STATIC CONSTANTS */\n\n // height of the HTML/SVG charts elements in pixels\n const CHART_HEIGHT = 500;\n\n // Label of the charts' horizontal axes\n const X_AXIS_LABEL = _t('app.admin.stats_graphs.date');\n\n // Label of the charts' vertical axes\n const Y_AXIS_LABEL = _t('app.admin.stats_graphs.number');\n\n // Colors for the line charts. Each new line uses the next color in this array\n const CHART_COLORS = ['#b35a94', '#1c5794', '#00b49e', '#6fac48', '#ebcf4a', '#fd7e33', '#ca3436', '#a26e3a'];\n\n /* PUBLIC SCOPE */\n\n // ui-view transitions optimization: if true, the charts will never be refreshed\n $scope.preventRefresh = false;\n\n // statistics structure in elasticSearch\n $scope.statistics = [];\n\n // statistics data recovered from elasticSearch\n $scope.data = null;\n\n // default interval: one day\n $scope.display =\n { interval: 'week' };\n\n // active tab will be set here\n $scope.selectedIndex = null;\n\n // ui-bootstrap active tab index\n $scope.selectedTab = 0;\n\n // for palmares graphs, filters values are stored here\n $scope.ranking = {\n sortCriterion: 'ca',\n groupCriterion: 'subType'\n };\n\n // default: we do not open the datepicker menu\n $scope.datePicker =\n { show: false };\n\n // datePicker parameters for interval beginning\n $scope.datePickerStart = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n minDate: null,\n maxDate: moment().subtract(1, 'day').toDate(),\n selected: moment().utc().subtract(1, 'months').subtract(1, 'day').startOf('day').toDate(),\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n // datePicker parameters for interval ending\n $scope.datePickerEnd = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n minDate: null,\n maxDate: moment().subtract(1, 'day').toDate(),\n selected: moment().subtract(1, 'day').endOf('day').toDate(),\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * Callback to open the datepicker (interval start)\n * @param {Object} jQuery event object\n */\n $scope.toggleStartDatePicker = $event => toggleDatePicker($event, $scope.datePickerStart);\n\n /**\n * Callback to open the datepicker (interval end)\n * @param {Object} jQuery event object\n */\n $scope.toggleEndDatePicker = $event => toggleDatePicker($event, $scope.datePickerEnd);\n\n /**\n * Callback called when the active tab is changed.\n * Recover the current tab and store its value in $scope.selectedIndex\n * @param tab {Object} elasticsearch statistic structure\n * @param index {number} index of the tab in the $scope.statistics array\n */\n $scope.setActiveTab = function (tab, index) {\n $scope.selectedIndex = tab;\n $scope.selectedTab = index;\n $scope.ranking.groupCriterion = 'subType';\n if (tab.ca) {\n $scope.ranking.sortCriterion = 'ca';\n } else {\n $scope.ranking.sortCriterion = tab.types[0].key;\n }\n return refreshChart();\n };\n\n /**\n * Returns true if the provided tab must be hidden due to some global or local configuration\n * @param tab {Object} elasticsearch statistic structure (from statistic_indices table)\n */\n $scope.hiddenTab = function (tab) {\n if (tab.graph) {\n return !((tab.es_type_key === 'subscription' && !$rootScope.modules.plans) ||\n (tab.es_type_key === 'training' && !$rootScope.modules.trainings));\n }\n return false;\n };\n\n /**\n * Callback to close the date-picking popup and refresh the results\n */\n $scope.validateDateChange = function () {\n $scope.datePicker.show = false;\n return refreshChart();\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n Statistics.query(function (stats) {\n $scope.statistics = stats;\n // watch the interval changes to refresh the graph\n $scope.$watch(scope => scope.display.interval\n , (newValue, oldValue) => refreshChart());\n $scope.$watch(scope => scope.ranking.sortCriterion\n , (newValue, oldValue) => refreshChart());\n $scope.$watch(scope => scope.ranking.groupCriterion\n , (newValue, oldValue) => refreshChart());\n return refreshChart();\n\n // set the default tab to \"machines\" if \"subscriptions\" are disabled\n if (!$rootScope.modules.plans) {\n const idx = $scope.statistics.findIndex(s => s.es_type_key === 'machine');\n $scope.setActiveTab($scope.statistics[idx], idx);\n } else {\n const idx = $scope.statistics.findIndex(s => s.es_type_key === 'subscription');\n $scope.setActiveTab($scope.statistics[idx], idx);\n }\n });\n\n // workaround for angular-bootstrap::tabs behavior: on tab deletion, another tab will be selected\n // which will cause every tabs to reload, one by one, when the view is closed\n $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\n if ((fromState.name === 'app.admin.stats_graphs') && (Object.keys(fromParams).length === 0)) {\n return $scope.preventRefresh = true;\n }\n });\n };\n\n /**\n * Generic function to toggle a bootstrap datePicker\n * @param $event {Object} jQuery event object\n * @param datePicker {Object} settings object of the concerned datepicker. Must have an 'opened' property\n */\n var toggleDatePicker = function ($event, datePicker) {\n $event.preventDefault();\n $event.stopPropagation();\n return datePicker.opened = !datePicker.opened;\n };\n\n /**\n * Query elasticSearch according to the current parameters and update the chart\n */\n var refreshChart = function () {\n if ($scope.selectedIndex && !$scope.preventRefresh) {\n return query($scope.selectedIndex, function (aggregations, error) {\n if (error) {\n return console.error(error);\n } else {\n if ($scope.selectedIndex.graph.chart_type !== 'discreteBarChart') {\n $scope.data = formatAggregations(aggregations);\n return angular.forEach($scope.data, (datum, key) => updateChart($scope.selectedIndex.graph.chart_type, datum, key));\n } else {\n $scope.data = formatRankingAggregations(aggregations, $scope.selectedIndex.graph.limit, $scope.ranking.groupCriterion);\n return updateChart($scope.selectedIndex.graph.chart_type, $scope.data.ranking, $scope.selectedIndex.es_type_key);\n }\n }\n });\n }\n };\n\n /**\n * Callback used in NVD3 to print timestamps as literal dates on the X axis\n */\n const xAxisTickFormatFunction = function (d, x, y) {\n /* WARNING !! These tests (typeof/instanceof) may become broken on nvd3 update */\n if ($scope.display.interval === 'day') {\n if ((typeof d === 'number') || d instanceof Date) {\n return d3.time.format(Fablab.d3DateFormat)(moment(d).toDate());\n } else { // typeof d == 'string'\n return d;\n }\n } else if ($scope.display.interval === 'week') {\n if ((typeof x === 'number') || d instanceof Date) {\n return d3.time.format(_t('app.admin.stats_graphs.week_short') + ' %U')(moment(d).toDate());\n } else if (typeof d === 'number') {\n return _t('app.admin.stats_graphs.week_of_START_to_END', { START: moment(d).format('L'), END: moment(d).add(6, 'days').format('L') });\n } else { // typeof d == 'string'\n return d;\n }\n } else if ($scope.display.interval === 'month') {\n if (typeof d === 'number') {\n const label = moment(d).format('MMMM YYYY');\n return label.substr(0, 1).toUpperCase() + label.substr(1).toLowerCase();\n } else { // typeof d == 'string'\n return d;\n }\n }\n };\n\n /**\n * Format aggregations as retuned by elasticSearch to an understandable format for NVD3\n * @param aggs {Object} as returned by elasticsearch\n */\n var formatAggregations = function (aggs) {\n const format = {};\n\n angular.forEach(aggs, function (type, type_key) { // go through aggs[$TYPE] where $TYPE = month|year|hour|booking|...\n format[type_key] = [];\n if (type.subgroups) {\n return angular.forEach(type.subgroups.buckets, subgroup => // go through aggs.$TYPE.subgroups.buckets where each bucket represent a $SUBTYPE\n angular.forEach($scope.selectedIndex.types, function (cur_type) { // in the mean time, go through the types of the current index (active tab) ...\n if (cur_type.key === type_key) { // ... looking for the type matching $TYPE\n return (() => {\n const result = [];\n for (let it_st = 0, end = cur_type.subtypes.length - 1; it_st <= end; it_st++) { // when we've found it, iterate over its subtypes ...\n const cur_subtype = cur_type.subtypes[it_st];\n if (subgroup.key === cur_subtype.key) { // ... which match $SUBTYPE\n // then we construct NVD3 dataSource according to these information\n var dataSource = {\n values: [],\n key: cur_subtype.label,\n total: 0,\n color: CHART_COLORS[it_st],\n area: true\n };\n // finally, we iterate over 'intervals' buckets witch contains\n // per date aggregations for our current dataSource\n angular.forEach(subgroup.intervals.buckets, function (interval) {\n dataSource.values.push({\n x: interval.key,\n y: interval.total.value\n });\n return dataSource.total += parseInt(interval.total.value);\n });\n dataSource.key += ` (${dataSource.total})`;\n result.push(format[type_key].push(dataSource));\n } else {\n result.push(undefined);\n }\n }\n return result;\n })();\n }\n })\n );\n }\n });\n return format;\n };\n\n /**\n * Format aggregations for ranking charts to an understandable format for NVD3\n * @param aggs {Object} as returned by elasticsearch\n * @param limit {number} limit the number of stats in the bar chart\n * @param typeKey {String} field name witch results are grouped by\n */\n var formatRankingAggregations = function (aggs, limit, typeKey) {\n const format =\n { ranking: [] };\n\n let it = 0;\n while (it < aggs.subgroups.buckets.length) {\n const bucket = aggs.subgroups.buckets[it];\n const dataSource = {\n values: [],\n key: getRankingLabel(bucket.key, typeKey),\n color: CHART_COLORS[it],\n area: true\n };\n dataSource.values.push({\n x: getRankingLabel(bucket.key, typeKey),\n y: bucket.total.value\n });\n format.ranking.push(dataSource);\n it++;\n }\n const getY = object => object.values[0].y;\n format.ranking = stableSort(format.ranking, 'DESC', getY).slice(0, limit);\n for (let i = 0, end = format.ranking.length; i <= end; i++) {\n if (typeof format.ranking[i] === 'undefined') { format.ranking.splice(i, 1); }\n }\n return format;\n };\n\n /**\n * For BarCharts, return the label for a given bar\n * @param key {string} raw value of the label\n * @param typeKey {string} name of the field the results are grouped by\n */\n var getRankingLabel = function (key, typeKey) {\n if ($scope.selectedIndex) {\n if (typeKey === 'subType') {\n for (let type of Array.from($scope.selectedIndex.types)) {\n for (let subtype of Array.from(type.subtypes)) {\n if (subtype.key === key) {\n return subtype.label;\n }\n }\n }\n } else {\n for (let field of Array.from($scope.selectedIndex.additional_fields)) {\n if (field.key === typeKey) {\n switch (field.data_type) {\n case 'date': return moment(key).format('LL'); break;\n case 'list': return key.name; break;\n default: return key;\n }\n }\n }\n }\n }\n };\n\n /**\n * Prepare the elasticSearch query for the stats matching the current controller's parameters\n * @param index {{id:{number}, es_type_key:{string}, label:{string}, table:{boolean}, additional_fields:{Array},\n * types:{Array}, graph:{Object}}} elasticSearch type in stats index to query\n * @param callback {function} function be to run after results were retrieved,\n * it will receive two parameters : results {Array}, error {String} (if any)\n */\n var query = function (index, callback) {\n // invalid callback handeling\n if (typeof (callback) !== 'function') {\n console.error('[graphsController::query] Error: invalid callback provided');\n return;\n }\n if (!index) {\n callback([], '[graphsController::query] Error: invalid index provided');\n return;\n }\n\n if (index.graph.chart_type !== 'discreteBarChart') {\n // list statistics types\n const stat_types = [];\n for (let t of Array.from(index.types)) {\n if (t.graph) {\n stat_types.push(t.key);\n }\n }\n\n // exception handeling\n if (stat_types.length === 0) {\n callback([], 'Error: Unable to retrieve any graphical statistic types in the provided index');\n }\n\n let type_it = 0;\n const results = {};\n let error = '';\n var recursiveCb = function () {\n if (type_it < stat_types.length) {\n return queryElasticStats(index.es_type_key, stat_types[type_it], function (prevResults, prevError) {\n if (prevError) {\n console.error(`[graphsController::query] ${prevError}`);\n error += `\\n${prevError}`;\n }\n results[stat_types[type_it]] = prevResults;\n type_it++;\n return recursiveCb();\n });\n } else {\n return callback(results);\n }\n };\n return recursiveCb();\n } else { // palmares (ranking)\n return queryElasticRanking(index.es_type_key, $scope.ranking.groupCriterion, $scope.ranking.sortCriterion, function (results, error) {\n if (error) {\n return callback([], error);\n } else {\n return callback(results);\n }\n });\n }\n };\n\n /**\n * Run the elasticSearch query to retreive the /stats/type aggregations\n * @param esType {String} elasticSearch document type (subscription|machine|training|...)\n * @param statType {String} statistics type (year|month|hour|booking|...)\n * @param callback {function} function be to run after results were retrieved,\n * it will receive two parameters : results {Array}, error {String} (if any)\n */\n var queryElasticStats = function (esType, statType, callback) {\n // handle invalid callback\n if (typeof (callback) !== 'function') {\n console.error('[graphsController::queryElasticStats] Error: invalid callback provided');\n return;\n }\n if (!esType || !statType) {\n callback([], '[graphsController::queryElasticStats] Error: invalid parameters provided');\n }\n\n // run query\n return es.search({\n 'index': 'stats',\n 'type': esType,\n 'searchType': 'query_then_fetch',\n 'size': 0,\n 'stat-type': statType,\n 'custom-query': '',\n 'start-date': moment($scope.datePickerStart.selected).format(),\n 'end-date': moment($scope.datePickerEnd.selected).format(),\n 'body': buildElasticAggregationsQuery(statType, $scope.display.interval, moment($scope.datePickerStart.selected), moment($scope.datePickerEnd.selected))\n }\n , function (error, response) {\n if (error) {\n return callback([], `Error: something unexpected occurred during elasticSearch query: ${error}`);\n } else {\n return callback(response.aggregations);\n }\n });\n };\n\n /**\n * For ranking displays, run the elasticSearch query to retreive the /stats/type aggregations\n * @param esType {string} elasticSearch document type (subscription|machine|training|...)\n * @param groupKey {string} statistics subtype or custom field\n * @param sortKey {string} statistics type or 'ca'\n * @param callback {function} function be to run after results were retrieved,\n * it will receive two parameters : results {Array}, error {String} (if any)\n */\n var queryElasticRanking = function (esType, groupKey, sortKey, callback) {\n // handle invalid callback\n if (typeof (callback) !== 'function') {\n return console.error('[graphsController::queryElasticRanking] Error: invalid callback provided');\n }\n if (!esType || !groupKey || !sortKey) {\n return callback([], '[graphsController::queryElasticRanking] Error: invalid parameters provided');\n }\n\n // run query\n return es.search({\n 'index': 'stats',\n 'type': esType,\n 'searchType': 'query_then_fetch',\n 'size': 0,\n 'body': buildElasticAggregationsRankingQuery(groupKey, sortKey, moment($scope.datePickerStart.selected), moment($scope.datePickerEnd.selected))\n }\n , function (error, response) {\n if (error) {\n return callback([], `Error: something unexpected occurred during elasticSearch query: ${error}`);\n } else {\n return callback(response.aggregations);\n }\n });\n };\n\n /**\n * Parse a final elastic results bucket and return a D3 compatible object\n * @param bucket {{key_as_string:{String}, key:{Number}, doc_count:{Number}, total:{{value:{Number}}}}} interval bucket\n */\n const parseElasticBucket = bucket => [ bucket.key, bucket.total.value ];\n\n /**\n * Build an object representing the content of the REST-JSON query to elasticSearch, based on the parameters\n * currently defined for data aggegations.\n * @param type {String} statistics type (visit|rdv|rating|ca|plan|account|search|...)\n * @param interval {String} statistics interval (year|quarter|month|week|day|hour|minute|second)\n * @param intervalBegin {moment} statitics interval beginning (moment.js type)\n * @param intervalEnd {moment} statitics interval ending (moment.js type)\n */\n var buildElasticAggregationsQuery = function (type, interval, intervalBegin, intervalEnd) {\n const q = {\n 'query': {\n 'bool': {\n 'must': [\n {\n 'match': {\n 'type': type\n }\n },\n {\n 'range': {\n 'date': {\n 'gte': intervalBegin.format(),\n 'lte': intervalEnd.format()\n }\n }\n }\n ]\n }\n },\n 'aggregations': {\n 'subgroups': {\n 'terms': {\n 'field': 'subType'\n }, // TODO allow aggregate by custom field\n 'aggregations': {\n 'intervals': {\n 'date_histogram': {\n 'field': 'date',\n 'interval': interval,\n 'min_doc_count': 0,\n 'extended_bounds': {\n 'min': intervalBegin.valueOf(),\n 'max': intervalEnd.valueOf()\n }\n },\n 'aggregations': {\n 'total': {\n 'sum': {\n 'field': 'stat'\n }\n }\n }\n }\n }\n }\n }\n };\n\n // scale weeks on sunday as nvd3 supports only these weeks\n if (interval === 'week') {\n q.aggregations.subgroups.aggregations.intervals.date_histogram['offset'] = '-1d';\n // scale days to UTC time\n } else if (interval === 'day') {\n const offset = moment().utcOffset();\n q.aggregations.subgroups.aggregations.intervals.date_histogram['offset'] = (-offset) + 'm';\n }\n return q;\n };\n\n /**\n * Build an object representing the content of the REST-JSON query to elasticSearch, based on the parameters\n * currently defined for data aggegations.\n * @param groupKey {String} statistics subtype or custom field\n * @param sortKey {String} statistics type or 'ca'\n * @param intervalBegin {moment} statitics interval beginning (moment.js type)\n * @param intervalEnd {moment} statitics interval ending (moment.js type)\n */\n var buildElasticAggregationsRankingQuery = function (groupKey, sortKey, intervalBegin, intervalEnd) {\n const q = {\n 'query': {\n 'bool': {\n 'must': [\n {\n 'range': {\n 'date': {\n 'gte': intervalBegin.format(),\n 'lte': intervalEnd.format()\n }\n }\n },\n {\n 'term': {\n 'type': 'booking'\n }\n }\n ]\n }\n },\n 'aggregations': {\n 'subgroups': {\n 'terms': {\n 'field': groupKey,\n 'size': 10,\n 'order': {\n 'total': 'desc'\n }\n },\n 'aggregations': {\n 'top_events': {\n 'top_hits': {\n 'size': 1,\n 'sort': [\n { 'ca': 'desc' }\n ]\n }\n },\n 'total': {\n 'sum': {\n 'field': 'stat'\n }\n }\n }\n }\n }\n };\n\n // results must be sorted and limited later by angular\n if (sortKey !== 'ca') {\n angular.forEach(q.query.bool.must, function (must) {\n if (must.term) {\n return must.term.type = sortKey;\n }\n });\n } else {\n q.aggregations.subgroups.aggregations.total.sum.field = sortKey;\n }\n\n return q;\n };\n\n /**\n * Redraw the NDV3 chart using the provided data\n * @param chart_type {String} stackedAreaChart|discreteBarChart|lineChart\n * @param data {Array} array of NVD3 dataSources\n * @param type {String} which chart to update (statistic type key)\n */\n var updateChart = function (chart_type, data, type) {\n const id = `#chart-${type} svg`;\n\n // clean old charts\n d3.selectAll(id + ' > *').remove();\n\n return nv.addGraph(function () {\n // no data or many dates, display line charts\n let chart;\n if ((data.length === 0) || ((data[0].values.length > 1) && (chart_type !== 'discreteBarChart'))) {\n if (chart_type === 'stackedAreaChart') {\n chart = nv.models.stackedAreaChart().useInteractiveGuideline(true);\n } else {\n chart = nv.models.lineChart().useInteractiveGuideline(true);\n }\n\n if (data.length > 0) {\n if ($scope.display.interval === 'day') {\n setTimeScale(chart.xAxis, chart.xScale, [d3.time.day, data[0].values.length]);\n } else if ($scope.display.interval === 'week') {\n setTimeScale(chart.xAxis, chart.xScale, [d3.time.week, data[0].values.length]);\n } else if ($scope.display.interval === 'month') {\n setTimeScale(chart.xAxis, chart.xScale, [d3.time.month, data[0].values.length]);\n }\n }\n\n chart.xAxis.tickFormat(xAxisTickFormatFunction);\n chart.yAxis.tickFormat(d3.format('d'));\n\n chart.xAxis.axisLabel(X_AXIS_LABEL);\n chart.yAxis.axisLabel(Y_AXIS_LABEL);\n\n // only one date, display histograms\n } else {\n chart = nv.models.discreteBarChart();\n chart.tooltip.enabled(false);\n chart.showValues(true);\n chart.x(d => d.label);\n chart.y(d => d.value);\n data = prepareDataForBarChart(data, type);\n }\n\n // common for each charts\n chart.margin({ left: 100, right: 100 });\n chart.noData(_t('app.admin.stats_graphs.no_data_for_this_period'));\n chart.height(CHART_HEIGHT);\n\n // add new chart to the page\n d3.select(id).datum(data).transition().duration(350).call(chart);\n\n // resize the graph when the page is resized\n nv.utils.windowResize(chart.update);\n // return the chart\n return chart;\n });\n };\n\n /**\n * Given an NVD3 line chart axis, scale it to display ordinated dates, according to the given arguments\n */\n var setTimeScale = function (nvd3Axis, nvd3Scale, argsArray) {\n const scale = d3.time.scale();\n\n nvd3Axis.scale(scale);\n nvd3Scale(scale);\n\n if (!argsArray && !argsArray.length) {\n const oldTicks = nvd3Axis.axis.ticks;\n return nvd3Axis.axis.ticks = () => oldTicks.apply(nvd3Axis.axis, argsArray);\n }\n };\n\n /**\n * Translate line chart data in dates row to bar chart data, one bar per type.\n */\n var prepareDataForBarChart = function (data, type) {\n const newData = [{\n key: type,\n values: []\n }\n ];\n for (let info of Array.from(data)) {\n if (info) {\n newData[0].values.push({\n 'label': info.key,\n 'value': info.values[0].y,\n 'color': info.color\n });\n }\n }\n\n return newData;\n };\n\n /**\n * Sort the provided array, in the specified order, on the value returned by the callback.\n * This is a stable-sorting algorithm implementation, ie. two call with the same array will return the same results\n * orders, especially with equal values.\n * @param array {Array} the array to sort\n * @param order {string} 'ASC' or 'DESC'\n * @param getValue {function} the callback which will return the value on which the sort will occurs\n * @returns {Array}\n */\n var stableSort = function (array, order, getValue) {\n // prepare sorting\n const keys_order = [];\n const result = [];\n for (let i = 0, end = array.length; i <= end; i++) {\n keys_order[array[i]] = i;\n result.push(array[i]);\n }\n\n // callback for javascript native Array.sort()\n const sort_fc = function (a, b) {\n const val_a = getValue(a);\n const val_b = getValue(b);\n if (val_a === val_b) {\n return keys_order[a] - keys_order[b];\n }\n if (val_a < val_b) {\n if (order === 'ASC') {\n return -1;\n } else { return 1; }\n } else {\n if (order === 'ASC') {\n return 1;\n } else { return -1; }\n }\n };\n\n // finish the sort\n result.sort(sort_fc);\n return result;\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n","/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nApplication.Controllers.controller('GroupsController', ['$scope', 'groupsPromise', 'Group', 'growl', '_t', function ($scope, groupsPromise, Group, growl, _t) {\n // List of users groups\n $scope.groups = groupsPromise;\n\n // Default: we show only enabled groups\n $scope.groupFiltering = 'enabled';\n\n // Available options for filtering groups by status\n $scope.filterDisabled = [\n 'enabled',\n 'disabled',\n 'all'\n ];\n\n /**\n * Removes the newly inserted but not saved group / Cancel the current group modification\n * @param rowform {Object} see http://vitalets.github.io/angular-xeditable/\n * @param index {number} group index in the $scope.groups array\n */\n $scope.cancelGroup = function (rowform, index) {\n if ($scope.groups[index].id != null) {\n return rowform.$cancel();\n } else {\n return $scope.groups.splice(index, 1);\n }\n };\n\n /**\n * Creates a new empty entry in the $scope.groups array\n */\n $scope.addGroup = function () {\n $scope.inserted =\n { name: '' };\n return $scope.groups.push($scope.inserted);\n };\n\n /**\n * Saves a new group / Update an existing group to the server (form validation callback)\n * @param data {Object} group name\n * @param [id] {number} group id, in case of update\n */\n $scope.saveGroup = function (data, id) {\n if (id != null) {\n return Group.update({ id }, { group: data }, response => growl.success(_t('app.admin.members.group_form.changes_successfully_saved'))\n , error => growl.error(_t('app.admin.members.group_form.an_error_occurred_while_saving_changes')));\n } else {\n return Group.save({ group: data }, function (resp) {\n growl.success(_t('app.admin.members.group_form.new_group_successfully_saved'));\n return $scope.groups[$scope.groups.length - 1].id = resp.id;\n }\n , function (error) {\n growl.error(_t('app.admin.members.group_form.an_error_occurred_when_saving_the_new_group'));\n return $scope.groups.splice($scope.groups.length - 1, 1);\n });\n }\n };\n\n /**\n * Deletes the group at the specified index\n * @param index {number} group index in the $scope.groups array\n */\n $scope.removeGroup = index =>\n Group.delete({ id: $scope.groups[index].id }, function (resp) {\n growl.success(_t('app.admin.members.group_form.group_successfully_deleted'));\n return $scope.groups.splice(index, 1);\n }\n , error => growl.error(_t('app.admin.members.group_form.unable_to_delete_group_because_some_users_and_or_groups_are_still_linked_to_it')));\n\n /**\n * Enable/disable the group at the specified index\n * @param index {number} group index in the $scope.groups array\n */\n return $scope.toggleDisableGroup = function (index) {\n const group = $scope.groups[index];\n if (!group.disabled && (group.users > 0)) {\n return growl.error(_t('app.admin.members.group_form.unable_to_disable_group_with_users', { USERS: group.users }));\n } else {\n return Group.update({ id: group.id }, { group: { disabled: !group.disabled } }, function (response) {\n $scope.groups[index] = response;\n return growl.success(_t('app.admin.members.group_form.group_successfully_enabled_disabled', { STATUS: response.disabled }));\n }\n , error => growl.error(_t('app.admin.members.group_form.unable_to_enable_disable_group', { STATUS: !group.disabled })));\n }\n };\n}\n\n]);\n","/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-undef,\n no-useless-escape,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/**\n * Controller used in the admin invoices listing page\n */\nApplication.Controllers.controller('InvoicesController', ['$scope', '$state', 'Invoice', 'AccountingPeriod', 'AuthService', 'invoices', 'closedPeriods', '$uibModal', 'growl', '$filter', 'Setting', 'settings', 'stripeSecretKey', '_t', 'Member', 'uiTourService', 'Payment', 'onlinePaymentStatus',\n function ($scope, $state, Invoice, AccountingPeriod, AuthService, invoices, closedPeriods, $uibModal, growl, $filter, Setting, settings, stripeSecretKey, _t, Member, uiTourService, Payment, onlinePaymentStatus) {\n /* PRIVATE STATIC CONSTANTS */\n\n // number of invoices loaded each time we click on 'load more...'\n const INVOICES_PER_PAGE = 20;\n\n // fake stripe secret key\n const STRIPE_SK_HIDDEN = 'sk_test_hidden-hidden-hidden-hid';\n\n /* PUBLIC SCOPE */\n\n // default active tab\n $scope.tabs = {\n active: settings.invoicing_module === 'true' ? 0 : 1\n };\n\n // List of all invoices\n $scope.invoices = invoices;\n\n // Invoices filters\n $scope.searchInvoice = {\n date: null,\n name: '',\n reference: ''\n };\n\n // currently displayed page of invoices (search results)\n $scope.page = 1;\n\n // true when all invoices are loaded\n $scope.noMoreResults = false;\n\n // Default invoices ordering/sorting\n $scope.orderInvoice = '-reference';\n\n // Invoice PDF filename settings (and example)\n $scope.file = {\n prefix: settings.invoice_prefix,\n nextId: 40,\n date: moment().format('DDMMYYYY'),\n templateUrl: '/admin/invoices/settings/editPrefix.html'\n };\n\n // Invoices parameters\n $scope.invoice = {\n logo: null,\n reference: {\n model: '',\n help: null,\n templateUrl: '/admin/invoices/settings/editReference.html'\n },\n code: {\n model: '',\n active: true,\n templateUrl: '/admin/invoices/settings/editCode.html'\n },\n number: {\n model: '',\n help: null,\n templateUrl: '/admin/invoices/settings/editNumber.html'\n },\n VAT: {\n rate: 19.6,\n active: false,\n templateUrl: '/admin/invoices/settings/editVAT.html'\n },\n text: {\n content: ''\n },\n legals: {\n content: ''\n }\n };\n\n // Accounting codes\n $scope.settings = {\n journalCode: {\n name: 'accounting_journal_code',\n value: settings.accounting_journal_code\n },\n cardClientCode: {\n name: 'accounting_card_client_code',\n value: settings.accounting_card_client_code\n },\n cardClientLabel: {\n name: 'accounting_card_client_label',\n value: settings.accounting_card_client_label\n },\n walletClientCode: {\n name: 'accounting_wallet_client_code',\n value: settings.accounting_wallet_client_code\n },\n walletClientLabel: {\n name: 'accounting_wallet_client_label',\n value: settings.accounting_wallet_client_label\n },\n otherClientCode: {\n name: 'accounting_other_client_code',\n value: settings.accounting_other_client_code\n },\n otherClientLabel: {\n name: 'accounting_other_client_label',\n value: settings.accounting_other_client_label\n },\n walletCode: {\n name: 'accounting_wallet_code',\n value: settings.accounting_wallet_code\n },\n walletLabel: {\n name: 'accounting_wallet_label',\n value: settings.accounting_wallet_label\n },\n vatCode: {\n name: 'accounting_VAT_code',\n value: settings.accounting_VAT_code\n },\n vatLabel: {\n name: 'accounting_VAT_label',\n value: settings.accounting_VAT_label\n },\n subscriptionCode: {\n name: 'accounting_subscription_code',\n value: settings.accounting_subscription_code\n },\n subscriptionLabel: {\n name: 'accounting_subscription_label',\n value: settings.accounting_subscription_label\n },\n machineCode: {\n name: 'accounting_Machine_code',\n value: settings.accounting_Machine_code\n },\n machineLabel: {\n name: 'accounting_Machine_label',\n value: settings.accounting_Machine_label\n },\n trainingCode: {\n name: 'accounting_Training_code',\n value: settings.accounting_Training_code\n },\n trainingLabel: {\n name: 'accounting_Training_label',\n value: settings.accounting_Training_label\n },\n eventCode: {\n name: 'accounting_Event_code',\n value: settings.accounting_Event_code\n },\n eventLabel: {\n name: 'accounting_Event_label',\n value: settings.accounting_Event_label\n },\n spaceCode: {\n name: 'accounting_Space_code',\n value: settings.accounting_Space_code\n },\n spaceLabel: {\n name: 'accounting_Space_label',\n value: settings.accounting_Space_label\n }\n };\n\n // all settings\n $scope.allSettings = settings;\n\n // is the stripe private set?\n $scope.stripeSecretKey = (stripeSecretKey.isPresent ? STRIPE_SK_HIDDEN : '');\n\n // has any online payment been already made?\n $scope.onlinePaymentStatus = onlinePaymentStatus.status;\n\n // Placeholding date for the invoice creation\n $scope.today = moment();\n\n // Placeholding date for the reservation begin\n $scope.inOneWeek = moment().add(1, 'week').startOf('hour');\n\n // Placeholding date for the reservation end\n $scope.inOneWeekAndOneHour = moment().add(1, 'week').add(1, 'hour').startOf('hour');\n\n /**\n * Change the invoices ordering criterion to the one provided\n * @param orderBy {string} ordering criterion\n */\n $scope.setOrderInvoice = function (orderBy) {\n if ($scope.orderInvoice === orderBy) {\n $scope.orderInvoice = `-${orderBy}`;\n } else {\n $scope.orderInvoice = orderBy;\n }\n\n resetSearchInvoice();\n return invoiceSearch();\n };\n\n /**\n * Open a modal window asking the admin the details to refund the user about the provided invoice\n * @param invoice {Object} invoice inherited from angular's $resource\n */\n $scope.generateAvoirForInvoice = function (invoice) {\n // open modal\n const modalInstance = $uibModal.open({\n templateUrl: '/admin/invoices/avoirModal.html',\n controller: 'AvoirModalController',\n resolve: {\n invoice () { return invoice; },\n closedPeriods () { return AccountingPeriod.query().$promise; },\n lastClosingEnd () { return AccountingPeriod.lastClosingEnd().$promise; }\n }\n });\n\n // once done, update the invoice model and inform the admin\n return modalInstance.result.then(function (res) {\n $scope.invoices.unshift(res.avoir);\n return Invoice.get({ id: invoice.id }, function (data) {\n invoice.has_avoir = data.has_avoir;\n return growl.success(_t('app.admin.invoices.refund_invoice_successfully_created'));\n });\n });\n };\n\n /**\n * Generate an invoice reference sample from the parametrized model\n * @returns {string} invoice reference sample\n */\n $scope.mkReference = function () {\n let sample = $scope.invoice.reference.model;\n if (sample) {\n // invoice number per day (dd..dd)\n sample = sample.replace(/d+(?![^\\[]*])/g, function (match, offset, string) { return padWithZeros(2, match.length); });\n // invoice number per month (mm..mm)\n sample = sample.replace(/m+(?![^\\[]*])/g, function (match, offset, string) { return padWithZeros(12, match.length); });\n // invoice number per year (yy..yy)\n sample = sample.replace(/y+(?![^\\[]*])/g, function (match, offset, string) { return padWithZeros(8, match.length); });\n // date information\n sample = sample.replace(/[YMD]+(?![^\\[]*])/g, function (match, offset, string) { return $scope.today.format(match); });\n // information about online selling (X[text])\n sample = sample.replace(/X\\[([^\\]]+)\\]/g, function (match, p1, offset, string) { return p1; });\n // information about wallet (W[text]) - does not apply here\n sample = sample.replace(/W\\[([^\\]]+)\\]/g, '');\n // information about refunds (R[text]) - does not apply here\n sample = sample.replace(/R\\[([^\\]]+)\\]/g, '');\n // information about payment schedules (S[text]) -does not apply here\n sample = sample.replace(/S\\[([^\\]]+)\\]/g, '');\n }\n return sample;\n };\n\n /**\n * Generate an order number sample from the parametrized model\n * @returns {string} invoice reference sample\n */\n $scope.mkNumber = function () {\n let sample = $scope.invoice.number.model;\n if (sample) {\n // global order number (nn..nn)\n sample = sample.replace(/n+(?![^\\[]*])/g, function (match, offset, string) { return padWithZeros(327, match.length); });\n // order number per year (yy..yy)\n sample = sample.replace(/y+(?![^\\[]*])/g, function (match, offset, string) { return padWithZeros(8, match.length); });\n // order number per month (mm..mm)\n sample = sample.replace(/m+(?![^\\[]*])/g, function (match, offset, string) { return padWithZeros(12, match.length); });\n // order number per day (dd..dd)\n sample = sample.replace(/d+(?![^\\[]*])/g, function (match, offset, string) { return padWithZeros(2, match.length); });\n // date information\n sample = sample.replace(/[YMD]+(?![^\\[]*])/g, function (match, offset, string) { return $scope.today.format(match); });\n }\n return sample;\n };\n\n /**\n * Open a modal dialog allowing the user to edit the invoice reference generation template\n */\n $scope.openEditReference = function () {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: $scope.invoice.reference.templateUrl,\n size: 'lg',\n resolve: {\n model () {\n return $scope.invoice.reference.model;\n }\n },\n controller: ['$scope', '$uibModalInstance', 'model', function ($scope, $uibModalInstance, model) {\n $scope.model = model;\n $scope.ok = function () { $uibModalInstance.close($scope.model); };\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n\n modalInstance.result.then(function (model) {\n Setting.update({ name: 'invoice_reference' }, { value: model }, function (data) {\n $scope.invoice.reference.model = model;\n growl.success(_t('app.admin.invoices.invoice_reference_successfully_saved'));\n }\n , function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_invoice_reference'));\n console.error(error);\n });\n });\n };\n\n /**\n * Open a modal dialog allowing the user to edit the invoice code\n */\n $scope.openEditCode = function () {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: $scope.invoice.code.templateUrl,\n size: 'lg',\n resolve: {\n model () {\n return $scope.invoice.code.model;\n },\n active () {\n return $scope.invoice.code.active;\n }\n },\n controller: ['$scope', '$uibModalInstance', 'model', 'active', function ($scope, $uibModalInstance, model, active) {\n $scope.codeModel = model;\n $scope.isSelected = active;\n\n $scope.ok = function () { $uibModalInstance.close({ model: $scope.codeModel, active: $scope.isSelected }); };\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n\n return modalInstance.result.then(function (result) {\n Setting.update({ name: 'invoice_code-value' }, { value: result.model }, function (data) {\n $scope.invoice.code.model = result.model;\n if (result.active) {\n return growl.success(_t('app.admin.invoices.invoicing_code_succesfully_saved'));\n }\n }\n , function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_invoicing_code'));\n console.error(error);\n });\n\n return Setting.update({ name: 'invoice_code-active' }, { value: result.active ? 'true' : 'false' }, function (data) {\n $scope.invoice.code.active = result.active;\n if (result.active) {\n return growl.success(_t('app.admin.invoices.code_successfully_activated'));\n } else {\n return growl.success(_t('app.admin.invoices.code_successfully_disabled'));\n }\n }\n , function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.invoices.an_error_occurred_while_activating_the_invoicing_code'));\n console.error(error);\n });\n });\n };\n\n /**\n * Open a modal dialog allowing the user to edit the invoice number\n */\n $scope.openEditInvoiceNb = function () {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: $scope.invoice.number.templateUrl,\n size: 'lg',\n resolve: {\n model () {\n return $scope.invoice.number.model;\n }\n },\n controller: ['$scope', '$uibModalInstance', 'model', function ($scope, $uibModalInstance, model) {\n $scope.model = model;\n $scope.ok = function () { $uibModalInstance.close($scope.model); };\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n\n return modalInstance.result.then(function (model) {\n Setting.update({ name: 'invoice_order-nb' }, { value: model }, function (data) {\n $scope.invoice.number.model = model;\n return growl.success(_t('app.admin.invoices.order_number_successfully_saved'));\n }\n , function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_order_number'));\n console.error(error);\n });\n });\n };\n\n /**\n * Open a modal dialog allowing the user to edit the VAT parameters for the invoices\n * The VAT can be disabled and its rate can be configured\n */\n $scope.openEditVAT = function () {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: $scope.invoice.VAT.templateUrl,\n size: 'lg',\n resolve: {\n rate () {\n return $scope.invoice.VAT.rate;\n },\n active () {\n return $scope.invoice.VAT.active;\n },\n rateHistory () {\n return Setting.get({ name: 'invoice_VAT-rate', history: true }).$promise;\n },\n activeHistory () {\n return Setting.get({ name: 'invoice_VAT-active', history: true }).$promise;\n }\n },\n controller: ['$scope', '$uibModalInstance', 'rate', 'active', 'rateHistory', 'activeHistory', function ($scope, $uibModalInstance, rate, active, rateHistory, activeHistory) {\n $scope.rate = rate;\n $scope.isSelected = active;\n $scope.history = [];\n\n $scope.ok = function () { $uibModalInstance.close({ rate: $scope.rate, active: $scope.isSelected }); };\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n\n const initialize = function () {\n rateHistory.setting.history.forEach(function (rate) {\n $scope.history.push({ date: rate.created_at, rate: rate.value, user: rate.user });\n });\n activeHistory.setting.history.forEach(function (v) {\n $scope.history.push({ date: v.created_at, enabled: v.value === 'true', user: v.user });\n });\n };\n\n initialize();\n }]\n });\n\n return modalInstance.result.then(function (result) {\n Setting.update({ name: 'invoice_VAT-rate' }, { value: result.rate + '' }, function (data) {\n $scope.invoice.VAT.rate = result.rate;\n if (result.active) {\n return growl.success(_t('app.admin.invoices.VAT_rate_successfully_saved'));\n }\n }\n , function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_VAT_rate'));\n console.error(error);\n });\n\n return Setting.update({ name: 'invoice_VAT-active' }, { value: result.active ? 'true' : 'false' }, function (data) {\n $scope.invoice.VAT.active = result.active;\n if (result.active) {\n return growl.success(_t('app.admin.invoices.VAT_successfully_activated'));\n } else {\n return growl.success(_t('app.admin.invoices.VAT_successfully_disabled'));\n }\n }\n , function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.invoices.an_error_occurred_while_activating_the_VAT'));\n console.error(error);\n });\n });\n };\n\n /**\n * Open a modal dialog allowing the user to edit the prefix of the invoice file name\n */\n $scope.openEditPrefix = function () {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: $scope.file.templateUrl,\n size: 'lg',\n resolve: {\n model () { return $scope.file.prefix; }\n },\n controller: ['$scope', '$uibModalInstance', 'model', function ($scope, $uibModalInstance, model) {\n $scope.model = model;\n $scope.ok = function () { $uibModalInstance.close($scope.model); };\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n\n return modalInstance.result.then(function (model) {\n Setting.update({ name: 'invoice_prefix' }, { value: model }, function (data) {\n $scope.file.prefix = model;\n return growl.success(_t('app.admin.invoices.prefix_successfully_saved'));\n }\n , function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_prefix'));\n console.error(error);\n });\n });\n };\n\n /**\n * Callback to save the value of the text zone when editing is done\n */\n $scope.textEditEnd = function (event) {\n const parsed = parseHtml($scope.invoice.text.content);\n return Setting.update({ name: 'invoice_text' }, { value: parsed }, function (data) {\n $scope.invoice.text.content = parsed;\n return growl.success(_t('app.admin.invoices.text_successfully_saved'));\n }\n , function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_text'));\n console.error(error);\n });\n };\n\n /**\n * Callback to save the value of the legal information zone when editing is done\n */\n $scope.legalsEditEnd = function (event) {\n const parsed = parseHtml($scope.invoice.legals.content);\n return Setting.update({ name: 'invoice_legals' }, { value: parsed }, function (data) {\n $scope.invoice.legals.content = parsed;\n return growl.success(_t('app.admin.invoices.address_and_legal_information_successfully_saved'));\n }\n , function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_address_and_the_legal_information'));\n console.error(error);\n });\n };\n\n /**\n * Callback when any of the filters changes.\n * Full reload the results list\n */\n $scope.handleFilterChange = function () {\n if (searchTimeout) clearTimeout(searchTimeout);\n searchTimeout = setTimeout(function () {\n resetSearchInvoice();\n invoiceSearch();\n }, 300);\n };\n\n /**\n * Callback for the 'load more' button.\n * Will load the next results of the current search, if any\n */\n $scope.showNextInvoices = function () {\n $scope.page += 1;\n invoiceSearch(true);\n };\n\n /**\n * Open a modal allowing the user to close an accounting period and to\n * view all periods already closed.\n */\n $scope.closeAnAccountingPeriod = function () {\n // open modal\n $uibModal.open({\n templateUrl: '/admin/invoices/closePeriodModal.html',\n controller: 'ClosePeriodModalController',\n backdrop: 'static',\n keyboard: false,\n size: 'lg',\n resolve: {\n periods () { return AccountingPeriod.query().$promise; },\n lastClosingEnd () { return AccountingPeriod.lastClosingEnd().$promise; }\n }\n });\n };\n\n $scope.toggleExportModal = function () {\n $uibModal.open({\n templateUrl: '/admin/invoices/accountingExportModal.html',\n controller: 'AccountingExportModalController',\n size: 'xl'\n });\n };\n\n /**\n * Test if the given date is within a closed accounting period\n * @param date {Date} date to test\n * @returns {boolean} true if closed, false otherwise\n */\n $scope.isDateClosed = function (date) {\n for (const period of closedPeriods) {\n if (moment(date).isBetween(moment.utc(period.start_at).startOf('day'), moment.utc(period.end_at).endOf('day'), null, '[]')) {\n return true;\n }\n }\n return false;\n };\n\n /**\n * Callback to bulk save all settings in the page to the database with their values\n */\n $scope.save = function () {\n Setting.bulkUpdate(\n { settings: Object.values($scope.settings) },\n function () { growl.success(_t('app.admin.invoices.codes_customization_success')); },\n function (error) {\n growl.error('app.admin.invoices.unexpected_error_occurred');\n console.error(error);\n }\n );\n };\n\n /**\n * Return the name of the operator that creates the invoice\n */\n $scope.operatorName = function (invoice) {\n if (!invoice.operator) return '';\n\n return `${invoice.operator.first_name} ${invoice.operator.last_name}`;\n };\n\n /**\n * Open a modal dialog which ask for the stripe keys\n * @param onlinePaymentModule {{name: String, value: String}} setting that defines the next status of the online payment module\n * @return {boolean} false if the keys were not provided\n */\n $scope.requireStripeKeys = function (onlinePaymentModule) {\n // if the online payment is about to be disabled, accept the change without any further question\n if (onlinePaymentModule.value === false) return true;\n\n // otherwise, open a modal to ask for the stripe keys\n const modalInstance = $uibModal.open({\n templateUrl: '/admin/invoices/settings/stripeKeys.html',\n controller: 'StripeKeysModalController',\n resolve: {\n stripeKeys: ['Setting', function (Setting) { return Setting.query({ names: \"['stripe_public_key', 'stripe_secret_key']\" }).$promise; }]\n }\n });\n\n modalInstance.result.then(function (success) {\n if (success) {\n Setting.get({ name: 'stripe_public_key' }, function (res) {\n $scope.allSettings.stripe_public_key = res.setting.value;\n });\n Setting.isPresent({ name: 'stripe_secret_key' }, function (res) {\n $scope.stripeSecretKey = (res.isPresent ? STRIPE_SK_HIDDEN : '');\n });\n Payment.onlinePaymentStatus(function (res) {\n $scope.onlinePaymentStatus = res.status;\n });\n }\n });\n\n // return the promise\n return modalInstance.result;\n };\n\n /**\n * Setup the feature-tour for the admin/invoices page.\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupInvoicesTour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('invoices');\n if (AuthService.isAuthorized('admin')) {\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.admin.tour.invoices.welcome.title'),\n content: _t('app.admin.tour.invoices.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n } else {\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome_manager',\n order: 0,\n title: _t('app.admin.tour.invoices.welcome_manager.title'),\n content: _t('app.admin.tour.invoices.welcome_manager.content'),\n placement: 'bottom',\n orphan: true\n });\n }\n if (settings.invoicing_module === 'true' && $scope.invoices.length > 0) {\n uitour.createStep({\n selector: '.invoices-management .invoices-list',\n stepId: 'list',\n order: 1,\n title: _t('app.admin.tour.invoices.list.title'),\n content: _t('app.admin.tour.invoices.list.content'),\n placement: 'top'\n });\n uitour.createStep({\n selector: '.invoices-management .invoices-list .chained-indicator',\n stepId: 'chained',\n order: 2,\n title: _t('app.admin.tour.invoices.chained.title'),\n content: _t('app.admin.tour.invoices.chained.content'),\n placement: 'right'\n });\n uitour.createStep({\n selector: '.invoices-management .invoices-list .download-button',\n stepId: 'download',\n order: 3,\n title: _t('app.admin.tour.invoices.download.title'),\n content: _t('app.admin.tour.invoices.download.content'),\n placement: 'left'\n });\n uitour.createStep({\n selector: '.invoices-management .invoices-list .refund-button',\n stepId: 'refund',\n order: 4,\n title: _t('app.admin.tour.invoices.refund.title'),\n content: _t('app.admin.tour.invoices.refund.content'),\n placement: 'left'\n });\n }\n if (settings.invoicing_module === 'true') {\n uitour.createStep({\n selector: '.invoices-management .payment-schedules-list',\n stepId: 'payment-schedules',\n order: 5,\n title: _t('app.admin.tour.invoices.payment-schedules.title'),\n content: _t('app.admin.tour.invoices.payment-schedules.content'),\n placement: 'bottom'\n });\n }\n if (AuthService.isAuthorized('admin')) {\n uitour.createStep({\n selector: '.invoices-management .invoices-settings',\n stepId: 'settings',\n order: 6,\n title: _t('app.admin.tour.invoices.settings.title'),\n content: _t('app.admin.tour.invoices.settings.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.invoices-management .accounting-codes-tab',\n stepId: 'codes',\n order: 7,\n title: _t('app.admin.tour.invoices.codes.title'),\n content: _t('app.admin.tour.invoices.codes.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.heading .export-accounting-button',\n stepId: 'export',\n order: 8,\n title: _t('app.admin.tour.invoices.export.title'),\n content: _t('app.admin.tour.invoices.export.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.invoices-management .payment-settings',\n stepId: 'payment',\n order: 9,\n title: _t('app.admin.tour.invoices.payment.title'),\n content: _t('app.admin.tour.invoices.payment.content'),\n placement: 'bottom',\n popupClass: 'shift-left-50'\n });\n uitour.createStep({\n selector: '.heading .close-accounting-periods-button',\n stepId: 'periods',\n order: 10,\n title: _t('app.admin.tour.invoices.periods.title'),\n content: _t('app.admin.tour.invoices.periods.content'),\n placement: 'bottom',\n popupClass: 'shift-left-50'\n });\n }\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 11,\n title: _t('app.admin.tour.conclusion.title'),\n content: _t('app.admin.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on step change, change the active tab if needed\n uitour.on('stepChanged', function (nextStep) {\n if (nextStep.stepId === 'list' || nextStep.stepId === 'refund') {\n $scope.tabs.active = 0;\n }\n if (nextStep.stepId === 'settings') {\n $scope.tabs.active = 1;\n }\n if (nextStep.stepId === 'codes' || nextStep.stepId === 'export') {\n $scope.tabs.active = 2;\n }\n if (nextStep.stepId === 'payment') {\n $scope.tabs.active = 3;\n }\n if (nextStep.stepId === 'payment-schedules') {\n $scope.tabs.active = 4;\n }\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('invoices') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'invoices' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settings.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('invoices') < 0) {\n uitour.start();\n }\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n if (!invoices[0] || (invoices[0].maxInvoices <= $scope.invoices.length)) {\n $scope.noMoreResults = true;\n }\n\n // retrieve settings from the DB through the API\n $scope.invoice.legals.content = settings.invoice_legals;\n $scope.invoice.text.content = settings.invoice_text;\n $scope.invoice.VAT.rate = parseFloat(settings['invoice_VAT-rate']);\n $scope.invoice.VAT.active = (settings['invoice_VAT-active'] === 'true');\n $scope.invoice.number.model = settings['invoice_order-nb'];\n $scope.invoice.code.model = settings['invoice_code-value'];\n $scope.invoice.code.active = (settings['invoice_code-active'] === 'true');\n $scope.invoice.reference.model = settings.invoice_reference;\n $scope.invoice.logo = {\n filetype: 'image/png',\n filename: 'logo.png',\n base64: settings.invoice_logo\n };\n\n // Watch the logo, when a change occurs, save it\n $scope.$watch('invoice.logo', function () {\n if ($scope.invoice.logo && $scope.invoice.logo.filesize) {\n return Setting.update(\n { name: 'invoice_logo' },\n { value: $scope.invoice.logo.base64 },\n function (data) { growl.success(_t('app.admin.invoices.logo_successfully_saved')); },\n function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_logo'));\n console.error(error);\n }\n );\n }\n });\n };\n\n /**\n * Will temporize the search query to prevent overloading the API\n */\n var searchTimeout = null;\n\n /**\n * Output the given integer with leading zeros. If the given value is longer than the given\n * length, it will be truncated.\n * @param value {number} the integer to pad\n * @param length {number} the length of the resulting string.\n */\n var padWithZeros = function (value, length) { return (1e15 + value + '').slice(-length); };\n\n /**\n * Remove every unsupported html tag from the given html text (like

, , ...).\n * The supported tags are , , and
.\n * @param html {string} single line html text\n * @return {string} multi line simplified html text\n */\n var parseHtml = function (html) {\n return html.replace(/<\\/?(\\w+)((\\s+\\w+(\\s*=\\s*(?:\".*?\"|'.*?'|[^'\">\\s]+))?)+\\s*|\\s*)\\/?>/g, function (match, p1, offset, string) {\n if (['b', 'u', 'i', 'br'].includes(p1)) {\n return match;\n } else {\n return '';\n }\n });\n };\n\n /**\n * Reinitialize the context of invoices' search to display new results set\n */\n var resetSearchInvoice = function () {\n $scope.page = 1;\n return $scope.noMoreResults = false;\n };\n\n /**\n * Run a search query with the current parameters set concerning invoices, then affect or concat the results\n * to $scope.invoices\n * @param [concat] {boolean} if true, the result will be append to $scope.invoices instead of being affected\n */\n var invoiceSearch = function (concat) {\n Invoice.list({\n query: {\n number: $scope.searchInvoice.reference,\n customer: $scope.searchInvoice.name,\n date: $scope.searchInvoice.date,\n order_by: $scope.orderInvoice,\n page: $scope.page,\n size: INVOICES_PER_PAGE\n }\n }, function (invoices) {\n if (concat) {\n $scope.invoices = $scope.invoices.concat(invoices);\n } else {\n $scope.invoices = invoices;\n }\n\n if (!invoices[0] || (invoices[0].maxInvoices <= $scope.invoices.length)) {\n return $scope.noMoreResults = true;\n }\n });\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the invoice refunding modal window\n */\nApplication.Controllers.controller('AvoirModalController', ['$scope', '$uibModalInstance', 'invoice', 'closedPeriods', 'lastClosingEnd', 'Invoice', 'growl', '_t',\n function ($scope, $uibModalInstance, invoice, closedPeriods, lastClosingEnd, Invoice, growl, _t) {\n /* PUBLIC SCOPE */\n\n // invoice linked to the current refund\n $scope.invoice = invoice;\n\n // Associative array containing invoice_item ids associated with boolean values\n $scope.partial = {};\n\n // Default refund parameters\n $scope.avoir = {\n invoice_id: invoice.id,\n subscription_to_expire: false,\n invoice_items_ids: []\n };\n\n // End date of last closed accounting period or date of first invoice\n $scope.lastClosingEnd = moment.utc(lastClosingEnd.last_end_date).toDate();\n\n // Possible refunding methods\n $scope.avoirModes = [\n { name: _t('app.admin.invoices.none'), value: 'none' },\n { name: _t('app.admin.invoices.by_cash'), value: 'cash' },\n { name: _t('app.admin.invoices.by_cheque'), value: 'cheque' },\n { name: _t('app.admin.invoices.by_transfer'), value: 'transfer' },\n { name: _t('app.admin.invoices.by_wallet'), value: 'wallet' }\n ];\n\n // If a subscription was took with the current invoice, should it be canceled or not\n $scope.subscriptionExpireOptions = {};\n $scope.subscriptionExpireOptions[_t('app.shared.buttons.yes')] = true;\n $scope.subscriptionExpireOptions[_t('app.shared.buttons.no')] = false;\n\n // AngularUI-Bootstrap datepicker parameters to define when to refund\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * Callback to open the datepicker\n */\n $scope.openDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n $scope.datePicker.opened = true;\n };\n\n /**\n * Validate the refunding and generate a refund invoice\n */\n $scope.ok = function () {\n // check that at least 1 element of the invoice is refunded\n $scope.avoir.invoice_items_ids = [];\n for (const itemId in $scope.partial) {\n if (Object.prototype.hasOwnProperty.call($scope.partial, itemId)) {\n const refundItem = $scope.partial[itemId];\n if (refundItem) {\n $scope.avoir.invoice_items_ids.push(parseInt(itemId));\n }\n }\n }\n\n if ($scope.avoir.invoice_items_ids.length === 0) {\n return growl.error(_t('app.admin.invoices.you_must_select_at_least_one_element_to_create_a_refund'));\n } else {\n return Invoice.save(\n { avoir: $scope.avoir },\n function (avoir) { // success\n $uibModalInstance.close({ avoir, invoice: $scope.invoice });\n },\n function (err) { // failed\n growl.error(_t('app.admin.invoices.unable_to_create_the_refund'));\n }\n );\n }\n };\n\n /**\n * Cancel the refund, dismiss the modal window\n */\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n\n /**\n * Test if the given date is within a closed accounting period\n * @param date {Date} date to test\n * @returns {boolean} true if closed, false otherwise\n */\n $scope.isDateClosed = function (date) {\n for (const period of closedPeriods) {\n if (moment(date).isBetween(moment.utc(period.start_at).startOf('day'), moment.utc(period.end_at).endOf('day'), null, '[]')) {\n return true;\n }\n }\n return false;\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n // if the invoice was payed with stripe, allow to refund through stripe\n Invoice.get({ id: invoice.id }, function (data) {\n $scope.invoice = data;\n // default : all elements of the invoice are refund\n return Array.from(data.items).map(function (item) {\n return ($scope.partial[item.id] = (typeof item.avoir_item_id !== 'number'));\n });\n });\n\n if (invoice.stripe) {\n return $scope.avoirModes.push({ name: _t('app.admin.invoices.online_payment'), value: 'stripe' });\n }\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the modal window allowing an admin to close an accounting period\n */\nApplication.Controllers.controller('ClosePeriodModalController', ['$scope', '$uibModalInstance', '$window', '$sce', 'Invoice', 'AccountingPeriod', 'periods', 'lastClosingEnd', 'dialogs', 'growl', '_t',\n function ($scope, $uibModalInstance, $window, $sce, Invoice, AccountingPeriod, periods, lastClosingEnd, dialogs, growl, _t) {\n const YESTERDAY = moment.utc({ h: 0, m: 0, s: 0, ms: 0 }).subtract(1, 'day').toDate();\n const LAST_CLOSING = moment.utc(lastClosingEnd.last_end_date).toDate();\n const MAX_END = moment.utc(lastClosingEnd.last_end_date).add(1, 'year').subtract(1, 'day').toDate();\n\n /* PUBLIC SCOPE */\n\n // date pickers values are bound to these variables\n $scope.period = {\n start_at: LAST_CLOSING,\n end_at: moment(YESTERDAY).isBefore(MAX_END) ? YESTERDAY : MAX_END\n };\n\n // any form errors will come here\n $scope.errors = {};\n\n // will match any error about invoices\n $scope.invoiceErrorRE = /^invoice_(.+)$/;\n\n // existing closed periods, provided by the API\n $scope.accountingPeriods = periods;\n\n // closing a period may take a long time so we need to prevent the user from double-clicking the close button while processing\n $scope.pendingCreation = false;\n\n // AngularUI-Bootstrap datepickers parameters to define the period to close\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n // default: datePicker are not shown\n startOpened: false,\n endOpened: false,\n minDate: LAST_CLOSING,\n maxDate: moment(YESTERDAY).isBefore(MAX_END) ? YESTERDAY : MAX_END,\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * Callback to open the datepicker\n */\n $scope.toggleDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n $scope.datePicker.endOpened = !$scope.datePicker.endOpened;\n };\n\n /**\n * Validate the close period creation\n */\n $scope.ok = function () {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.invoices.confirmation_required'),\n msg: $sce.trustAsHtml(\n _t(\n 'app.admin.invoices.confirm_close_START_END',\n { START: moment.utc($scope.period.start_at).format('LL'), END: moment.utc($scope.period.end_at).format('LL') }\n ) +\n '

' +\n _t('app.admin.invoices.period_must_match_fiscal_year') +\n '

' +\n _t('app.admin.invoices.this_may_take_a_while')\n )\n };\n }\n }\n },\n function () { // creation confirmed\n $scope.pendingCreation = true;\n AccountingPeriod.save(\n {\n accounting_period: {\n start_at: moment.utc($scope.period.start_at).toDate(),\n end_at: moment.utc($scope.period.end_at).endOf('day').toDate()\n }\n },\n function (resp) {\n $scope.pendingCreation = false;\n growl.success(_t(\n 'app.admin.invoices.period_START_END_closed_success',\n { START: moment.utc(resp.start_at).format('LL'), END: moment.utc(resp.end_at).format('LL') }\n ));\n $uibModalInstance.close(resp);\n },\n function (error) {\n $scope.pendingCreation = false;\n growl.error(_t('app.admin.invoices.failed_to_close_period'));\n $scope.errors = error.data;\n }\n );\n }\n );\n };\n\n /**\n * Just dismiss the modal window\n */\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n\n /**\n * Trigger the API call to download the JSON archive of the closed accounting period\n */\n $scope.downloadArchive = function (period) {\n $window.location.href = `/api/accounting_periods/${period.id}/archive`;\n };\n }\n]);\n\nApplication.Controllers.controller('AccountingExportModalController', ['$scope', '$uibModalInstance', 'Invoice', 'Export', 'CSRF', 'growl', '_t',\n function ($scope, $uibModalInstance, Invoice, Export, CSRF, growl, _t) {\n // Retrieve Anti-CSRF tokens from cookies\n CSRF.setMetaTags();\n\n const SETTINGS = {\n acd: {\n format: 'csv',\n encoding: 'ISO-8859-1',\n separator: ';',\n dateFormat: '%d/%m/%Y',\n labelMaxLength: 50,\n decimalSeparator: ',',\n exportInvoicesAtZero: false,\n columns: ['journal_code', 'date', 'account_code', 'account_label', 'piece', 'line_label', 'debit_origin', 'credit_origin', 'debit_euro', 'credit_euro', 'lettering']\n }\n };\n\n /* PUBLIC SCOPE */\n\n // API URL where the form will be posted\n $scope.actionUrl = '/api/accounting/export';\n\n // Form action on the above URL\n $scope.method = 'post';\n\n // Anti-CSRF token to inject into the download form\n $scope.csrfToken = angular.element('meta[name=\"csrf-token\"]')[0].content;\n\n // API request body to generate the export\n $scope.query = null;\n\n // binding to radio button \"export to\"\n $scope.exportTarget = {\n software: null,\n startDate: null,\n endDate: null,\n settings: null\n };\n\n // AngularUI-Bootstrap datepicker parameters to define export dates range\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: { // default: datePickers are not shown\n start: false,\n end: false\n },\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n // Date of the first invoice\n $scope.firstInvoice = null;\n\n /**\n * Validate the export\n */\n $scope.ok = function () {\n const statusQry = mkQuery();\n $scope.query = statusQry;\n\n Export.status(statusQry).then(function (res) {\n if (!res.data.exists) {\n growl.success(_t('app.admin.invoices.export_is_running'));\n }\n $uibModalInstance.close(res);\n });\n };\n\n /**\n * Callback to open/close one of the datepickers\n * @param event {Object} see https://docs.angularjs.org/guide/expression#-event-\n * @param picker {string} start | end\n */\n $scope.toggleDatePicker = function (event, picker) {\n event.preventDefault();\n $scope.datePicker.opened[picker] = !$scope.datePicker.opened[picker];\n };\n\n /**\n * Will fill the export settings, according to the selected software\n * @param software {String} must be one of SETTINGS.*\n */\n $scope.fillSettings = function (software) {\n $scope.exportTarget.settings = SETTINGS[software];\n };\n\n /**\n * Just dismiss the modal window\n */\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n // if the invoice was payed with stripe, allow to refund through stripe\n Invoice.first(function (data) {\n $scope.firstInvoice = data.date;\n $scope.exportTarget.startDate = data.date;\n $scope.exportTarget.endDate = moment().toISOString();\n });\n };\n\n /**\n * Prepare the query for the export API\n * @returns {{extension: *, query: *, category: string, type: *, key: *}}\n */\n const mkQuery = function () {\n return {\n category: 'accounting',\n type: $scope.exportTarget.software,\n extension: $scope.exportTarget.settings.format,\n key: $scope.exportTarget.settings.separator,\n query: JSON.stringify({\n columns: $scope.exportTarget.settings.columns,\n encoding: $scope.exportTarget.settings.encoding,\n date_format: $scope.exportTarget.settings.dateFormat,\n start_date: moment.utc($scope.exportTarget.startDate).startOf('day').toISOString(),\n end_date: moment.utc($scope.exportTarget.endDate).endOf('day').toISOString(),\n label_max_length: $scope.exportTarget.settings.labelMaxLength,\n decimal_separator: $scope.exportTarget.settings.decimalSeparator,\n export_invoices_at_zero: $scope.exportTarget.settings.exportInvoicesAtZero\n })\n };\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }]);\n\n/**\n * Controller used in the modal window allowing an admin to close an accounting period\n */\nApplication.Controllers.controller('StripeKeysModalController', ['$scope', '$uibModalInstance', '$http', '$httpParamSerializerJQLike', 'stripeKeys', 'Setting', 'growl', '_t',\n function ($scope, $uibModalInstance, $http, $httpParamSerializerJQLike, stripeKeys, Setting, growl, _t) {\n /* PUBLIC SCOPE */\n\n // public key\n $scope.publicKey = stripeKeys.stripe_public_key || '';\n\n // test status of the public key\n $scope.publicKeyStatus = undefined;\n\n // secret key\n $scope.secretKey = stripeKeys.stripe_secret_key || '';\n\n // test status of the secret key\n $scope.secretKeyStatus = undefined;\n\n /**\n * Trigger the test of the secret key and set the result in $scope.secretKeyStatus\n */\n $scope.testSecretKey = function () {\n if (!$scope.secretKey.match(/^sk_/)) {\n $scope.secretKeyStatus = false;\n return;\n }\n $http({\n method: 'GET',\n url: 'https://api.stripe.com/v1/charges',\n headers: {\n Authorization: `Bearer ${$scope.secretKey}`\n }\n }).then(function () {\n $scope.secretKeyStatus = true;\n }, function (err) {\n if (err.status === 401) $scope.secretKeyStatus = false;\n });\n };\n\n /**\n * Trigger the test of the secret key and set the result in $scope.secretKeyStatus\n */\n $scope.testPublicKey = function () {\n if (!$scope.publicKey.match(/^pk_/)) {\n $scope.publicKeyStatus = false;\n return;\n }\n $http({\n method: 'POST',\n url: 'https://api.stripe.com/v1/tokens',\n headers: {\n Authorization: `Bearer ${$scope.publicKey}`,\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n data: $httpParamSerializerJQLike({\n 'pii[id_number]': 'test'\n })\n }).then(function () {\n $scope.publicKeyStatus = true;\n }, function (err) {\n if (err.status === 401) $scope.publicKeyStatus = false;\n });\n };\n\n /**\n * Validate the keys\n */\n $scope.ok = function () {\n if ($scope.secretKeyStatus && $scope.publicKeyStatus) {\n Setting.bulkUpdate(\n {\n settings: [\n {\n name: 'stripe_public_key',\n value: $scope.publicKey\n },\n {\n name: 'stripe_secret_key',\n value: $scope.secretKey\n }\n ]\n },\n function () {\n growl.success(_t('app.admin.invoices.payment.stripe_keys_saved'));\n $uibModalInstance.close(true);\n },\n function (error) {\n growl.error('app.admin.invoices.payment.error_saving_stripe_keys');\n console.error(error);\n }\n );\n } else {\n growl.error(_t('app.admin.invoices.payment.error_check_keys'));\n }\n };\n\n /**\n * Just dismiss the modal window\n */\n $scope.cancel = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n if (stripeKeys.stripe_public_key) {\n $scope.testPublicKey();\n }\n if (stripeKeys.stripe_secret_key) {\n $scope.testSecretKey();\n }\n };\n\n // !!! MUST BE CALLED AT THE END of the controller!\n return initialize();\n }\n]);\n","/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-self-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/* COMMON CODE */\n\n/**\n * Provides a set of common properties and methods to the $scope parameter. They are used\n * in the various members' admin controllers.\n *\n * Provides :\n * - $scope.groups = [{Group}]\n * - $scope.trainings = [{Training}]\n * - $scope.plans = []\n * - $scope.datePicker = {}\n * - $scope.submited(content)\n * - $scope.cancel()\n * - $scope.fileinputClass(v)\n * - $scope.openDatePicker($event)\n * - $scope.openSubscriptionDatePicker($event)\n *\n * Requires :\n * - $state (Ui-Router) [ 'app.admin.members' ]\n */\nclass MembersController {\n constructor ($scope, $state, Group, Training) {\n // Retrieve the profiles groups (e.g. students ...)\n Group.query(function (groups) { $scope.groups = groups.filter(function (g) { return (g.slug !== 'admins') && !g.disabled; }); });\n\n // Retrieve the list of available trainings\n Training.query().$promise.then(function (data) {\n $scope.trainings = data.map(function (d) {\n return ({\n id: d.id,\n name: d.name,\n disabled: d.disabled\n });\n });\n });\n\n // Default parameters for AngularUI-Bootstrap datepicker\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n subscription_date_opened: false,\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * Shows the birthday datepicker\n * @param $event {Object} jQuery event object\n */\n $scope.openDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n return $scope.datePicker.opened = true;\n };\n\n /**\n * Shows the end of subscription datepicker\n * @param $event {Object} jQuery event object\n */\n $scope.openSubscriptionDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n return $scope.datePicker.subscription_date_opened = true;\n };\n\n /**\n * For use with ngUpload (https://github.com/twilson63/ngUpload).\n * Intended to be the callback when an upload is done: any raised error will be stacked in the\n * $scope.alerts array. If everything goes fine, the user is redirected to the members listing page.\n * @param content {Object} JSON - The result of the upload\n */\n $scope.submited = function (content) {\n if ((content.id == null)) {\n $scope.alerts = [];\n return angular.forEach(content, function (v, k) {\n angular.forEach(v, function (err) {\n $scope.alerts.push({\n msg: k + ': ' + err,\n type: 'danger'\n });\n });\n });\n } else {\n return $state.go('app.admin.members');\n }\n };\n\n /**\n * Changes the admin's view to the members list page\n */\n $scope.cancel = function () { $state.go('app.admin.members'); };\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder, or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n }\n}\n\n/**\n * Controller used in the members/groups management page\n */\nApplication.Controllers.controller('AdminMembersController', ['$scope', '$sce', '$uibModal', 'membersPromise', 'adminsPromise', 'partnersPromise', 'managersPromise', 'growl', 'Admin', 'AuthService', 'dialogs', '_t', 'Member', 'Export', 'User', 'uiTourService', 'settingsPromise',\n function ($scope, $sce, $uibModal, membersPromise, adminsPromise, partnersPromise, managersPromise, growl, Admin, AuthService, dialogs, _t, Member, Export, User, uiTourService, settingsPromise) {\n /* PRIVATE STATIC CONSTANTS */\n\n // number of users loaded each time we click on 'load more...'\n const USERS_PER_PAGE = 20;\n\n /* PUBLIC SCOPE */\n\n // members list\n $scope.members = membersPromise;\n\n $scope.member = {\n // Members plain-text filtering. Default: not filtered\n searchText: '',\n // Members ordering/sorting. Default: not sorted\n order: 'id',\n // the currently displayed page of members\n page: 1,\n // true when all members where loaded\n noMore: false,\n // default filter for members\n memberFilter: 'all',\n // options for members filtering\n memberFilters: [\n 'all',\n 'not_confirmed',\n 'inactive_for_3_years'\n ]\n };\n\n // admins list\n $scope.admins = adminsPromise.admins.filter(function (m) { return m.id !== Fablab.superadminId; });\n\n // Admins ordering/sorting. Default: not sorted\n $scope.orderAdmin = null;\n\n // partners list\n $scope.partners = partnersPromise.users;\n\n // Partners ordering/sorting. Default: not sorted\n $scope.orderPartner = null;\n\n // managers list\n $scope.managers = managersPromise.users;\n\n // Managers ordering/sorting. Default: not sorted\n $scope.orderManager = null;\n\n // default tab: members list\n $scope.tabs = { active: 0, sub: 0 };\n\n /**\n * Change the members ordering criterion to the one provided\n * @param orderBy {string} ordering criterion\n */\n $scope.setOrderMember = function (orderBy) {\n if ($scope.member.order === orderBy) {\n $scope.member.order = `-${orderBy}`;\n } else {\n $scope.member.order = orderBy;\n }\n\n resetSearchMember();\n return memberSearch();\n };\n\n /**\n * Change the admins ordering criterion to the one provided\n * @param orderAdmin {string} ordering criterion\n */\n $scope.setOrderAdmin = function (orderAdmin) {\n if ($scope.orderAdmin === orderAdmin) {\n return $scope.orderAdmin = `-${orderAdmin}`;\n } else {\n return $scope.orderAdmin = orderAdmin;\n }\n };\n\n /**\n * Change the partners ordering criterion to the one provided\n * @param orderPartner {string} ordering criterion\n */\n $scope.setOrderPartner = function (orderPartner) {\n if ($scope.orderPartner === orderPartner) {\n return $scope.orderPartner = `-${orderPartner}`;\n } else {\n return $scope.orderPartner = orderPartner;\n }\n };\n\n /**\n * Change the managers ordering criterion to the one provided\n * @param orderManager {string} ordering criterion\n */\n $scope.setOrderManager = function (orderManager) {\n if ($scope.orderManager === orderManager) {\n return $scope.orderManager = `-${orderManager}`;\n } else {\n return $scope.orderManager = orderManager;\n }\n };\n\n /**\n * Open a modal dialog allowing the admin to create a new partner user\n */\n $scope.openPartnerNewModal = function () {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/shared/_partner_new_modal.html',\n size: 'lg',\n controller: ['$scope', '$uibModalInstance', 'User', function ($scope, $uibModalInstance, User) {\n $scope.partner = {};\n\n $scope.ok = function () {\n User.save(\n {},\n { user: $scope.partner },\n function (user) {\n $scope.partner.id = user.id;\n $scope.partner.name = `${user.first_name} ${user.last_name}`;\n $uibModalInstance.close($scope.partner);\n },\n function (error) {\n growl.error(_t('app.admin.plans.new.unable_to_save_this_user_check_that_there_isnt_an_already_a_user_with_the_same_name'));\n console.error(error);\n }\n );\n };\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n // once the form was validated successfully ...\n return modalInstance.result.then(function (partner) {\n $scope.partners.push(partner);\n });\n };\n\n /**\n * Ask for confirmation then delete the specified user\n * @param memberId {number} identifier of the user to delete\n */\n $scope.deleteMember = function (memberId) {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.members.confirmation_required'),\n msg: $sce.trustAsHtml(_t('app.admin.members.confirm_delete_member') + '

' + _t('app.admin.members.this_may_take_a_while_please_wait'))\n };\n }\n }\n },\n function () { // cancel confirmed\n Member.delete(\n { id: memberId },\n function () {\n $scope.members.splice(findItemIdxById($scope.members, memberId), 1);\n return growl.success(_t('app.admin.members.member_successfully_deleted'));\n },\n function (error) {\n growl.error(_t('app.admin.members.unable_to_delete_the_member'));\n console.error(error);\n }\n );\n }\n );\n };\n\n /**\n * Ask for confirmation then delete the specified administrator\n * @param admins {Array} full list of administrators\n * @param admin {Object} administrator to delete\n */\n $scope.destroyAdmin = function (admins, admin) {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.members.confirmation_required'),\n msg: $sce.trustAsHtml(_t('app.admin.members.do_you_really_want_to_delete_this_administrator_this_cannot_be_undone') + '

' + _t('app.admin.members.this_may_take_a_while_please_wait'))\n };\n }\n }\n },\n function () { // cancel confirmed\n Admin.delete(\n { id: admin.id },\n function () {\n admins.splice(findItemIdxById(admins, admin.id), 1);\n return growl.success(_t('app.admin.members.administrator_successfully_deleted'));\n },\n function (error) {\n growl.error(_t('app.admin.members.unable_to_delete_the_administrator'));\n console.error(error);\n }\n );\n }\n );\n };\n\n /**\n * Ask for confirmation then delete the specified partner\n * @param partners {Array} full list of partners\n * @param partner {Object} partner to delete\n */\n $scope.destroyPartner = function (partners, partner) {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.members.confirmation_required'),\n msg: $sce.trustAsHtml(_t('app.admin.members.delete_this_partner') + '

' + _t('app.admin.members.this_may_take_a_while_please_wait'))\n };\n }\n }\n },\n function () { // cancel confirmed\n User.delete(\n { id: partner.id },\n function () {\n partners.splice(findItemIdxById(partners, partner.id), 1);\n return growl.success(_t('app.admin.members.partner_successfully_deleted'));\n },\n function (error) {\n growl.error(_t('app.admin.members.unable_to_delete_the_partner'));\n console.error(error);\n }\n );\n }\n );\n };\n\n /**\n * Ask for confirmation then delete the specified manager\n * @param managers {Array} full list of managers\n * @param manager {Object} manager to delete\n */\n $scope.destroyManager = function (managers, manager) {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.members.confirmation_required'),\n msg: $sce.trustAsHtml(_t('app.admin.members.delete_this_manager') + '

' + _t('app.admin.members.this_may_take_a_while_please_wait'))\n };\n }\n }\n },\n function () { // cancel confirmed\n User.delete(\n { id: manager.id },\n function () {\n managers.splice(findItemIdxById(managers, manager.id), 1);\n return growl.success(_t('app.admin.members.manager_successfully_deleted'));\n },\n function (error) {\n growl.error(_t('app.admin.members.unable_to_delete_the_manager'));\n console.error(error);\n }\n );\n }\n );\n };\n\n /**\n * Callback for the 'load more' button.\n * Will load the next results of the current search, if any\n */\n $scope.showNextMembers = function () {\n $scope.member.page += 1;\n return memberSearch(true);\n };\n\n /**\n * Callback when the search field content changes: reload the search results\n */\n $scope.updateTextSearch = function () {\n if (searchTimeout) clearTimeout(searchTimeout);\n searchTimeout = setTimeout(function () {\n resetSearchMember();\n memberSearch();\n }, 300);\n };\n\n /**\n * Callback when the member filter changes: reload the search results\n */\n $scope.updateMemberFilter = function () {\n resetSearchMember();\n memberSearch();\n };\n\n /**\n * Callback to alert the admin that the export request was acknowledged and is\n * processing right now.\n */\n $scope.alertExport = function (type) {\n Export.status({ category: 'users', type }).then(function (res) {\n if (!res.data.exists) {\n return growl.success(_t('app.admin.members.export_is_running_you_ll_be_notified_when_its_ready'));\n }\n });\n };\n\n /**\n * Set up the feature-tour for the admin/members page.\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupMembersTour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('members');\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.admin.tour.members.welcome.title'),\n content: _t('app.admin.tour.members.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n uitour.createStep({\n selector: '.members-management .members-list',\n stepId: 'list',\n order: 1,\n title: _t('app.admin.tour.members.list.title'),\n content: _t('app.admin.tour.members.list.content'),\n placement: 'top'\n });\n uitour.createStep({\n selector: '.members-management .search-members',\n stepId: 'search',\n order: 2,\n title: _t('app.admin.tour.members.search.title'),\n content: _t('app.admin.tour.members.search.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.members-management .filter-members',\n stepId: 'filter',\n order: 3,\n title: _t('app.admin.tour.members.filter.title'),\n content: _t('app.admin.tour.members.filter.content'),\n placement: 'bottom'\n });\n if ($scope.members.length > 0) {\n uitour.createStep({\n selector: '.members-management .members-list .buttons',\n stepId: 'actions',\n order: 4,\n title: _t('app.admin.tour.members.actions.title'),\n content: _t('app.admin.tour.members.actions.content'),\n placement: 'left'\n });\n }\n if (AuthService.isAuthorized('admin')) {\n uitour.createStep({\n selector: '.members-management .exports-buttons',\n stepId: 'exports',\n order: 5,\n title: _t('app.admin.tour.members.exports.title'),\n content: _t('app.admin.tour.members.exports.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.heading .import-members',\n stepId: 'import',\n order: 6,\n title: _t('app.admin.tour.members.import.title'),\n content: _t('app.admin.tour.members.import.content'),\n placement: 'left'\n });\n }\n uitour.createStep({\n selector: '.members-management .admins-tab',\n stepId: 'admins',\n order: 7,\n title: _t('app.admin.tour.members.admins.title'),\n content: _t('app.admin.tour.members.admins.content'),\n placement: 'bottom'\n });\n if (AuthService.isAuthorized('admin')) {\n uitour.createStep({\n selector: '.members-management .groups-tab',\n stepId: 'groups',\n order: 8,\n title: _t('app.admin.tour.members.groups.title'),\n content: _t('app.admin.tour.members.groups.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.members-management .labels-tab',\n stepId: 'labels',\n order: 9,\n title: _t('app.admin.tour.members.labels.title'),\n content: _t('app.admin.tour.members.labels.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.members-management .sso-tab',\n stepId: 'sso',\n order: 10,\n title: _t('app.admin.tour.members.sso.title'),\n content: _t('app.admin.tour.members.sso.content'),\n placement: 'bottom',\n popupClass: 'shift-left-50'\n });\n }\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 11,\n title: _t('app.admin.tour.conclusion.title'),\n content: _t('app.admin.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on step change, change the active tab if needed\n uitour.on('stepChanged', function (nextStep) {\n if (nextStep.stepId === 'list' || nextStep.stepId === 'import') {\n $scope.tabs.active = 0;\n $scope.tabs.sub = 0;\n }\n if (nextStep.stepId === 'admins') {\n $scope.tabs.active = 0;\n $scope.tabs.sub = 1;\n }\n if (nextStep.stepId === 'groups') {\n $scope.tabs.active = 1;\n }\n if (nextStep.stepId === 'labels') {\n $scope.tabs.active = 2;\n }\n if (nextStep.stepId === 'sso') {\n $scope.tabs.active = 3;\n }\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('members') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'members' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('members') < 0) {\n uitour.start();\n }\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n if (!membersPromise[0] || (membersPromise[0].maxMembers <= $scope.members.length)) {\n return $scope.member.noMore = true;\n }\n };\n\n /**\n * Will temporize the search query to prevent overloading the API\n */\n let searchTimeout = null;\n\n /**\n * Iterate through the provided array and return the index of the requested item\n * @param items {Array} full list of users with the 'admin' role\n * @param id {Number} id of the item to retrieve in the list\n * @returns {Number} index of the requested item, in the provided array\n */\n const findItemIdxById = function (items, id) {\n return (items.map(function (item) { return item.id; })).indexOf(id);\n };\n\n /**\n * Reinitialize the context of the search to display new results set\n */\n const resetSearchMember = function () {\n $scope.member.noMore = false;\n $scope.member.page = 1;\n };\n\n /**\n * Run a search query with the current parameters set ($scope.member[searchText,order,page])\n * and affect or append the result in $scope.members, depending on the concat parameter\n * @param [concat] {boolean} if true, the result will be appended to $scope.members instead of being replaced\n */\n const memberSearch = function (concat) {\n Member.list({\n query: {\n search: $scope.member.searchText,\n order_by: $scope.member.order,\n filter: $scope.member.memberFilter,\n page: $scope.member.page,\n size: USERS_PER_PAGE\n }\n }, function (members) {\n if (concat) {\n $scope.members = $scope.members.concat(members);\n } else {\n $scope.members = members;\n }\n\n if (!members[0] || (members[0].maxMembers <= $scope.members.length)) {\n return $scope.member.noMore = true;\n }\n });\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the member edition page\n */\nApplication.Controllers.controller('EditMemberController', ['$scope', '$state', '$stateParams', 'Member', 'Training', 'dialogs', 'growl', 'Group', 'Subscription', 'CSRF', 'memberPromise', 'tagsPromise', '$uibModal', 'Plan', '$filter', '_t', 'walletPromise', 'transactionsPromise', 'activeProviderPromise', 'Wallet', 'settingsPromise',\n function ($scope, $state, $stateParams, Member, Training, dialogs, growl, Group, Subscription, CSRF, memberPromise, tagsPromise, $uibModal, Plan, $filter, _t, walletPromise, transactionsPromise, activeProviderPromise, Wallet, settingsPromise) {\n /* PUBLIC SCOPE */\n\n // API URL where the form will be posted\n $scope.actionUrl = `/api/members/${$stateParams.id}`;\n\n // Form action on the above URL\n $scope.method = 'patch';\n\n // List of tags joinable with user\n $scope.tags = tagsPromise;\n\n // The user to edit\n $scope.user = memberPromise;\n\n // Should the password be modified?\n $scope.password = { change: false };\n\n // is the phone number required in _member_form?\n $scope.phoneRequired = (settingsPromise.phone_required === 'true');\n\n // is the address required in _member_form?\n $scope.addressRequired = (settingsPromise.address_required === 'true');\n\n // the user subscription\n if (($scope.user.subscribed_plan != null) && ($scope.user.subscription != null)) {\n $scope.subscription = $scope.user.subscription;\n } else {\n Plan.query({ group_id: $scope.user.group_id }, function (plans) {\n $scope.plans = plans;\n return Array.from($scope.plans).map(function (plan) {\n return (plan.nameToDisplay = $filter('humanReadablePlanName')(plan));\n });\n });\n }\n\n // Available trainings list\n $scope.trainings = [];\n\n // Profiles types (student/standard/...)\n $scope.groups = [];\n\n // the user wallet\n $scope.wallet = walletPromise;\n\n // user wallet transactions\n $scope.transactions = transactionsPromise;\n\n // used in wallet partial template to identify parent view\n $scope.view = 'member_edit';\n\n // current active authentication provider\n $scope.activeProvider = activeProviderPromise;\n\n /**\n * Open a modal dialog asking for confirmation to change the role of the given user\n * @returns {*}\n */\n $scope.changeUserRole = function () {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/admin/members/change_role_modal.html',\n size: 'lg',\n resolve: {\n user () { return $scope.user; }\n },\n controller: ['$scope', '$uibModalInstance', 'Member', 'user', '_t', function ($scope, $uibModalInstance, Member, user, _t) {\n $scope.user = user;\n\n $scope.role = user.role;\n\n $scope.roles = [\n { key: 'admin', label: _t('app.admin.members_edit.admin') },\n { key: 'manager', label: _t('app.admin.members_edit.manager'), notAnOption: (user.role === 'admin') },\n { key: 'member', label: _t('app.admin.members_edit.member'), notAnOption: (user.role === 'admin' || user.role === 'manager') }\n ];\n\n $scope.ok = function () {\n Member.updateRole(\n { id: $scope.user.id },\n { role: $scope.role },\n function (_res) {\n growl.success(_t('app.admin.members_edit.role_changed', { OLD: _t(`app.admin.members_edit.${user.role}`), NEW: _t(`app.admin.members_edit.${$scope.role}`) }));\n return $uibModalInstance.close(_res);\n },\n function (error) {\n growl.error(_t('app.admin.members_edit.error_while_changing_role'));\n console.error(error);\n }\n );\n };\n\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n // once the form was validated successfully ...\n return modalInstance.result.then(function (user) {\n // remove the user for the old list add to the new\n });\n };\n\n /**\n * Open a modal dialog, allowing the admin to extend the current user's subscription (freely or not)\n * @param subscription {Object} User's subscription object\n * @param free {boolean} True if the extent is offered, false otherwise\n */\n $scope.updateSubscriptionModal = function (subscription, free) {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/admin/subscriptions/expired_at_modal.html',\n size: 'lg',\n controller: ['$scope', '$uibModalInstance', 'Subscription', function ($scope, $uibModalInstance, Subscription) {\n $scope.new_expired_at = angular.copy(subscription.expired_at);\n $scope.free = free;\n $scope.datePicker = {\n opened: false,\n format: Fablab.uibDateFormat,\n options: {\n startingDay: Fablab.weekStartingDay\n },\n minDate: new Date()\n };\n\n $scope.openDatePicker = function (ev) {\n ev.preventDefault();\n ev.stopPropagation();\n return $scope.datePicker.opened = true;\n };\n\n $scope.ok = function () {\n Subscription.update(\n { id: subscription.id },\n { subscription: { expired_at: $scope.new_expired_at, free } },\n function (_subscription) {\n growl.success(_t('app.admin.members_edit.you_successfully_changed_the_expiration_date_of_the_user_s_subscription'));\n return $uibModalInstance.close(_subscription);\n },\n function (error) {\n growl.error(_t('app.admin.members_edit.a_problem_occurred_while_saving_the_date'));\n console.error(error);\n }\n );\n };\n\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n // once the form was validated successfully ...\n return modalInstance.result.then(function (subscription) { $scope.subscription.expired_at = subscription.expired_at; });\n };\n\n /**\n * Open a modal dialog allowing the admin to set a subscription for the given user.\n * @param user {Object} User object, user currently reviewed, as recovered from GET /api/members/:id\n * @param plans {Array} List of plans, available for the currently reviewed user, as recovered from GET /api/plans\n */\n $scope.createSubscriptionModal = function (user, plans) {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/admin/subscriptions/create_modal.html',\n size: 'lg',\n controller: ['$scope', '$uibModalInstance', 'Subscription', function ($scope, $uibModalInstance, Subscription) {\n // selected user\n $scope.user = user;\n\n // available plans for the selected user\n $scope.plans = plans;\n\n // default parameters for the new subscription\n $scope.subscription = {\n payment_schedule: false,\n payment_method: 'check'\n };\n\n /**\n * Generate a string identifying the given plan by literal human-readable name\n * @param plan {Object} Plan object, as recovered from GET /api/plan/:id\n * @param groups {Array} List of Groups objects, as recovered from GET /api/groups\n * @param short {boolean} If true, the generated name will contain the group slug, otherwise the group full name\n * will be included.\n * @returns {String}\n */\n $scope.humanReadablePlanName = function (plan, groups, short) { return `${$filter('humanReadablePlanName')(plan, groups, short)}`; };\n\n /**\n * Check if the currently selected plan can be paid with a payment schedule or not\n * @return {boolean}\n */\n $scope.allowMonthlySchedule = function () {\n if (!$scope.subscription) return false;\n\n const plan = plans.find(p => p.id === $scope.subscription.plan_id);\n return plan && plan.monthly_payment;\n };\n\n /**\n * Triggered by the component.\n * We must use a setTimeout to workaround the react integration.\n * @param checked {Boolean}\n */\n $scope.toggleSchedule = function (checked) {\n setTimeout(() => {\n $scope.subscription.payment_schedule = checked;\n $scope.$apply();\n }, 50);\n };\n\n /**\n * Modal dialog validation callback\n */\n $scope.ok = function () {\n $scope.subscription.user_id = user.id;\n return Subscription.save({ }, { subscription: $scope.subscription }, function (_subscription) {\n growl.success(_t('app.admin.members_edit.subscription_successfully_purchased'));\n $uibModalInstance.close(_subscription);\n return $state.reload();\n }\n , function (error) {\n growl.error(_t('app.admin.members_edit.a_problem_occurred_while_taking_the_subscription'));\n console.error(error);\n });\n };\n\n /**\n * Modal dialog cancellation callback\n */\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n // once the form was validated successfully ...\n return modalInstance.result.then(function (subscription) { $scope.subscription = subscription; });\n };\n\n $scope.createWalletCreditModal = function (user, wallet) {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/wallet/credit_modal.html',\n controller: ['$scope', '$uibModalInstance', 'Wallet', function ($scope, $uibModalInstance, Wallet) {\n // default: do not generate a refund invoice\n $scope.generate_avoir = false;\n\n // date of the generated refund invoice\n $scope.avoir_date = null;\n\n // optional description shown on the refund invoice\n $scope.description = '';\n\n // default configuration for the avoir date selector widget\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: false,\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * Callback to open/close the date picker\n */\n $scope.toggleDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n return $scope.datePicker.opened = !$scope.datePicker.opened;\n };\n\n /**\n * Modal dialog validation callback\n */\n $scope.ok = function () {\n Wallet.credit(\n { id: wallet.id },\n {\n amount: $scope.amount,\n avoir: $scope.generate_avoir,\n avoir_date: $scope.avoir_date,\n avoir_description: $scope.description\n },\n function (_wallet) {\n growl.success(_t('app.shared.wallet.wallet_credit_successfully'));\n return $uibModalInstance.close(_wallet);\n },\n function (error) {\n growl.error(_t('app.shared.wallet.a_problem_occurred_for_wallet_credit'));\n console.error(error);\n }\n );\n };\n\n /**\n * Modal dialog cancellation callback\n */\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }\n ]\n });\n // once the form was validated successfully...\n return modalInstance.result.then(function (wallet) {\n $scope.wallet = wallet;\n return Wallet.transactions({ id: wallet.id }, function (transactions) { $scope.transactions = transactions; });\n });\n };\n\n /**\n * To use as callback in Array.prototype.filter to get only enabled plans\n */\n $scope.filterDisabledPlans = function (plan) { return !plan.disabled; };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n CSRF.setMetaTags();\n\n // init the birthdate to JS object\n $scope.user.statistic_profile.birthday = moment($scope.user.statistic_profile.birthday).toDate();\n\n // the user subscription\n if (($scope.user.subscribed_plan != null) && ($scope.user.subscription != null)) {\n $scope.subscription = $scope.user.subscription;\n } else {\n Plan.query({ group_id: $scope.user.group_id }, function (plans) {\n $scope.plans = plans;\n return Array.from($scope.plans).map(function (plan) {\n return (plan.nameToDisplay = `${plan.base_name} - ${plan.interval}`);\n });\n });\n }\n\n // Using the MembersController\n return new MembersController($scope, $state, Group, Training);\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the member's creation page (admin view)\n */\nApplication.Controllers.controller('NewMemberController', ['$scope', '$state', '$stateParams', 'Member', 'Training', 'Group', 'CSRF', 'settingsPromise',\n function ($scope, $state, $stateParams, Member, Training, Group, CSRF, settingsPromise) {\n CSRF.setMetaTags();\n\n /* PUBLIC SCOPE */\n\n // API URL where the form will be posted\n $scope.actionUrl = '/api/members';\n\n // Form action on the above URL\n $scope.method = 'post';\n\n // Should the password be set manually or generated?\n $scope.password = { change: false };\n\n // is the phone number required in _member_form?\n $scope.phoneRequired = (settingsPromise.phone_required === 'true');\n\n // is the address required to sign-up?\n $scope.addressRequired = (settingsPromise.address_required === 'true');\n\n // Default member's profile parameters\n $scope.user = {\n plan_interval: '',\n invoicing_profile: {},\n statistic_profile: {}\n };\n\n // Callback when the admin check/uncheck the box telling that the new user is an organization.\n // Disable or enable the organization fields in the form, accordingly\n $scope.toggleOrganization = function () {\n if ($scope.user.organization) {\n if (!$scope.user.invoicing_profile) { $scope.user.invoicing_profile = {}; }\n $scope.user.invoicing_profile.organization = {};\n } else {\n $scope.user.invoicing_profile.organization = undefined;\n }\n };\n\n // Using the MembersController\n return new MembersController($scope, $state, Group, Training);\n }\n]);\n\n/**\n * Controller used in the member's import page: import from CSV (admin view)\n */\nApplication.Controllers.controller('ImportMembersController', ['$scope', '$state', 'Group', 'Training', 'CSRF', 'tags', 'growl',\n function ($scope, $state, Group, Training, CSRF, tags, growl) {\n CSRF.setMetaTags();\n\n /* PUBLIC SCOPE */\n\n // API URL where the form will be posted\n $scope.actionUrl = '/api/imports/members';\n\n // Form action on the above URL\n $scope.method = 'post';\n\n // List of all tags\n $scope.tags = tags;\n\n /*\n * Callback run after the form was submitted\n * @param content {*} The result provided by the server, may be an Import object, or an error message\n */\n $scope.onImportResult = function (content) {\n if (content.id) {\n $state.go('app.admin.members_import_result', { id: content.id });\n } else {\n growl.error(JSON.stringify(content));\n }\n };\n\n // Using the MembersController\n return new MembersController($scope, $state, Group, Training);\n }\n]);\n\n/**\n * Controller used in the member's import results page (admin view)\n */\nApplication.Controllers.controller('ImportMembersResultController', ['$scope', '$state', 'Import', 'importItem',\n function ($scope, $state, Import, importItem) {\n /* PUBLIC SCOPE */\n\n // Current import as saved in database\n $scope.import = importItem;\n\n // Current import results\n $scope.results = null;\n\n /**\n * Changes the view of the admin to the members import page\n */\n $scope.cancel = function () { $state.go('app.admin.members_import'); };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n $scope.results = JSON.parse($scope.import.results);\n if (!$scope.results) {\n setTimeout(function () {\n Import.get({ id: $scope.import.id }, function (data) {\n $scope.import = data;\n initialize();\n });\n }, 5000);\n }\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n initialize();\n }\n]);\n\n/**\n * Controller used in the admin creation page (admin view)\n */\nApplication.Controllers.controller('NewAdminController', ['$state', '$scope', 'Admin', 'growl', '_t', 'settingsPromise',\n function ($state, $scope, Admin, growl, _t, settingsPromise) {\n // default admin profile\n let getGender;\n $scope.admin = {\n statistic_profile_attributes: {\n gender: true\n },\n profile_attributes: {},\n invoicing_profile_attributes: {}\n };\n\n // Default parameters for AngularUI-Bootstrap datepicker\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: false,\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n // is the phone number required in _admin_form?\n $scope.phoneRequired = (settingsPromise.phone_required === 'true');\n\n // is the address required in _admin_form?\n $scope.addressRequired = (settingsPromise.address_required === 'true');\n\n /**\n * Shows the birthday datepicker\n */\n $scope.openDatePicker = function () { $scope.datePicker.opened = true; };\n\n /**\n * Send the new admin, currently stored in $scope.admin, to the server for database saving\n */\n $scope.saveAdmin = function () {\n Admin.save(\n {},\n { admin: $scope.admin },\n function () {\n growl.success(_t('app.admin.admins_new.administrator_successfully_created_he_will_receive_his_connection_directives_by_email', { GENDER: getGender($scope.admin) }));\n return $state.go('app.admin.members');\n }\n , function (error) {\n growl.error(_t('app.admin.admins_new.failed_to_create_admin') + JSON.stringify(error.data ? error.data : error));\n console.error(error);\n }\n );\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Return an enumerable meaningful string for the gender of the provider user\n * @param user {Object} Database user record\n * @return {string} 'male' or 'female'\n */\n return getGender = function (user) {\n if (user.statistic_profile_attributes) {\n if (user.statistic_profile_attributes.gender) { return 'male'; } else { return 'female'; }\n } else { return 'other'; }\n };\n }\n\n]);\n\n/**\n * Controller used in the manager's creation page (admin view)\n */\nApplication.Controllers.controller('NewManagerController', ['$state', '$scope', 'User', 'groupsPromise', 'tagsPromise', 'growl', '_t',\n function ($state, $scope, User, groupsPromise, tagsPromise, growl, _t) {\n // default admin profile\n $scope.manager = {\n statistic_profile_attributes: {\n gender: true\n },\n profile_attributes: {},\n invoicing_profile_attributes: {}\n };\n\n // Default parameters for AngularUI-Bootstrap datepicker\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: false,\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n // list of all groups\n $scope.groups = groupsPromise.filter(function (g) { return (g.slug !== 'admins') && !g.disabled; });\n\n // list of all tags\n $scope.tags = tagsPromise;\n\n /**\n * Shows the birthday datepicker\n */\n $scope.openDatePicker = function () { $scope.datePicker.opened = true; };\n\n /**\n * Send the new manager, currently stored in $scope.manager, to the server for database saving\n */\n $scope.saveManager = function () {\n User.save(\n {},\n { manager: $scope.manager },\n function () {\n growl.success(_t('app.admin.manager_new.manager_successfully_created', { GENDER: getGender($scope.manager) }));\n return $state.go('app.admin.members');\n }\n , function (error) {\n growl.error(_t('app.admin.admins_new.failed_to_create_manager') + JSON.stringify(error.data ? error.data : error));\n console.error(error);\n }\n );\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Return an enumerable meaningful string for the gender of the provider user\n * @param user {Object} Database user record\n * @return {string} 'male' or 'female'\n */\n const getGender = function (user) {\n if (user.statistic_profile_attributes) {\n if (user.statistic_profile_attributes.gender) { return 'male'; } else { return 'female'; }\n } else { return 'other'; }\n };\n }\n\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nApplication.Controllers.controller('OpenAPIClientsController', ['$scope', 'clientsPromise', 'settingsPromise', 'growl', 'OpenAPIClient', 'dialogs', '_t', 'Member', 'uiTourService',\n function ($scope, clientsPromise, settingsPromise, growl, OpenAPIClient, dialogs, _t, Member, uiTourService) {\n /* PUBLIC SCOPE */\n\n // clients list\n $scope.clients = clientsPromise;\n $scope.order = null;\n $scope.clientFormVisible = false;\n $scope.client = {};\n\n /**\n * Show the name edition form for a new client\n */\n $scope.createClient = function () {\n $scope.clientFormVisible = true;\n $scope.client = {};\n };\n\n /**\n * Change the order criterion to the one provided\n * @param orderBy {string} ordering criterion\n */\n $scope.setOrder = function (orderBy) {\n if ($scope.order === orderBy) {\n return $scope.order = `-${orderBy}`;\n } else {\n return $scope.order = orderBy;\n }\n };\n\n /**\n * Reset the name ot its original value and close the edition form\n */\n $scope.cancelEdit = function () {\n $scope.client.name = $scope.clientOriginalName;\n $scope.clientFormVisible = false;\n };\n\n $scope.saveClient = function (client) {\n if (client.id != null) {\n OpenAPIClient.update({ id: client.id }, { open_api_client: client }, function (clientResp) {\n client = clientResp;\n return growl.success(_t('app.admin.open_api_clients.client_successfully_updated'));\n });\n } else {\n OpenAPIClient.save({ open_api_client: client }, function (client) {\n $scope.clients.push(client);\n return growl.success(_t('app.admin.open_api_clients.client_successfully_created'));\n });\n }\n\n $scope.clientFormVisible = false;\n $scope.client = {};\n };\n\n $scope.editClient = function (client) {\n $scope.clientFormVisible = true;\n $scope.client = client;\n $scope.clientOriginalName = client.name;\n };\n\n $scope.deleteClient = index =>\n dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.admin.open_api_clients.confirmation_required'),\n msg: _t('app.admin.open_api_clients.do_you_really_want_to_delete_this_open_api_client')\n };\n }\n }\n }\n , () =>\n OpenAPIClient.delete({ id: $scope.clients[index].id }, function () {\n $scope.clients.splice(index, 1);\n return growl.success(_t('app.admin.open_api_clients.client_successfully_deleted'));\n })\n );\n\n $scope.resetToken = client =>\n dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.admin.open_api_clients.confirmation_required'),\n msg: _t('app.admin.open_api_clients.do_you_really_want_to_revoke_this_open_api_access')\n };\n }\n }\n }\n , () =>\n OpenAPIClient.resetToken({ id: client.id }, {}, function (clientResp) {\n client.token = clientResp.token;\n return growl.success(_t('app.admin.open_api_clients.access_successfully_revoked'));\n })\n );\n\n /**\n * Setup the feature-tour for the admin/open_api_clients page.\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupOpenAPITour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('open-api');\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.admin.tour.open_api.welcome.title'),\n content: _t('app.admin.tour.open_api.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n uitour.createStep({\n selector: '.heading .documentation-button',\n stepId: 'doc',\n order: 1,\n title: _t('app.admin.tour.open_api.doc.title'),\n content: _t('app.admin.tour.open_api.doc.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 2,\n title: _t('app.admin.tour.conclusion.title'),\n content: _t('app.admin.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('open-api') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'open-api' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, and if the display behavior is not configured to manual triggering only, show the tour now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('open-api') < 0) {\n uitour.start();\n }\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {};\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n\n]);\n","/* eslint-disable\n camelcase,\n handle-callback-err,\n no-return-assign,\n no-undef,\n no-unused-expressions,\n no-unused-vars,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/* COMMON CODE */\n\nclass PlanController {\n constructor ($scope, groups, prices, partners, CSRF, _t) {\n // protection against request forgery\n CSRF.setMetaTags();\n\n // groups list\n $scope.groups = groups\n .filter(function (g) { return (g.slug !== 'admins') && !g.disabled; })\n .map(e => Object.assign({}, e, { category: 'app.shared.plan.groups', id: `${e.id}` }));\n $scope.groups.push({ id: 'all', name: 'app.shared.plan.transversal_all_groups', category: 'app.shared.plan.all' });\n\n // dynamically translate a label if needed\n $scope.translateLabel = function (group, prop) {\n return group[prop] && group[prop].match(/^app\\./) ? _t(group[prop]) : group[prop];\n };\n\n // users with role 'partner', notifiable for a partner plan\n $scope.partners = partners.users;\n\n // Subscriptions prices, machines prices and training prices, per groups\n $scope.group_pricing = prices;\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n\n /**\n * Mark the provided file for deletion\n * @param file {Object}\n */\n $scope.deleteFile = function (file) {\n if ((file != null) && (file.id != null)) {\n return file._destroy = true;\n }\n };\n\n /**\n * Check and limit\n * @param content\n */\n $scope.limitDescriptionSize = function (content) {\n alert(content);\n };\n }\n}\n\n/**\n * Controller used in the plan creation form\n */\nApplication.Controllers.controller('NewPlanController', ['$scope', '$uibModal', 'groups', 'prices', 'partners', 'CSRF', '$state', 'growl', '_t',\n function ($scope, $uibModal, groups, prices, partners, CSRF, $state, growl, _t) {\n /* PUBLIC SCOPE */\n\n // current form is used to create a new plan\n $scope.mode = 'creation';\n\n // prices bindings\n $scope.prices = {\n training: {},\n machine: {}\n };\n\n // form inputs bindings\n $scope.plan = {\n type: null,\n group_id: null,\n interval: null,\n intervalCount: 0,\n amount: null,\n is_rolling: false,\n partnerId: null,\n partnerContact: null,\n ui_weight: 0,\n monthly_payment: false\n };\n\n // API URL where the form will be posted\n $scope.actionUrl = '/api/plans/';\n\n // HTTP method for the rest API\n $scope.method = 'POST';\n\n /**\n * Checks if the partner contact is a valid data. Used in the form validation process\n * @returns {boolean}\n */\n $scope.partnerIsValid = function () { return ($scope.plan.type === 'Plan') || ($scope.plan.partnerId || ($scope.plan.partnerContact && $scope.plan.partnerContact.email)); };\n\n /**\n * Open a modal dialog allowing the admin to create a new partner user\n */\n $scope.openPartnerNewModal = function (subscription) {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/shared/_partner_new_modal.html',\n size: 'lg',\n controller: ['$scope', '$uibModalInstance', 'User', function ($scope, $uibModalInstance, User) {\n $scope.partner = {};\n\n $scope.ok = function () {\n User.save(\n {},\n { user: $scope.partner },\n function (user) {\n $scope.partner.id = user.id;\n $scope.partner.name = `${user.first_name} ${user.last_name}`;\n $uibModalInstance.close($scope.partner);\n },\n function (error) {\n growl.error(_t('app.admin.plans.new.unable_to_save_this_user_check_that_there_isnt_an_already_a_user_with_the_same_name'));\n console.error(error);\n }\n );\n };\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n // once the form was validated successfully ...\n return modalInstance.result.then(function (partner) {\n $scope.partners.push(partner);\n return $scope.plan.partnerId = partner.id;\n });\n };\n\n /**\n * This will update the monthly_payment value when the user toggles the switch button\n * @param checked {Boolean}\n */\n $scope.toggleMonthlyPayment = function (checked) {\n toggle('monthly_payment', checked);\n };\n\n /**\n * This will update the is_rolling value when the user toggles the switch button\n * @param checked {Boolean}\n */\n $scope.toggleIsRolling = function (checked) {\n toggle('is_rolling', checked);\n };\n\n /**\n * Display some messages and redirect the user, once the form was submitted, depending on the result status\n * (failed/succeeded).\n * @param content {Object}\n */\n $scope.afterSubmit = function (content) {\n if ((content.id == null) && (content.plan_ids == null)) {\n return growl.error(_t('app.admin.plans.new.unable_to_create_the_subscription_please_try_again'));\n } else {\n growl.success(_t('app.admin.plans.new.successfully_created_subscriptions_dont_forget_to_redefine_prices'));\n if (content.plan_ids != null) {\n return $state.go('app.admin.pricing');\n } else {\n if (content.id != null) {\n return $state.go('app.admin.plans.edit', { id: content.id });\n }\n }\n }\n };\n\n /* PRIVATE SCOPE */\n const initialize = function () {\n $scope.$watch(scope => scope.plan.interval,\n (newValue, oldValue) => {\n if (newValue === 'week') { $scope.plan.monthly_payment = false; }\n }\n );\n };\n\n /**\n * Asynchronously updates the given property with the new provided value\n * @param property {string}\n * @param value {*}\n */\n const toggle = function (property, value) {\n setTimeout(() => {\n $scope.plan[property] = value;\n $scope.$apply();\n }, 50);\n };\n\n initialize();\n return new PlanController($scope, groups, prices, partners, CSRF, _t);\n }\n]);\n\n/**\n * Controller used in the plan edition form\n */\nApplication.Controllers.controller('EditPlanController', ['$scope', 'groups', 'plans', 'planPromise', 'machines', 'spaces', 'prices', 'partners', 'CSRF', '$state', '$stateParams', 'growl', '$filter', '_t', 'Plan',\n function ($scope, groups, plans, planPromise, machines, spaces, prices, partners, CSRF, $state, $stateParams, growl, $filter, _t, Plan) {\n /* PUBLIC SCOPE */\n\n // List of spaces\n $scope.spaces = spaces;\n\n // List of plans\n $scope.plans = plans;\n\n // List of machines\n $scope.machines = machines;\n\n // List of groups\n $scope.allGroups = groups;\n\n // current form is used for edition mode\n $scope.mode = 'edition';\n\n // edited plan data\n $scope.plan = Object.assign({}, planPromise, { group_id: `${planPromise.group_id}` });\n if ($scope.plan.type === null) { $scope.plan.type = 'Plan'; }\n if ($scope.plan.disabled) { $scope.plan.disabled = 'true'; }\n\n // API URL where the form will be posted\n $scope.actionUrl = `/api/plans/${$stateParams.id}`;\n\n // HTTP method for the rest API\n $scope.method = 'PATCH';\n\n $scope.selectedGroup = function () {\n const group = $scope.groups.filter(g => g.id === $scope.plan.group_id);\n return $scope.translateLabel(group[0], 'name');\n };\n\n /**\n * If a parent plan was set ($scope.plan.parent), the prices will be copied from this parent plan into\n * the current plan prices list. Otherwise, the current plan prices will be erased.\n */\n $scope.copyPricesFromPlan = function () {\n if ($scope.plan.parent) {\n return Plan.get({ id: $scope.plan.parent }, function (parentPlan) {\n Array.from(parentPlan.prices).map(function (parentPrice) {\n return (function () {\n const result = [];\n for (const childKey in $scope.plan.prices) {\n const childPrice = $scope.plan.prices[childKey];\n if ((childPrice.priceable_type === parentPrice.priceable_type) && (childPrice.priceable_id === parentPrice.priceable_id)) {\n $scope.plan.prices[childKey].amount = parentPrice.amount;\n break;\n } else {\n result.push(undefined);\n }\n }\n return result;\n })();\n });\n }\n );\n\n // if no plan were selected, unset every prices\n } else {\n return (function () {\n const result = [];\n for (const key in $scope.plan.prices) {\n const price = $scope.plan.prices[key];\n result.push($scope.plan.prices[key].amount = 0);\n }\n return result;\n })();\n }\n };\n\n /**\n * Display some messages once the form was submitted, depending on the result status (failed/succeeded)\n * @param content {Object}\n */\n $scope.afterSubmit = function (content) {\n if ((content.id == null) && (content.plan_ids == null)) {\n return growl.error(_t('app.admin.plans.edit.unable_to_save_subscription_changes_please_try_again'));\n } else {\n growl.success(_t('app.admin.plans.edit.subscription_successfully_changed'));\n return $state.go('app.admin.pricing');\n }\n };\n\n /**\n * Generate a string identifying the given plan by literal humain-readable name\n * @param plan {Object} Plan object, as recovered from GET /api/plan/:id\n * @param groups {Array} List of Groups objects, as recovered from GET /api/groups\n * @param short {boolean} If true, the generated name will contains the group slug, otherwise the group full name\n * will be included.\n * @returns {String}\n */\n $scope.humanReadablePlanName = function (plan, groups, short) { return `${$filter('humanReadablePlanName')(plan, groups, short)}`; };\n\n /**\n * Retrieve the machine from its ID\n * @param machine_id {number} machine identifier\n * @returns {Object} Machine\n */\n $scope.getMachine = function (machine_id) {\n for (const machine of Array.from($scope.machines)) {\n if (machine.id === machine_id) {\n return machine;\n }\n }\n };\n\n /**\n * Retrieve the space from its ID\n * @param space_id {number} space identifier\n * @returns {Object} Space\n */\n $scope.getSpace = function (space_id) {\n for (const space of Array.from($scope.spaces)) {\n if (space.id === space_id) {\n return space;\n }\n }\n };\n\n // Using the PlansController\n return new PlanController($scope, groups, prices, partners, CSRF, _t);\n }\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/**\n * Controller used in price category creation/edition form dialog\n */\nApplication.Controllers.controller('PriceCategoryController', ['$scope', '$uibModalInstance', 'category',\n function ($scope, $uibModalInstance, category) {\n // Price category to edit/empty object for new category\n $scope.category = category;\n\n /**\n * Callback for form validation\n */\n $scope.ok = () => $uibModalInstance.close($scope.category);\n\n /**\n * Do not validate the modifications, hide the modal\n */\n return $scope.cancel = () => $uibModalInstance.dismiss('cancel');\n }\n]);\n","/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/**\n * Controller used in the prices edition page\n */\nApplication.Controllers.controller('EditPricingController', ['$scope', '$state', '$uibModal', '$filter', 'TrainingsPricing', 'Credit', 'Pricing', 'Plan', 'Coupon', 'plans', 'groups', 'growl', 'machinesPricesPromise', 'Price', 'dialogs', 'trainingsPricingsPromise', 'trainingsPromise', 'machineCreditsPromise', 'machinesPromise', 'trainingCreditsPromise', 'couponsPromise', 'spacesPromise', 'spacesPricesPromise', 'spacesCreditsPromise', 'settingsPromise', '_t', 'Member', 'uiTourService',\n function ($scope, $state, $uibModal, $filter, TrainingsPricing, Credit, Pricing, Plan, Coupon, plans, groups, growl, machinesPricesPromise, Price, dialogs, trainingsPricingsPromise, trainingsPromise, machineCreditsPromise, machinesPromise, trainingCreditsPromise, couponsPromise, spacesPromise, spacesPricesPromise, spacesCreditsPromise, settingsPromise, _t, Member, uiTourService) {\n /* PUBLIC SCOPE */\n\n // List of machines prices (not considering any plan)\n $scope.machinesPrices = machinesPricesPromise;\n\n // List of trainings pricing\n $scope.trainingsPricings = trainingsPricingsPromise;\n\n // List of available subscriptions plans (eg. student/month, PME/year ...)\n $scope.plans = plans;\n $scope.enabledPlans = plans.filter(function (p) { return !p.disabled; });\n\n // List of groups (eg. normal, student ...)\n $scope.groups = groups.filter(function (g) { return g.slug !== 'admins'; });\n $scope.enabledGroups = groups.filter(function (g) { return (g.slug !== 'admins') && !g.disabled; });\n\n // Associate free machine hours with subscriptions\n $scope.machineCredits = machineCreditsPromise;\n\n // Array of associations (plan <-> training)\n $scope.trainingCredits = trainingCreditsPromise;\n\n // Associate a plan with all its trainings ids\n $scope.trainingCreditsGroups = {};\n\n // List of trainings\n $scope.trainings = trainingsPromise.filter(function (t) { return !t.disabled; });\n\n // List of machines\n $scope.machines = machinesPromise;\n $scope.enabledMachines = machinesPromise.filter(function (m) { return !m.disabled; });\n\n // List of coupons\n $scope.coupons = couponsPromise;\n $scope.couponsPage = 1;\n\n // List of spaces\n $scope.spaces = spacesPromise;\n $scope.enabledSpaces = spacesPromise.filter(function (s) { return !s.disabled; });\n\n // Associate free space hours with subscriptions\n $scope.spaceCredits = spacesCreditsPromise;\n\n // List of spaces prices (not considering any plan)\n $scope.spacesPrices = spacesPricesPromise;\n\n // The plans list ordering. Default: by group\n $scope.orderPlans = 'group_id';\n\n // Status of the drop-down menu in Credits tab\n $scope.status =\n { isopen: false };\n\n // Default: we show only enabled plans\n $scope.planFiltering = 'enabled';\n\n // Default duration for the slots\n $scope.slotDuration = parseInt(settingsPromise.slot_duration, 10);\n\n // Available options for filtering plans by status\n $scope.filterDisabled = [\n 'enabled',\n 'disabled',\n 'all'\n ];\n\n // Default: we do not filter coupons\n $scope.filter = {\n coupon: 'all'\n };\n\n // Available status for filtering coupons\n $scope.couponStatus = [\n 'all',\n 'disabled',\n 'expired',\n 'sold_out',\n 'active'\n ];\n\n // default tab: plans list\n $scope.tabs = { active: 0 };\n\n /**\n * Retrieve a training price from all the trainings prices\n * @param trainingsPricings {Array} all trainings prices\n * @param trainingId {number}\n * @param groupId {number}\n * @returns {float}\n */\n $scope.findTrainingsPricing = function (trainingsPricings, trainingId, groupId) {\n for (const trainingsPricing of Array.from(trainingsPricings)) {\n if ((trainingsPricing.training_id === trainingId) && (trainingsPricing.group_id === groupId)) {\n return trainingsPricing;\n }\n }\n };\n\n /**\n * Update the price of a training for the given parameters\n * @param data {float} the new price\n * @param trainingsPricing {Object} the training pricing to update\n * @returns {Promise|string}\n */\n $scope.updateTrainingsPricing = function (data, trainingsPricing) {\n if (data != null) {\n return TrainingsPricing.update({ id: trainingsPricing.id }, { trainings_pricing: { amount: data } }).$promise;\n } else {\n return _t('app.admin.pricing.please_specify_a_number');\n }\n };\n\n /**\n * Retrieve a plan from its given identifier and returns it\n * @param id {number} plan ID\n * @returns {Object} Plan, inherits from $resource\n */\n $scope.getPlanFromId = function (id) {\n for (const plan of Array.from($scope.plans)) {\n if (plan.id === parseInt(id)) {\n return plan;\n }\n }\n };\n\n /**\n * Retrieve a group from its given identifier and returns it\n * @param id {number} group ID\n * @returns {Object} Group, inherits from $resource\n */\n $scope.getGroupFromId = function (groups, id) {\n for (const group of Array.from(groups)) {\n if (group.id === parseInt(id)) {\n return group;\n }\n }\n };\n\n /**\n * Returns a human readable string of named trainings, according to the provided array.\n * $scope.trainings may contains the full list of training. The returned string will only contains the trainings\n * whom ID are given in the provided parameter\n * @param trainings {Array} trainings IDs array\n */\n $scope.showTrainings = function (trainings) {\n if (!angular.isArray(trainings) || !(trainings.length > 0)) {\n return _t('app.admin.pricing.none');\n }\n\n const selected = [];\n angular.forEach($scope.trainings, function (t) {\n if (trainings.indexOf(t.id) >= 0) {\n return selected.push(t.name);\n }\n });\n if (selected.length) { return selected.join(' | '); } else { return _t('app.admin.pricing.none'); }\n };\n\n /**\n * Validation callback when editing training's credits. Save the changes.\n * @param newdata {Object} training and associated plans\n * @param planId {number|string} plan id\n */\n $scope.saveTrainingCredits = function (newdata, planId) {\n // save the number of credits\n Plan.update(\n { id: planId },\n { training_credit_nb: newdata.training_credits }\n , angular.noop() // do nothing in case of success\n , function (error) {\n growl.error(_t('app.admin.pricing.an_error_occurred_while_saving_the_number_of_credits'));\n console.error(error);\n }\n );\n\n // save the associated trainings\n return angular.forEach($scope.trainingCreditsGroups, function (original, key) {\n if (parseInt(key) === parseInt(planId)) { // we've got the original data\n if (original.join('_') !== newdata.training_ids.join('_')) { // if any changes\n // iterate through the previous credits to remove\n angular.forEach(original, function (oldTrainingId) {\n if (newdata.training_ids.indexOf(oldTrainingId) === -1) {\n const tc = findTrainingCredit(oldTrainingId, planId);\n if (tc) {\n return tc.$delete({}\n , function () {\n $scope.trainingCredits.splice($scope.trainingCredits.indexOf(tc), 1);\n return $scope.trainingCreditsGroups[planId].splice($scope.trainingCreditsGroups[planId].indexOf(tc.id), 1);\n }\n , function (error) {\n growl.error(_t('app.admin.pricing.an_error_occurred_while_deleting_credit_with_the_TRAINING', { TRAINING: tc.creditable.name }));\n console.error(error);\n });\n } else {\n return growl.error(_t('app.admin.pricing.an_error_occurred_unable_to_find_the_credit_to_revoke'));\n }\n }\n });\n\n // iterate through the new credits to add\n return angular.forEach(newdata.training_ids, function (newTrainingId) {\n if (original.indexOf(newTrainingId) === -1) {\n return Credit.save({\n credit: {\n creditable_id: newTrainingId,\n creditable_type: 'Training',\n plan_id: planId\n }\n }\n , function (newTc) { // success\n $scope.trainingCredits.push(newTc);\n return $scope.trainingCreditsGroups[newTc.plan_id].push(newTc.creditable_id);\n }\n , function (error) { // failed\n const training = getTrainingFromId(newTrainingId);\n growl.error(_t('app.admin.pricing.an_error_occurred_while_creating_credit_with_the_TRAINING', { TRAINING: training.name }));\n return console.error(error);\n });\n }\n });\n }\n }\n });\n };\n\n /**\n * Cancel the current training credit modification\n * @param rowform {Object} see http://vitalets.github.io/angular-xeditable/\n */\n $scope.cancelTrainingCredit = function (rowform) { rowform.$cancel(); };\n\n /**\n * Create a new empty entry in the $scope.machineCredits array\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.addMachineCredit = function (e) {\n e.preventDefault();\n e.stopPropagation();\n $scope.inserted =\n { creditable_type: 'Machine' };\n $scope.machineCredits.push($scope.inserted);\n return $scope.status.isopen = !$scope.status.isopen;\n };\n\n /**\n * In the Credits tab, return the name of the machine/space associated with the given credit\n * @param credit {Object} credit object, inherited from $resource\n * @returns {String}\n */\n $scope.showCreditableName = function (credit) {\n let selected = _t('app.admin.pricing.not_set');\n if (credit && credit.creditable_id) {\n const object = $scope.getCreditable(credit);\n selected = object.name;\n if (credit.creditable_type === 'Machine') {\n selected += ` ( id. ${object.id} )`;\n }\n }\n return selected;\n };\n\n /**\n * In the Credits tab, return the machine/space associated with the given credit\n * @param credit {Object} credit object, inherited from $resource\n * @returns {Object}\n */\n $scope.getCreditable = function (credit) {\n let selected;\n if (credit && credit.creditable_id) {\n if (credit.creditable_type === 'Machine') {\n angular.forEach($scope.machines, function (m) {\n if (m.id === credit.creditable_id) {\n return selected = m;\n }\n });\n } else if (credit.creditable_type === 'Space') {\n angular.forEach($scope.spaces, function (s) {\n if (s.id === credit.creditable_id) {\n return selected = s;\n }\n });\n }\n }\n return selected;\n };\n\n /**\n * Validation callback when editing machine's credits. Save the changes.\n * This will prevent the creation of two credits associating the same machine and plan.\n * @param data {Object} machine, associated plan and number of credit hours.\n * @param [id] {number} credit id for edition, create a new credit object if not provided\n */\n $scope.saveMachineCredit = function (data, id) {\n for (const mc of Array.from($scope.machineCredits)) {\n if ((mc.plan_id === data.plan_id) && (mc.creditable_id === data.creditable_id) && ((id === null) || (mc.id !== id))) {\n growl.error(_t('app.admin.pricing.error_a_credit_linking_this_machine_with_that_subscription_already_exists'));\n if (!id) {\n $scope.machineCredits.pop();\n }\n return false;\n }\n }\n\n if (id != null) {\n return Credit.update({ id }, { credit: data }, function () { growl.success(_t('app.admin.pricing.changes_have_been_successfully_saved')); });\n } else {\n data.creditable_type = 'Machine';\n return Credit.save(\n { credit: data }\n , function (resp) {\n $scope.machineCredits[$scope.machineCredits.length - 1].id = resp.id;\n return growl.success(_t('app.admin.pricing.credit_was_successfully_saved'));\n }\n , function (err) {\n $scope.machineCredits.pop();\n growl.error(_t('app.admin.pricing.error_creating_credit'));\n console.error(err);\n });\n }\n };\n\n /**\n * Removes the newly inserted but not saved machine credit / Cancel the current machine credit modification\n * @param rowform {Object} see http://vitalets.github.io/angular-xeditable/\n * @param index {number} credit index in the $scope.machineCredits array\n */\n $scope.cancelMachineCredit = function (rowform, index) {\n if ($scope.machineCredits[index].id != null) {\n return rowform.$cancel();\n } else {\n return $scope.machineCredits.splice(index, 1);\n }\n };\n\n /**\n * Deletes the machine credit at the specified index\n * @param index {number} machine credit index in the $scope.machineCredits array\n */\n $scope.removeMachineCredit = function (index) {\n Credit.delete($scope.machineCredits[index]);\n $scope.machineCredits.splice(index, 1);\n };\n\n /**\n * Create a new empty entry in the $scope.spaceCredits array\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.addSpaceCredit = function (e) {\n e.preventDefault();\n e.stopPropagation();\n $scope.inserted =\n { creditable_type: 'Space' };\n $scope.spaceCredits.push($scope.inserted);\n $scope.status.isopen = !$scope.status.isopen;\n };\n\n /**\n * Validation callback when editing space's credits. Save the changes.\n * This will prevent the creation of two credits associated with the same space and plan.\n * @param data {Object} space, associated plan and number of credit hours.\n * @param [id] {number} credit id for edition, create a new credit object if not provided\n */\n $scope.saveSpaceCredit = function (data, id) {\n for (const sc of Array.from($scope.spaceCredits)) {\n if ((sc.plan_id === data.plan_id) && (sc.creditable_id === data.creditable_id) && ((id === null) || (sc.id !== id))) {\n growl.error(_t('app.admin.pricing.error_a_credit_linking_this_space_with_that_subscription_already_exists'));\n if (!id) {\n $scope.spaceCredits.pop();\n }\n return false;\n }\n }\n\n if (id != null) {\n return Credit.update({ id }, { credit: data }, function () { growl.success(_t('app.admin.pricing.changes_have_been_successfully_saved')); });\n } else {\n data.creditable_type = 'Space';\n return Credit.save(\n { credit: data }\n , function (resp) {\n $scope.spaceCredits[$scope.spaceCredits.length - 1].id = resp.id;\n return growl.success(_t('app.admin.pricing.credit_was_successfully_saved'));\n }\n , function (err) {\n $scope.spaceCredits.pop();\n return growl.error(_t('app.admin.pricing.error_creating_credit'));\n });\n }\n };\n\n /**\n * Removes the newly inserted but not saved space credit / Cancel the current space credit modification\n * @param rowform {Object} see http://vitalets.github.io/angular-xeditable/\n * @param index {number} credit index in the $scope.spaceCredits array\n */\n $scope.cancelSpaceCredit = function (rowform, index) {\n if ($scope.spaceCredits[index].id != null) {\n return rowform.$cancel();\n } else {\n return $scope.spaceCredits.splice(index, 1);\n }\n };\n\n /**\n * Deletes the space credit at the specified index\n * @param index {number} space credit index in the $scope.spaceCredits array\n */\n $scope.removeSpaceCredit = function (index) {\n Credit.delete($scope.spaceCredits[index]);\n return $scope.spaceCredits.splice(index, 1);\n };\n\n /**\n * If the plan does not have a type, return a default value for display purposes\n * @param type {string|undefined|null} plan's type (eg. 'partner')\n * @returns {string}\n */\n $scope.getPlanType = function (type) {\n if (type === 'PartnerPlan') {\n return _t('app.admin.pricing.partner');\n } else { return _t('app.admin.pricing.standard'); }\n };\n\n /**\n * Change the plans ordering criterion to the one provided\n * @param orderBy {string} ordering criterion\n */\n $scope.setOrderPlans = function (orderBy) {\n if ($scope.orderPlans === orderBy) {\n return $scope.orderPlans = `-${orderBy}`;\n } else {\n return $scope.orderPlans = orderBy;\n }\n };\n\n /**\n * Retrieve a price from prices array by a machineId and a groupId\n */\n $scope.findPriceBy = function (prices, machineId, groupId) {\n for (const price of Array.from(prices)) {\n if ((price.priceable_id === machineId) && (price.group_id === groupId)) {\n return price;\n }\n }\n };\n\n /**\n * update a price for a machine and a group, not considering any plan\n */\n $scope.updatePrice = function (data, price) {\n if (data != null) {\n return Price.update({ id: price.id }, { price: { amount: data } }).$promise;\n } else {\n return _t('app.admin.pricing.please_specify_a_number');\n }\n };\n\n /**\n * Delete the specified subcription plan\n * @param id {number} plan id\n */\n $scope.deletePlan = function (plans, id) {\n if (typeof id !== 'number') {\n return console.error('[EditPricingController::deletePlan] Error: invalid id parameter');\n } else {\n // open a confirmation dialog\n return dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.pricing.confirmation_required'),\n msg: _t('app.admin.pricing.do_you_really_want_to_delete_this_subscription_plan')\n };\n }\n }\n },\n function () {\n // the admin has confirmed, delete the plan\n Plan.delete(\n { id },\n function (res) {\n growl.success(_t('app.admin.pricing.subscription_plan_was_successfully_deleted'));\n return $scope.plans.splice(findItemIdxById(plans, id), 1);\n },\n function (error) {\n if (error.statusText) { console.error(`[EditPricingController::deletePlan] Error: ${error.statusText}`); }\n growl.error(_t('app.admin.pricing.unable_to_delete_the_specified_subscription_an_error_occurred'));\n }\n );\n }\n );\n }\n };\n\n /**\n * Generate a string identifying the given plan by literal humain-readable name\n * @param plan {Object} Plan object, as recovered from GET /api/plan/:id\n * @param groups {Array} List of Groups objects, as recovered from GET /api/groups\n * @param short {boolean} If true, the generated name will contains the group slug, otherwise the group full name\n * will be included.\n * @returns {String}\n */\n $scope.humanReadablePlanName = function (plan, groups, short) { return `${$filter('humanReadablePlanName')(plan, groups, short)}`; };\n\n /**\n * Delete a coupon from the server's database and, in case of success, from the list in memory\n * @param coupons {Array} should be called with $scope.coupons\n * @param id {number} ID of the coupon to delete\n */\n $scope.deleteCoupon = function (coupons, id) {\n if (typeof id !== 'number') {\n return console.error('[EditPricingController::deleteCoupon] Error: invalid id parameter');\n } else {\n // open a confirmation dialog\n return dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.admin.pricing.confirmation_required'),\n msg: _t('app.admin.pricing.do_you_really_want_to_delete_this_coupon')\n };\n }\n }\n }\n , function () {\n // the admin has confirmed, delete the coupon\n Coupon.delete({ id }, function (res) {\n growl.success(_t('app.admin.pricing.coupon_was_successfully_deleted'));\n return $scope.coupons.splice(findItemIdxById(coupons, id), 1);\n }\n\n , function (error) {\n if (error.statusText) { console.error(`[EditPricingController::deleteCoupon] Error: ${error.statusText}`); }\n if (error.status === 422) {\n return growl.error(_t('app.admin.pricing.unable_to_delete_the_specified_coupon_already_in_use'));\n } else {\n return growl.error(_t('app.admin.pricing.unable_to_delete_the_specified_coupon_an_unexpected_error_occurred'));\n }\n });\n });\n }\n };\n\n /**\n * Open a modal allowing to select an user and send him the details of the provided coupon\n * @param coupon {Object} The coupon to send\n */\n $scope.sendCouponToUser = function (coupon) {\n $uibModal.open({\n templateUrl: '/admin/pricing/sendCoupon.html',\n resolve: {\n coupon () { return coupon; }\n },\n size: 'md',\n controller: ['$scope', '$uibModalInstance', 'Coupon', 'coupon', '_t', function ($scope, $uibModalInstance, Coupon, coupon, _t) {\n // Member, receiver of the coupon\n $scope.ctrl =\n { member: null };\n\n // Details of the coupon to send\n $scope.coupon = coupon;\n\n // Callback to validate sending of the coupon\n $scope.ok = function () {\n Coupon.send({ coupon_code: coupon.code, user_id: $scope.ctrl.member.id }, function (res) {\n growl.success(_t('app.admin.pricing.coupon_successfully_sent_to_USER', { USER: $scope.ctrl.member.name }));\n return $uibModalInstance.close({ user_id: $scope.ctrl.member.id });\n }\n , function (err) {\n growl.error(_t('app.admin.pricing.an_error_occurred_unable_to_send_the_coupon'));\n console.error(err);\n });\n };\n // Callback to close the modal and cancel the sending process\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n };\n\n /**\n * Load the next 10 coupons\n */\n $scope.loadMore = function () {\n $scope.couponsPage++;\n Coupon.query({ page: $scope.couponsPage, filter: $scope.filter.coupon }, function (data) {\n $scope.coupons = $scope.coupons.concat(data);\n });\n };\n\n /**\n * Reset the list of coupons according to the newly selected filter\n */\n $scope.updateCouponFilter = function () {\n $scope.couponsPage = 1;\n Coupon.query({ page: $scope.couponsPage, filter: $scope.filter.coupon }, function (data) {\n $scope.coupons = data;\n });\n };\n\n /**\n * Return the exemple price based on the configuration of the default slot duration.\n * @param type {string} 'hourly_rate' | *\n * @returns {number} price for \"SLOT_DURATION\" minutes.\n */\n $scope.examplePrice = function (type) {\n const hourlyRate = 10;\n\n if (type === 'hourly_rate') {\n return $filter('currency')(hourlyRate);\n }\n\n const price = (hourlyRate / 60) * $scope.slotDuration;\n return $filter('currency')(price);\n };\n\n /**\n * Setup the feature-tour for the admin/pricing page.\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupPricingTour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('pricing');\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.admin.tour.pricing.welcome.title'),\n content: _t('app.admin.tour.pricing.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n uitour.createStep({\n selector: '.plans-pricing .new-plan-button',\n stepId: 'new_plan',\n order: 1,\n title: _t('app.admin.tour.pricing.new_plan.title'),\n content: _t('app.admin.tour.pricing.new_plan.content'),\n placement: 'bottom'\n });\n if ($scope.$root.modules.trainings) {\n uitour.createStep({\n selector: '.plans-pricing .trainings-tab',\n stepId: 'trainings',\n order: 2,\n title: _t('app.admin.tour.pricing.trainings.title'),\n content: _t('app.admin.tour.pricing.trainings.content'),\n placement: 'bottom'\n });\n }\n uitour.createStep({\n selector: '.plans-pricing .machines-tab',\n stepId: 'machines',\n order: 3,\n title: _t('app.admin.tour.pricing.machines.title'),\n content: _t('app.admin.tour.pricing.machines.content'),\n placement: 'bottom'\n });\n if ($scope.$root.modules.spaces) {\n uitour.createStep({\n selector: '.plans-pricing .spaces-tab',\n stepId: 'spaces',\n order: 4,\n title: _t('app.admin.tour.pricing.spaces.title'),\n content: _t('app.admin.tour.pricing.spaces.content'),\n placement: 'bottom'\n });\n }\n uitour.createStep({\n selector: '.plans-pricing .credits-tab',\n stepId: 'credits',\n order: 5,\n title: _t('app.admin.tour.pricing.credits.title'),\n content: _t('app.admin.tour.pricing.credits.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.plans-pricing .coupons-tab',\n stepId: 'coupons',\n order: 6,\n title: _t('app.admin.tour.pricing.coupons.title'),\n content: _t('app.admin.tour.pricing.coupons.content'),\n placement: 'bottom',\n popupClass: 'shift-left-50'\n });\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 7,\n title: _t('app.admin.tour.conclusion.title'),\n content: _t('app.admin.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on step change, change the active tab if needed\n uitour.on('stepChanged', function (nextStep) {\n if (nextStep.stepId === 'new_plan') { $scope.tabs.active = 0; }\n if (nextStep.stepId === 'trainings') { $scope.tabs.active = 1; }\n if (nextStep.stepId === 'machines') { $scope.tabs.active = 2; }\n if (nextStep.stepId === 'spaces') { $scope.tabs.active = 3; }\n if (nextStep.stepId === 'credits') { $scope.tabs.active = 4; }\n if (nextStep.stepId === 'coupons') { $scope.tabs.active = 5; }\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('pricing') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'pricing' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('pricing') < 0) {\n uitour.start();\n }\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n $scope.trainingCreditsGroups = groupCreditsByPlan($scope.trainingCredits);\n\n // adds empty array for plan which hasn't any credits yet\n return (function () {\n const result = [];\n for (const plan of Array.from($scope.plans)) {\n if ($scope.trainingCreditsGroups[plan.id] == null) {\n result.push($scope.trainingCreditsGroups[plan.id] = []);\n } else {\n result.push(undefined);\n }\n }\n return result;\n })();\n };\n\n /**\n * Retrieve an item index by its ID from the given array of objects\n * @param items {Array<{id:number}>}\n * @param id {number}\n * @returns {number} item index in the provided array\n */\n const findItemIdxById = function (items, id) {\n return (items.map(function (item) { return item.id; })).indexOf(id);\n };\n\n /**\n * Group the given credits array into a map associating the plan ID with its associated trainings/machines\n * @return {Object} the association map\n */\n const groupCreditsByPlan = function (credits) {\n const creditsMap = {};\n angular.forEach(credits, function (c) {\n if (!creditsMap[c.plan_id]) {\n creditsMap[c.plan_id] = [];\n }\n return creditsMap[c.plan_id].push(c.creditable_id);\n });\n return creditsMap;\n };\n\n /**\n * Iterate through $scope.traininfCredits to find the credit matching the given criterion\n * @param trainingId {number|string} training ID\n * @param planId {number|string} plan ID\n */\n const findTrainingCredit = function (trainingId, planId) {\n trainingId = parseInt(trainingId);\n planId = parseInt(planId);\n\n for (const credit of Array.from($scope.trainingCredits)) {\n if ((credit.plan_id === planId) && (credit.creditable_id === trainingId)) {\n return credit;\n }\n }\n };\n\n /**\n * Retrieve a training from its given identifier and returns it\n * @param id {number} training ID\n * @returns {Object} Training inherited from $resource\n */\n const getTrainingFromId = function (id) {\n for (const training of Array.from($scope.trainings)) {\n if (training.id === parseInt(id)) {\n return training;\n }\n }\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\nApplication.Controllers.controller('AdminProjectsController', ['$scope', '$state', 'Component', 'Licence', 'Theme', 'componentsPromise', 'licencesPromise', 'themesPromise', '_t', 'Member', 'uiTourService', 'settingsPromise', 'growl',\n function ($scope, $state, Component, Licence, Theme, componentsPromise, licencesPromise, themesPromise, _t, Member, uiTourService, settingsPromise, growl) {\n // Materials list (plastic, wood ...)\n $scope.components = componentsPromise;\n\n // Licences list (Creative Common ...)\n $scope.licences = licencesPromise;\n\n // Themes list (cooking, sport ...)\n $scope.themes = themesPromise;\n\n // Application settings\n $scope.allSettings = settingsPromise;\n\n // default tab: materials\n $scope.tabs = { active: 0 };\n\n /**\n * Saves a new component / Update an existing material to the server (form validation callback)\n * @param data {Object} component name\n * @param [id] {number} component id, in case of update\n */\n $scope.saveComponent = function (data, id) {\n if (id != null) {\n return Component.update({ id }, data);\n } else {\n return Component.save(data, resp => $scope.components[$scope.components.length - 1].id = resp.id);\n }\n };\n\n /**\n * Deletes the component at the specified index\n * @param index {number} component index in the $scope.components array\n */\n $scope.removeComponent = function (index) {\n Component.delete($scope.components[index]);\n return $scope.components.splice(index, 1);\n };\n\n /**\n * Creates a new empty entry in the $scope.components array\n */\n $scope.addComponent = function () {\n $scope.inserted = { name: '' };\n $scope.components.push($scope.inserted);\n };\n\n /**\n * Removes the newly inserted but not saved component / Cancel the current component modification\n * @param rowform {Object} see http://vitalets.github.io/angular-xeditable/\n * @param index {number} component index in the $scope.components array\n */\n $scope.cancelComponent = function (rowform, index) {\n if ($scope.components[index].id != null) {\n return rowform.$cancel();\n } else {\n return $scope.components.splice(index, 1);\n }\n };\n\n /**\n * Saves a new theme / Update an existing theme to the server (form validation callback)\n * @param data {Object} theme name\n * @param [data] {number} theme id, in case of update\n */\n $scope.saveTheme = function (data, id) {\n if (id != null) {\n return Theme.update({ id }, data);\n } else {\n return Theme.save(data, resp => $scope.themes[$scope.themes.length - 1].id = resp.id);\n }\n };\n\n /**\n * Deletes the theme at the specified index\n * @param index {number} theme index in the $scope.themes array\n */\n $scope.removeTheme = function (index) {\n Theme.delete($scope.themes[index]);\n return $scope.themes.splice(index, 1);\n };\n\n /**\n * Creates a new empty entry in the $scope.themes array\n */\n $scope.addTheme = function () {\n $scope.inserted = { name: '' };\n $scope.themes.push($scope.inserted);\n };\n\n /**\n * Removes the newly inserted but not saved theme / Cancel the current theme modification\n * @param rowform {Object} see http://vitalets.github.io/angular-xeditable/\n * @param index {number} theme index in the $scope.themes array\n */\n $scope.cancelTheme = function (rowform, index) {\n if ($scope.themes[index].id != null) {\n rowform.$cancel();\n } else {\n $scope.themes.splice(index, 1);\n }\n };\n\n /**\n * Saves a new licence / Update an existing licence to the server (form validation callback)\n * @param data {Object} licence name and description\n * @param [id] {number} licence id, in case of update\n */\n $scope.saveLicence = function (data, id) {\n if (id != null) {\n return Licence.update({ id }, data);\n } else {\n return Licence.save(data, resp => $scope.licences[$scope.licences.length - 1].id = resp.id);\n }\n };\n\n /**\n * Deletes the licence at the specified index\n * @param index {number} licence index in the $scope.licences array\n */\n $scope.removeLicence = function (index) {\n Licence.delete($scope.licences[index]);\n return $scope.licences.splice(index, 1);\n };\n\n /**\n * Creates a new empty entry in the $scope.licences array\n */\n $scope.addLicence = function () {\n $scope.inserted = {\n name: '',\n description: ''\n };\n return $scope.licences.push($scope.inserted);\n };\n\n /**\n * Removes the newly inserted but not saved licence / Cancel the current licence modification\n * @param rowform {Object} see http://vitalets.github.io/angular-xeditable/\n * @param index {number} licence index in the $scope.licences array\n */\n $scope.cancelLicence = function (rowform, index) {\n if ($scope.licences[index].id != null) {\n return rowform.$cancel();\n } else {\n return $scope.licences.splice(index, 1);\n }\n };\n\n /**\n * When a file is sent to the server to test it against its MIME type,\n * handle the result of the test.\n */\n $scope.onTestFileComplete = function (res) {\n if (res) {\n growl.success(_t('app.admin.projects.settings.file_is_TYPE', { TYPE: res.type }));\n }\n };\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n\n /**\n * Remove the initial dot from the given extension, if any\n * @param extension {String}\n * @returns {String}\n */\n $scope.removeInitialDot = function (extension) {\n if (extension.substr(0, 1) === '.') return $scope.lower(extension.substr(1));\n\n return $scope.lower(extension);\n };\n\n /**\n * Return the lowercase version of the provided string\n * @param text {String}\n * @returns {string}\n */\n $scope.lower = function (text) {\n return text.toLowerCase();\n };\n\n /**\n * Setup the feature-tour for the admin/projects page.\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupProjectElementsTour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('projects');\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.admin.tour.projects.welcome.title'),\n content: _t('app.admin.tour.projects.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n uitour.createStep({\n selector: '.heading .abuses-button',\n stepId: 'abuses',\n order: 1,\n title: _t('app.admin.tour.projects.abuses.title'),\n content: _t('app.admin.tour.projects.abuses.content'),\n placement: 'bottom',\n popupClass: 'shift-left-40'\n });\n uitour.createStep({\n selector: '.projects .settings-tab',\n stepId: 'settings',\n order: 2,\n title: _t('app.admin.tour.projects.settings.title'),\n content: _t('app.admin.tour.projects.settings.content'),\n placement: 'bottom',\n popupClass: 'shift-left-50'\n });\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 3,\n title: _t('app.admin.tour.conclusion.title'),\n content: _t('app.admin.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on step change, change the active tab if needed\n uitour.on('stepChanged', function (nextStep) {\n if (nextStep.stepId === 'settings') { $scope.tabs.active = 3; }\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('projects') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'projects' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('projects') < 0) {\n uitour.start();\n }\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {};\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\nApplication.Controllers.controller('SettingsController', ['$scope', '$rootScope', '$filter', '$uibModal', 'dialogs', 'Setting', 'growl', 'settingsPromise', 'privacyDraftsPromise', 'cgvFile', 'cguFile', 'logoFile', 'logoBlackFile', 'faviconFile', 'profileImageFile', 'CSRF', '_t', 'Member', 'uiTourService',\n function ($scope, $rootScope, $filter, $uibModal, dialogs, Setting, growl, settingsPromise, privacyDraftsPromise, cgvFile, cguFile, logoFile, logoBlackFile, faviconFile, profileImageFile, CSRF, _t, Member, uiTourService) {\n /* PUBLIC SCOPE */\n\n // timepickers steps configuration\n $scope.timepicker = {\n hstep: 1,\n mstep: 15\n };\n\n // API URL where the upload forms will be posted\n $scope.actionUrl = {\n cgu: '/api/custom_assets',\n cgv: '/api/custom_assets',\n logo: '/api/custom_assets',\n logoBlack: '/api/custom_assets',\n favicon: '/api/custom_assets',\n profileImage: '/api/custom_assets'\n };\n\n // Form actions on the above URL\n $scope.methods = {\n cgu: 'post',\n cgv: 'post',\n logo: 'post',\n logoBlack: 'post',\n favicon: 'post',\n profileImage: 'post'\n };\n\n // Are we uploading the files currently (if so, display the loader)\n $scope.loader = {\n cgu: false,\n cgv: false\n };\n\n // default tab: general\n $scope.tabs = { active: 0 };\n\n // full history of privacy policy drafts\n $scope.privacyDraftsHistory = [];\n\n // all settings as retrieved from database\n $scope.allSettings = settingsPromise;\n\n // various configurable settings\n $scope.aboutTitleSetting = { name: 'about_title', value: settingsPromise.about_title };\n $scope.aboutBodySetting = { name: 'about_body', value: settingsPromise.about_body };\n $scope.privacyDpoSetting = { name: 'privacy_dpo', value: settingsPromise.privacy_dpo };\n $scope.aboutContactsSetting = { name: 'about_contacts', value: settingsPromise.about_contacts };\n $scope.homeBlogpostSetting = { name: 'home_blogpost', value: settingsPromise.home_blogpost };\n $scope.homeContent = { name: 'home_content', value: settingsPromise.home_content };\n $scope.homeCss = { name: 'home_css', value: settingsPromise.home_css };\n $scope.machineExplicationsAlert = { name: 'machine_explications_alert', value: settingsPromise.machine_explications_alert };\n $scope.trainingExplicationsAlert = { name: 'training_explications_alert', value: settingsPromise.training_explications_alert };\n $scope.trainingInformationMessage = { name: 'training_information_message', value: settingsPromise.training_information_message };\n $scope.subscriptionExplicationsAlert = { name: 'subscription_explications_alert', value: settingsPromise.subscription_explications_alert };\n $scope.eventExplicationsAlert = { name: 'event_explications_alert', value: settingsPromise.event_explications_alert };\n $scope.spaceExplicationsAlert = { name: 'space_explications_alert', value: settingsPromise.space_explications_alert };\n $scope.windowStart = { name: 'booking_window_start', value: settingsPromise.booking_window_start };\n $scope.windowEnd = { name: 'booking_window_end', value: settingsPromise.booking_window_end };\n $scope.mainColorSetting = { name: 'main_color', value: settingsPromise.main_color };\n $scope.secondColorSetting = { name: 'secondary_color', value: settingsPromise.secondary_color };\n $scope.nameGenre = { name: 'name_genre', value: settingsPromise.name_genre };\n $scope.cguFile = cguFile.custom_asset;\n $scope.cgvFile = cgvFile.custom_asset;\n $scope.customLogo = logoFile.custom_asset;\n $scope.customLogoBlack = logoBlackFile.custom_asset;\n $scope.customFavicon = faviconFile.custom_asset;\n $scope.profileImage = profileImageFile.custom_asset;\n\n // By default, we display the currently published privacy policy\n $scope.privacyPolicy = {\n version: null,\n bodyTemp: settingsPromise.privacy_body\n };\n\n // Extend the options for summernote editor, with special tools for home page\n $scope.summernoteOptsHomePage = angular.copy($rootScope.summernoteOpts);\n $scope.summernoteOptsHomePage.toolbar[5][1].push('nugget'); // toolbar -> insert -> nugget\n $scope.summernoteOptsHomePage.nugget = {\n label: '\\uF12E',\n tooltip: _t('app.admin.settings.home_items'),\n list: [\n `
${_t('app.admin.settings.item_news')}
`,\n `
${_t('app.admin.settings.item_projects')}
`,\n `
${_t('app.admin.settings.item_twitter')}
`,\n `
${_t('app.admin.settings.item_members')}
`,\n `
${_t('app.admin.settings.item_events')}
`\n ]\n }\n $scope.summernoteOptsHomePage.height = 400;\n\n // codemirror editor\n $scope.codeMirrorEditor = null;\n\n // Options for codemirror editor, used for custom css\n $scope.codemirrorOpts = {\n matchBrackets : true,\n lineNumbers: true,\n mode: 'sass'\n }\n\n // Show or hide advanced settings\n $scope.advancedSettings = {\n open: false\n }\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n\n /**\n * Callback to save the setting value to the database\n * @param setting {{value:*, name:string}} note that the value will be stringified\n */\n $scope.save = function (setting) {\n // trim empty html\n let value;\n if ((setting.value === '
') || (setting.value === '


')) {\n setting.value = '';\n }\n // convert dates to ISO format\n if (setting.value instanceof Date) {\n setting.value = setting.value.toISOString();\n }\n\n if (setting.value !== null) {\n value = setting.value.toString();\n } else {\n ({ value } = setting);\n }\n\n Setting.update(\n { name: setting.name },\n { value },\n function () { growl.success(_t('app.admin.settings.customization_of_SETTING_successfully_saved', { SETTING: _t(`app.admin.settings.${setting.name}`) })); },\n function (error) {\n if (error.status === 304) return;\n\n growl.error(_t('app.admin.settings.an_error_occurred_saving_the_setting'));\n console.log(error);\n }\n );\n };\n\n /**\n * The privacy policy has its own special save function because updating the policy must notify all users\n */\n $scope.savePrivacyPolicy = function () {\n // open modal\n const modalInstance = $uibModal.open({\n templateUrl: '/admin/settings/save_policy.html',\n controller: 'SavePolicyController',\n resolve: {\n saveCb () { return $scope.save; },\n privacyPolicy () { return $scope.privacyPolicy; }\n }\n });\n\n // once done, update the client data\n modalInstance.result.then(function (type) {\n Setting.get({ name: 'privacy_draft', history: true }, function (data) {\n // reset history\n $scope.privacyDraftsHistory = [];\n data.setting.history.forEach(function (draft) {\n $scope.privacyDraftsHistory.push({ id: draft.id, name: _t('app.admin.settings.privacy.draft_from_USER_DATE', { USER: draft.user.name, DATE: draft.created_at }), content: draft.value });\n });\n if (type === 'privacy_draft') {\n const orderedHistory = $filter('orderBy')(data.setting.history, 'created_at');\n const last = orderedHistory[orderedHistory.length - 1];\n if (last) {\n $scope.privacyPolicy.version = last.id;\n }\n } else {\n $scope.privacyPolicy.version = null;\n }\n })\n });\n };\n\n /**\n * For use with ngUpload (https://github.com/twilson63/ngUpload).\n * Intended to be the callback when the upload is done: Any raised error will be displayed in a growl\n * message. If everything goes fine, a growl success message is shown.\n * @param content {Object} JSON - The upload's result\n */\n $scope.submited = function (content) {\n if ((content.custom_asset == null)) {\n $scope.alerts = [];\n return angular.forEach(content, function (v) {\n angular.forEach(v, function(err) { growl.error(err); })\n });\n } else {\n growl.success(_t('app.admin.settings.file_successfully_updated'));\n if (content.custom_asset.name === 'cgu-file') {\n $scope.cguFile = content.custom_asset;\n $scope.methods.cgu = 'put';\n if (!($scope.actionUrl.cgu.indexOf('/cgu-file') > 0)) { $scope.actionUrl.cgu += '/cgu-file'; }\n return $scope.loader.cgu = false;\n } else if (content.custom_asset.name === 'cgv-file') {\n $scope.cgvFile = content.custom_asset;\n $scope.methods.cgv = 'put';\n if (!($scope.actionUrl.cgv.indexOf('/cgv-file') > 0)) { $scope.actionUrl.cgv += '/cgv-file'; }\n return $scope.loader.cgv = false;\n } else if (content.custom_asset.name === 'logo-file') {\n $scope.customLogo = content.custom_asset;\n $scope.methods.logo = 'put';\n if (!($scope.actionUrl.logo.indexOf('/logo-file') > 0)) { return $scope.actionUrl.logo += '/logo-file'; }\n } else if (content.custom_asset.name === 'logo-black-file') {\n $scope.customLogoBlack = content.custom_asset;\n $scope.methods.logoBlack = 'put';\n if (!($scope.actionUrl.logoBlack.indexOf('/logo-black-file') > 0)) { return $scope.actionUrl.logoBlack += '/logo-black-file'; }\n } else if (content.custom_asset.name === 'favicon-file') {\n $scope.customFavicon = content.custom_asset;\n $scope.methods.favicon = 'put';\n if (!($scope.actionUrl.favicon.indexOf('/favicon-file') > 0)) { return $scope.actionUrl.favicon += '/favicon-file'; }\n } else if (content.custom_asset.name === 'profile-image-file') {\n $scope.profileImage = content.custom_asset;\n $scope.methods.profileImage = 'put';\n if (!($scope.actionUrl.profileImage.indexOf('/profile-image-file') > 0)) { return $scope.actionUrl.profileImage += '/profile-image-file'; }\n }\n }\n };\n\n /**\n * @param target {String} 'cgu' | 'cgv'\n */\n $scope.addLoader = function (target) {\n $scope.loader[target] = true;\n }\n\n /**\n * Change the revision of the displayed privacy policy, from drafts history\n */\n $scope.handlePolicyRevisionChange = function () {\n if ($scope.privacyPolicy.version === null) {\n $scope.privacyPolicy.bodyTemp = settingsPromise.privacy_body;\n return;\n }\n for (const draft of $scope.privacyDraftsHistory) {\n if (draft.id == $scope.privacyPolicy.version) {\n $scope.privacyPolicy.bodyTemp = draft.content;\n break;\n }\n }\n };\n\n /**\n * Open a modal showing a sample of the collected data if FabAnalytics is enabled\n */\n $scope.analyticsModal = function() {\n $uibModal.open({\n templateUrl: '/admin/settings/analyticsModal.html',\n controller: 'AnalyticsModalController',\n size: 'lg',\n resolve: {\n analyticsData: ['FabAnalytics', function (FabAnalytics) { return FabAnalytics.data().$promise; }]\n }\n });\n }\n\n /**\n * Reset the home page to its initial state (factory value)\n */\n $scope.resetHomePage = function () {\n dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.admin.settings.confirmation_required'),\n msg: _t('app.admin.settings.confirm_reset_home_page')\n };\n }\n }\n }\n , function () { // confirmed\n Setting.reset({ name: 'home_content' }, function (data) {\n $scope.homeContent.value = data.value;\n growl.success(_t('app.admin.settings.home_content_reset'));\n })\n }\n )\n }\n\n /**\n * Callback triggered when the codemirror editor is loaded into the DOM\n * @param editor codemirror instance\n */\n $scope.codemirrorLoaded = function (editor) {\n $scope.codeMirrorEditor = editor;\n }\n\n /**\n * Setup the feature-tour for the admin/settings page.\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupSettingsTour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('settings');\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.admin.tour.settings.welcome.title'),\n content: _t('app.admin.tour.settings.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n uitour.createStep({\n selector: '.admin-settings .general-page-tab',\n stepId: 'general',\n order: 1,\n title: _t('app.admin.tour.settings.general.title'),\n content: _t('app.admin.tour.settings.general.content'),\n placement: 'bottom',\n });\n uitour.createStep({\n selector: '.admin-settings .home-page-content h4',\n stepId: 'home',\n order: 2,\n title: _t('app.admin.tour.settings.home.title'),\n content: _t('app.admin.tour.settings.home.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.admin-settings .home-page-content .note-toolbar .note-insert div',\n stepId: 'components',\n order: 3,\n title: _t('app.admin.tour.settings.components.title'),\n content: _t('app.admin.tour.settings.components.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.admin-settings .home-page-content .note-toolbar .btn-codeview',\n stepId: 'codeview',\n order: 4,\n title: _t('app.admin.tour.settings.codeview.title'),\n content: _t('app.admin.tour.settings.codeview.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.admin-settings .reset-button',\n stepId: 'reset',\n order: 5,\n title: _t('app.admin.tour.settings.reset.title'),\n content: _t('app.admin.tour.settings.reset.content'),\n placement: 'left'\n });\n uitour.createStep({\n selector: '.admin-settings .home-page-style',\n stepId: 'css',\n order: 6,\n title: _t('app.admin.tour.settings.css.title'),\n content: _t('app.admin.tour.settings.css.content'),\n placement: 'top'\n });\n uitour.createStep({\n selector: '.admin-settings .about-page-tab',\n stepId: 'about',\n order: 7,\n title: _t('app.admin.tour.settings.about.title'),\n content: _t('app.admin.tour.settings.about.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.admin-settings .privacy-page-tab',\n stepId: 'privacy',\n order: 8,\n title: _t('app.admin.tour.settings.privacy.title'),\n content: _t('app.admin.tour.settings.privacy.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.admin-settings .history-select',\n stepId: 'draft',\n order: 9,\n title: _t('app.admin.tour.settings.draft.title'),\n content: _t('app.admin.tour.settings.draft.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.admin-settings .reservations-page-tab',\n stepId: 'reservations',\n order: 10,\n title: _t('app.admin.tour.settings.reservations.title'),\n content: _t('app.admin.tour.settings.reservations.content'),\n placement: 'bottom',\n popupClass: 'shift-left-50'\n });\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 11,\n title: _t('app.admin.tour.conclusion.title'),\n content: _t('app.admin.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on step change, change the active tab if needed\n uitour.on('stepChanged', function (nextStep) {\n if (nextStep.stepId === 'general') { $scope.tabs.active = 0; }\n if (nextStep.stepId === 'home' || nextStep.stepId === 'css') { $scope.tabs.active = 1; }\n if (nextStep.stepId === 'about') { $scope.tabs.active = 2; }\n if (nextStep.stepId === 'privacy' || nextStep.stepId === 'draft') { $scope.tabs.active = 3; }\n if (nextStep.stepId === 'reservations') { $scope.tabs.active = 4; }\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('settings') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'settings' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if ($scope.allSettings.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('settings') < 0) {\n uitour.start();\n }\n }\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n // set the authenticity tokens in the forms\n CSRF.setMetaTags();\n\n // we prevent the admin from setting the closing time before the opening time\n $scope.$watch('windowEnd.value', function (newValue, oldValue, scope) {\n if ($scope.windowStart && moment($scope.windowStart.value).isAfter(newValue)) {\n return $scope.windowEnd.value = oldValue;\n }\n });\n\n // change form methods to PUT if items already exists\n if (cguFile.custom_asset) {\n $scope.methods.cgu = 'put';\n $scope.actionUrl.cgu += '/cgu-file';\n }\n if (cgvFile.custom_asset) {\n $scope.methods.cgv = 'put';\n $scope.actionUrl.cgv += '/cgv-file';\n }\n if (logoFile.custom_asset) {\n $scope.methods.logo = 'put';\n $scope.actionUrl.logo += '/logo-file';\n }\n if (logoBlackFile.custom_asset) {\n $scope.methods.logoBlack = 'put';\n $scope.actionUrl.logoBlack += '/logo-black-file';\n }\n if (faviconFile.custom_asset) {\n $scope.methods.favicon = 'put';\n $scope.actionUrl.favicon += '/favicon-file';\n }\n if (profileImageFile.custom_asset) {\n $scope.methods.profileImage = 'put';\n $scope.actionUrl.profileImage += '/profile-image-file';\n }\n\n privacyDraftsPromise.setting.history.forEach(function (draft) {\n $scope.privacyDraftsHistory.push({ id: draft.id, name: _t('app.admin.settings.privacy.draft_from_USER_DATE', { USER: draft.user.name, DATE: moment(draft.created_at).format('L LT') }), content: draft.value });\n });\n\n // refresh codemirror to display the fetched setting\n $scope.$watch('advancedSettings.open', function (newValue) {\n if (newValue) $scope.codeMirrorEditor.refresh();\n })\n\n // use the tours list, based on the selected value\n $scope.$watch('allSettings.feature_tour_display', function (newValue, oldValue, scope) {\n if (newValue === oldValue) return;\n\n if (newValue === 'session') {\n $scope.currentUser.profile.tours = Fablab.sessionTours;\n } else if (newValue === 'once') {\n Member.get({ id: $scope.currentUser.id }, function (user) {\n $scope.currentUser.profile.tours = user.profile.tours;\n });\n }\n });\n };\n\n // init the controller (call at the end !)\n return initialize();\n }\n\n]);\n\n\n/**\n * Controller used in the invoice refunding modal window\n */\nApplication.Controllers.controller('SavePolicyController', ['$scope', '$uibModalInstance', '_t', 'growl', 'saveCb', 'privacyPolicy',\n function ($scope, $uibModalInstance, _t, growl, saveCb, privacyPolicy) {\n /* PUBLIC SCOPE */\n\n /**\n * Save as draft the current text\n */\n $scope.save = function () {\n saveCb({ name: 'privacy_draft', value: privacyPolicy.bodyTemp });\n $uibModalInstance.close('privacy_draft');\n };\n\n /**\n * Publish the current text as the new privacy policy\n */\n $scope.publish = function () {\n saveCb({ name: 'privacy_body', value: privacyPolicy.bodyTemp });\n growl.info(_t('app.admin.settings.privacy.users_notified'));\n $uibModalInstance.close('privacy_body');\n };\n /**\n * Cancel the saving, dismiss the modal window\n */\n $scope.cancel = function () {\n $uibModalInstance.dismiss('cancel');\n };\n }\n]);\n\n/**\n * Controller used in the \"what do we collect?\" modal, about FabAnalytics\n */\nApplication.Controllers.controller('AnalyticsModalController', ['$scope', '$uibModalInstance', 'analyticsData',\n function ($scope,$uibModalInstance, analyticsData) {\n // analytics data sample\n $scope.data = analyticsData;\n\n // callback to close the modal\n $scope.close = function () {\n $uibModalInstance.dismiss();\n }\n }\n])\n","/* eslint-disable\n no-constant-condition,\n no-return-assign,\n no-undef,\n standard/no-callback-literal,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\nApplication.Controllers.controller('StatisticsController', ['$scope', '$state', '$rootScope', '$uibModal', 'es', 'Member', '_t', 'membersPromise', 'statisticsPromise', 'uiTourService', 'settingsPromise',\n function ($scope, $state, $rootScope, $uibModal, es, Member, _t, membersPromise, statisticsPromise, uiTourService, settingsPromise) {\n /* PRIVATE STATIC CONSTANTS */\n\n // search window size\n const RESULTS_PER_PAGE = 20;\n\n // keep search context for (delay in minutes) ...\n const ES_SCROLL_TIME = 1;\n\n /* PUBLIC SCOPE */\n\n // ui-view transitions optimization: if true, the stats will never be refreshed\n $scope.preventRefresh = false;\n\n // statistics structure in elasticSearch\n $scope.statistics = statisticsPromise;\n\n // fablab users list\n $scope.members = membersPromise;\n\n // statistics data recovered from elasticSearch\n $scope.data = null;\n\n // when did the search was triggered\n $scope.searchDate = null;\n\n // id of the elastic search context\n $scope.scrollId = null;\n\n // total number of results for the current query\n $scope.totalHits = null;\n\n // configuration of the widget allowing to pick the ages range\n $scope.agePicker = {\n show: false,\n start: null,\n end: null\n };\n\n // total CA for the current view\n $scope.sumCA = 0;\n\n // average users' age for the current view\n $scope.averageAge = 0;\n\n // total of the stat field for non simple types\n $scope.sumStat = 0;\n\n // Results of custom aggregations for the current type\n $scope.customAggs = {};\n\n // default: results are not sorted\n $scope.sorting = {\n ca: 'none',\n date: 'desc'\n };\n\n // active tab will be set here\n $scope.selectedIndex = null;\n\n // ui-bootstrap active tab index\n $scope.selectedTab = 0;\n\n // type filter binding\n $scope.type = {\n selected: null,\n active: null\n };\n\n // selected custom filter\n $scope.customFilter = {\n show: false,\n criterion: {},\n value: null,\n exclude: false,\n datePicker: {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n minDate: null,\n maxDate: moment().toDate(),\n options: {\n startingDay: Fablab.weekStartingDay\n }\n }\n };\n\n // available custom filters\n $scope.filters = [];\n\n // default: we do not open the datepicker menu\n $scope.datePicker =\n { show: false };\n\n // datePicker parameters for interval beginning\n $scope.datePickerStart = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n minDate: null,\n maxDate: moment().subtract(1, 'day').toDate(),\n selected: moment().utc().subtract(1, 'months').subtract(1, 'day').startOf('day').toDate(),\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n // datePicker parameters for interval ending\n $scope.datePickerEnd = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n minDate: null,\n maxDate: moment().subtract(1, 'day').toDate(),\n selected: moment().subtract(1, 'day').endOf('day').toDate(),\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * Return a localized name for the given field\n */\n $scope.customFieldName = function (field) {\n return _t(`app.admin.statistics.${field}`);\n };\n\n /**\n * Callback to open the datepicker (interval start)\n * @param $event {Object} jQuery event object\n */\n $scope.toggleStartDatePicker = function ($event) { toggleDatePicker($event, $scope.datePickerStart); };\n\n /**\n * Callback to open the datepicker (interval end)\n * @param $event {Object} jQuery event object\n */\n $scope.toggleEndDatePicker = function ($event) { toggleDatePicker($event, $scope.datePickerEnd); };\n\n /**\n * Callback to open the datepicker (custom filter)\n * @param $event {Object} jQuery event object\n */\n $scope.toggleCustomDatePicker = function ($event) { toggleDatePicker($event, $scope.customFilter.datePicker); };\n\n /**\n * Callback called when the active tab is changed.\n * recover the current tab and store its value in $scope.selectedIndex\n * @param tab {Object} elasticsearch statistic structure (from statistic_indices table)\n * @param index {number} index of the tab in the $scope.statistics array\n */\n $scope.setActiveTab = function (tab, index) {\n $scope.selectedIndex = tab;\n $scope.selectedTab = index;\n $scope.type.selected = tab.types[0];\n $scope.type.active = $scope.type.selected;\n $scope.customFilter.criterion = {};\n $scope.customFilter.value = null;\n $scope.customFilter.exclude = false;\n $scope.sorting.ca = 'none';\n $scope.sorting.date = 'desc';\n buildCustomFiltersList();\n return refreshStats();\n };\n\n /**\n * Returns true if the provided tab must be hidden due to some global or local configuration\n * @param tab {Object} elasticsearch statistic structure (from statistic_indices table)\n */\n $scope.hiddenTab = function (tab) {\n if (tab.table) {\n return ((tab.es_type_key === 'subscription' && !$rootScope.modules.plans) ||\n (tab.es_type_key === 'training' && !$rootScope.modules.trainings) ||\n (tab.es_type_key === 'space' && !$rootScope.modules.spaces)\n );\n } else {\n return true;\n }\n };\n\n /**\n * Callback to validate the filters and send a new request to elastic\n */\n $scope.validateFilterChange = function () {\n $scope.agePicker.show = false;\n $scope.customFilter.show = false;\n $scope.type.active = $scope.type.selected;\n buildCustomFiltersList();\n return refreshStats();\n };\n\n /**\n * Callback to validate the dates range and refresh the data from elastic\n */\n $scope.validateDateChange = function () {\n $scope.datePicker.show = false;\n return refreshStats();\n };\n\n /**\n * Parse the given date and return a user-friendly string\n * @param date {Date} JS date or ant moment.js compatible date string\n */\n $scope.formatDate = function (date) { return moment(date).format('LL'); };\n\n /**\n * Parse the sex and return a user-friendly string\n * @param sex {string} 'male' | 'female'\n */\n $scope.formatSex = function (sex) {\n if (sex === 'male') {\n return _t('app.admin.statistics.man');\n }\n if (sex === 'female') {\n return _t('app.admin.statistics.woman');\n }\n };\n\n /**\n * Retrieve the label for the given subtype in the current type\n * @param key {string} statistic subtype key\n */\n $scope.formatSubtype = function (key) {\n let label = '';\n angular.forEach($scope.type.active.subtypes, function (subtype) {\n if (subtype.key === key) {\n return label = subtype.label;\n }\n });\n return label;\n };\n\n /**\n * Helper usable in ng-switch to determine the input type to display for custom filter value\n * @param filter {Object} custom filter criterion\n */\n $scope.getCustomValueInputType = function (filter) {\n if (filter && filter.values) {\n if (typeof (filter.values[0]) === 'string') {\n return filter.values[0];\n } else if (typeof (filter.values[0] === 'object')) {\n return 'input_select';\n }\n } else {\n return 'input_text';\n }\n };\n\n /**\n * Change the sorting order and refresh the results to match the new order\n * @param filter {Object} any filter\n */\n $scope.toggleSorting = function (filter) {\n switch ($scope.sorting[filter]) {\n case 'none': $scope.sorting[filter] = 'asc'; break;\n case 'asc': $scope.sorting[filter] = 'desc'; break;\n case 'desc': $scope.sorting[filter] = 'none'; break;\n }\n return refreshStats();\n };\n\n /**\n * Return the user's name from his given ID\n * @param id {number} user ID\n */\n $scope.getUserNameFromId = function (id) {\n const name = $scope.members[id];\n return (name || `ID ${id}`);\n };\n\n /**\n * Run a scroll query to elasticsearch to append the next packet of results to those displayed.\n * If the ES search context has expired when the user ask for more results, we re-run the whole query.\n */\n $scope.showMoreResults = function () {\n // if all results were retrieved, do nothing\n if ($scope.data.length >= $scope.totalHits) {\n return;\n }\n\n if (moment($scope.searchDate).add(ES_SCROLL_TIME, 'minutes').isBefore(moment())) {\n // elastic search context has expired, so we run again the whole query\n return refreshStats();\n } else {\n return es.scroll({\n scroll: ES_SCROLL_TIME + 'm',\n body: { scrollId: $scope.scrollId }\n }\n , function (error, response) {\n if (error) {\n return console.error(`Error: something unexpected occurred during elasticSearch scroll query: ${error}`);\n } else {\n $scope.scrollId = response._scroll_id;\n return $scope.data = $scope.data.concat(response.hits.hits);\n }\n });\n }\n };\n\n /**\n * Open a modal dialog asking the user for details about exporting the statistics tables to an excel file\n */\n $scope.exportToExcel = function () {\n const options = {\n templateUrl: '/admin/statistics/export.html',\n size: 'sm',\n controller: 'ExportStatisticsController',\n resolve: {\n dates () {\n return {\n start: $scope.datePickerStart.selected,\n end: $scope.datePickerEnd.selected\n };\n },\n query () {\n const custom = buildCustomFilterQuery();\n return buildElasticDataQuery($scope.type.active.key, custom, $scope.agePicker.start, $scope.agePicker.end, moment($scope.datePickerStart.selected), moment($scope.datePickerEnd.selected), $scope.sorting);\n },\n index () {\n return { key: $scope.selectedIndex.es_type_key };\n },\n type () {\n return { key: $scope.type.active.key };\n }\n }\n };\n\n return $uibModal.open(options)\n .result.finally(null).then(function (info) { console.log(info); });\n };\n\n /**\n * Setup the feature-tour for the admin/statistics page.\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupStatisticsTour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('statistics');\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.admin.tour.statistics.welcome.title'),\n content: _t('app.admin.tour.statistics.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n uitour.createStep({\n selector: '.heading .export-button',\n stepId: 'export',\n order: 1,\n title: _t('app.admin.tour.statistics.export.title'),\n content: _t('app.admin.tour.statistics.export.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.heading .charts-button',\n stepId: 'trending',\n order: 2,\n title: _t('app.admin.tour.statistics.trending.title'),\n content: _t('app.admin.tour.statistics.trending.content'),\n placement: 'left'\n });\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 3,\n title: _t('app.admin.tour.conclusion.title'),\n content: _t('app.admin.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('statistics') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'statistics' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('statistics') < 0) {\n uitour.start();\n }\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n // workaround for angular-bootstrap::tabs behavior: on tab deletion, another tab will be selected\n // which will cause every tabs to reload, one by one, when the view is closed\n $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\n if ((fromState.name === 'app.admin.statistics') && (Object.keys(fromParams).length === 0)) {\n return $scope.preventRefresh = true;\n }\n });\n\n // set the default tab to \"machines\" if \"subscriptions\" are disabled\n if (!$rootScope.modules.plans) {\n const idx = $scope.statistics.findIndex(s => s.es_type_key === 'machine');\n $scope.setActiveTab($scope.statistics[idx], idx);\n } else {\n const idx = $scope.statistics.findIndex(s => s.es_type_key === 'subscription');\n $scope.setActiveTab($scope.statistics[idx], idx);\n }\n };\n\n /**\n * Generic function to toggle a bootstrap datePicker\n * @param $event {Object} jQuery event object\n * @param datePicker {Object} settings object of the concerned datepicker. Must have an 'opened' property\n */\n const toggleDatePicker = function ($event, datePicker) {\n $event.preventDefault();\n $event.stopPropagation();\n return datePicker.opened = !datePicker.opened;\n };\n\n /**\n * Force update the statistics table, querying elasticSearch according to the current config values\n */\n const refreshStats = function () {\n if ($scope.selectedIndex && !$scope.preventRefresh && $scope.type.active) {\n $scope.data = [];\n $scope.sumCA = 0;\n $scope.averageAge = 0;\n $scope.sumStat = 0;\n $scope.customAggs = {};\n $scope.totalHits = null;\n $scope.searchDate = new Date();\n let custom = buildCustomFilterQuery();\n return queryElasticStats($scope.selectedIndex.es_type_key, $scope.type.active.key, custom, function (res, err) {\n if (err) {\n return console.error(`[statisticsController::refreshStats] Unable to refresh due to ${err}`);\n } else {\n $scope.data = res.hits.hits;\n $scope.totalHits = res.hits.total;\n $scope.sumCA = res.aggregations.total_ca.value;\n $scope.averageAge = Math.round(res.aggregations.average_age.value * 100) / 100;\n $scope.sumStat = res.aggregations.total_stat.value;\n $scope.scrollId = res._scroll_id;\n return (function () {\n const result = [];\n for (custom of Array.from($scope.type.active.custom_aggregations)) {\n result.push($scope.customAggs[custom.field] = res.aggregations[custom.field].value);\n }\n return result;\n })();\n }\n });\n }\n };\n\n /**\n * Run the elasticSearch query to retrieve the /stats/type aggregations\n * @param index {String} elasticSearch document type (account|event|machine|project|subscription|training)\n * @param type {String} statistics type (month|year|booking|hour|user|project)\n * @param custom {{key:{string}, value:{string}}|null} custom filter property or null to disable this filter\n * @param callback {function} function be to run after results were retrieved, it will receive\n * two parameters : results {Object}, error {String} (if any)\n */\n const queryElasticStats = function (index, type, custom, callback) {\n // handle invalid callback\n if (typeof (callback) !== 'function') {\n console.error('[statisticsController::queryElasticStats] Error: invalid callback provided');\n return;\n }\n\n // run query\n return es.search({\n index: 'stats',\n type: index,\n size: RESULTS_PER_PAGE,\n scroll: ES_SCROLL_TIME + 'm',\n 'stat-type': type,\n 'custom-query': custom ? JSON.stringify(Object.assign({ exclude: custom.exclude }, buildElasticCustomCriterion(custom))) : '',\n 'start-date': moment($scope.datePickerStart.selected).format(),\n 'end-date': moment($scope.datePickerEnd.selected).format(),\n body: buildElasticDataQuery(type, custom, $scope.agePicker.start, $scope.agePicker.end, moment($scope.datePickerStart.selected), moment($scope.datePickerEnd.selected), $scope.sorting)\n }\n , function (error, response) {\n if (error) {\n return callback({}, `Error: something unexpected occurred during elasticSearch query: ${error}`);\n } else {\n return callback(response);\n }\n });\n };\n\n /**\n * Build an object representing the content of the REST-JSON query to elasticSearch,\n * based on the provided parameters for row data recovering.\n * @param type {String} statistics type (month|year|booking|hour|user|project)\n * @param custom {{key:{string}, value:{string}}|null} custom filter property or null to disable this filter\n * @param ageMin {Number|null} filter by age: range lower value OR null to do not filter\n * @param ageMax {Number|null} filter by age: range higher value OR null to do not filter\n * @param intervalBegin {moment} statitics interval beginning (moment.js type)\n * @param intervalEnd {moment} statitics interval ending (moment.js type)\n * @param sortings {Array|null} elasticSearch criteria for sorting the results\n */\n const buildElasticDataQuery = function (type, custom, ageMin, ageMax, intervalBegin, intervalEnd, sortings) {\n const q = {\n query: {\n bool: {\n must: [\n {\n term: {\n type: type\n }\n },\n {\n range: {\n date: {\n gte: intervalBegin.format(),\n lte: intervalEnd.format()\n }\n }\n }\n ]\n }\n }\n };\n // optional date range\n if ((typeof ageMin === 'number') && (typeof ageMax === 'number')) {\n q.query.bool.must.push({\n range: {\n age: {\n gte: ageMin,\n lte: ageMax\n }\n }\n });\n }\n // optional criterion\n if (custom) {\n const criterion = buildElasticCustomCriterion(custom);\n if (custom.exclude) {\n q.query.bool.must_not = [\n { term: criterion.match }\n ];\n } else {\n q.query.bool.must.push(criterion);\n }\n }\n\n if (sortings) {\n q.sort = buildElasticSortCriteria(sortings);\n }\n\n // aggregations (avg age & CA sum)\n q.aggs = {\n total_ca: {\n sum: {\n field: 'ca'\n }\n },\n average_age: {\n avg: {\n field: 'age'\n }\n },\n total_stat: {\n sum: {\n field: 'stat'\n }\n }\n };\n return q;\n };\n\n /**\n * Build the elasticSearch query DSL to match the selected cutom filter\n * @param custom {Object} if custom is empty or undefined, an empty string will be returned\n * @returns {{match:*}|string}\n */\n const buildElasticCustomCriterion = function (custom) {\n if (custom) {\n const criterion = {\n match: {}\n };\n switch ($scope.getCustomValueInputType($scope.customFilter.criterion)) {\n case 'input_date': criterion.match[custom.key] = moment(custom.value).format('YYYY-MM-DD'); break;\n case 'input_select': criterion.match[custom.key] = custom.value.key; break;\n case 'input_list': criterion.match[custom.key + '.name'] = custom.value; break;\n default: criterion.match[custom.key] = custom.value;\n }\n return criterion;\n } else {\n return '';\n }\n };\n\n /**\n * Parse the provided criteria array and return the corresponding elasticSearch syntax\n * @param criteria {Array} array of {key_to_sort:order}\n */\n const buildElasticSortCriteria = function (criteria) {\n const crits = [];\n angular.forEach(criteria, function (value, key) {\n if ((typeof value !== 'undefined') && (value !== null) && (value !== 'none')) {\n const c = {};\n c[key] = { order: value };\n return crits.push(c);\n }\n });\n return crits;\n };\n\n /**\n * Fulfill the list of available options in the custom filter panel. The list will be based on common\n * properties and on index-specific properties (additional_fields)\n */\n const buildCustomFiltersList = function () {\n $scope.filters = [\n { key: 'date', label: _t('app.admin.statistics.date'), values: ['input_date'] },\n { key: 'userId', label: _t('app.admin.statistics.user_id'), values: ['input_number'] },\n { key: 'gender', label: _t('app.admin.statistics.gender'), values: [{ key: 'male', label: _t('app.admin.statistics.man') }, { key: 'female', label: _t('app.admin.statistics.woman') }] },\n { key: 'age', label: _t('app.admin.statistics.age'), values: ['input_number'] },\n { key: 'ca', label: _t('app.admin.statistics.revenue'), values: ['input_number'] }\n ];\n\n // if no plans were created, there's no types for statisticIndex=subscriptions\n if ($scope.type.active) {\n $scope.filters.splice(4, 0, { key: 'subType', label: _t('app.admin.statistics.type'), values: $scope.type.active.subtypes });\n\n if (!$scope.type.active.simple) {\n const f = { key: 'stat', label: $scope.type.active.label, values: ['input_number'] };\n $scope.filters.push(f);\n }\n }\n\n return angular.forEach($scope.selectedIndex.additional_fields, function (field) {\n const filter = { key: field.key, label: field.label, values: [] };\n switch (field.data_type) {\n case 'index': filter.values.push('input_number'); break;\n case 'number': filter.values.push('input_number'); break;\n case 'date': filter.values.push('input_date'); break;\n case 'list': filter.values.push('input_list'); break;\n default: filter.values.push('input_text');\n }\n\n return $scope.filters.push(filter);\n });\n };\n\n /**\n * Build and return an object according to the custom filter set by the user, used to request elasticsearch\n * @return {Object|null}\n */\n const buildCustomFilterQuery = function () {\n let custom = null;\n if (!angular.isUndefinedOrNull($scope.customFilter.criterion) &&\n !angular.isUndefinedOrNull($scope.customFilter.criterion.key) &&\n !angular.isUndefinedOrNull($scope.customFilter.value)) {\n custom = {};\n custom.key = $scope.customFilter.criterion.key;\n custom.value = $scope.customFilter.value;\n custom.exclude = $scope.customFilter.exclude;\n }\n return custom;\n };\n\n // init the controller (call at the end !)\n return initialize();\n }\n\n]);\n\nApplication.Controllers.controller('ExportStatisticsController', ['$scope', '$uibModalInstance', 'Export', 'dates', 'query', 'index', 'type', 'CSRF', 'growl', '_t',\n function ($scope, $uibModalInstance, Export, dates, query, index, type, CSRF, growl, _t) {\n // Retrieve Anti-CSRF tokens from cookies\n CSRF.setMetaTags();\n\n // Bindings for date range\n $scope.dates = dates;\n\n // Body of the query to export\n $scope.query = JSON.stringify(query);\n\n // API URL where the form will be posted\n $scope.actionUrl = `/stats/${index.key}/export`;\n\n // Key of the current search' statistic type\n $scope.typeKey = type.key;\n\n // Form action on the above URL\n $scope.method = 'post';\n\n // Anti-CSRF token to inject into the download form\n $scope.csrfToken = angular.element('meta[name=\"csrf-token\"]')[0].content;\n\n // Binding of the export type (global / current)\n $scope.export =\n { type: 'current' };\n\n // datePicker parameters for interval beginning\n $scope.exportStart = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n minDate: null,\n maxDate: moment().subtract(1, 'day').toDate(),\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n // datePicker parameters for interval ending\n $scope.exportEnd = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n minDate: null,\n maxDate: moment().subtract(1, 'day').toDate(),\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * Callback to open the datepicker (interval start)\n * @param $event {Object} jQuery event object\n */\n $scope.toggleStartDatePicker = function ($event) { $scope.exportStart.opened = !$scope.exportStart.opened; };\n\n /**\n * Callback to open the datepicker (interval end)\n * @param $event {Object} jQuery event object\n */\n $scope.toggleEndDatePicker = function ($event) { $scope.exportEnd.opened = !$scope.exportEnd.opened; };\n\n /**\n * Callback when exchanging the export type between 'global' and 'current view'\n * Adjust the query and the requesting url according to this type.\n */\n $scope.setRequest = function () {\n if ($scope.export.type === 'global') {\n $scope.actionUrl = '/stats/global/export';\n return $scope.query = JSON.stringify({\n query: {\n bool: {\n must: [\n {\n range: {\n date: {\n gte: moment($scope.dates.start).format(),\n lte: moment($scope.dates.end).format()\n }\n }\n }\n ]\n }\n }\n });\n } else {\n $scope.actionUrl = `/stats/${index.key}/export`;\n $scope.query = JSON.stringify(query);\n }\n };\n\n /**\n * Callback to close the modal, telling the caller what is exported\n */\n $scope.exportData = function () {\n const statusQry = { category: 'statistics', type: $scope.export.type, query: $scope.query };\n if ($scope.export.type !== 'global') {\n statusQry.type = index.key;\n statusQry.key = type.key;\n }\n\n Export.status(statusQry).then(function (res) {\n if (!res.data.exists) {\n return growl.success(_t('app.admin.statistics.export_is_running_you_ll_be_notified_when_its_ready'));\n }\n });\n\n return $uibModalInstance.close(statusQry);\n };\n\n /**\n * Callback to cancel the export and close the modal\n */\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }\n]);\n","/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nApplication.Controllers.controller('TagsController', ['$scope', 'tagsPromise', 'Tag', 'dialogs', 'growl', '_t', function ($scope, tagsPromise, Tag, dialogs, growl, _t) {\n // List of users's tags\n $scope.tags = tagsPromise;\n\n /**\n * Removes the newly inserted but not saved tag / Cancel the current tag modification\n * @param rowform {Object} see http://vitalets.github.io/angular-xeditable/\n * @param index {number} tag index in the $scope.tags array\n */\n $scope.cancelTag = function (rowform, index) {\n if ($scope.tags[index].id != null) {\n return rowform.$cancel();\n } else {\n return $scope.tags.splice(index, 1);\n }\n };\n\n /**\n * Creates a new empty entry in the $scope.tags array\n */\n $scope.addTag = function () {\n $scope.inserted =\n { name: '' };\n return $scope.tags.push($scope.inserted);\n };\n\n /**\n * Saves a new tag / Update an existing tag to the server (form validation callback)\n * @param data {Object} tag name\n * @param [data] {number} tag id, in case of update\n */\n $scope.saveTag = function (data, id) {\n if (id != null) {\n return Tag.update({ id }, { tag: data }, response => growl.success(_t('app.admin.members.tag_form.changes_successfully_saved'))\n , error => growl.error(_t('app.admin.members.tag_form.an_error_occurred_while_saving_changes')));\n } else {\n return Tag.save({ tag: data }, function (resp) {\n growl.success(_t('app.admin.members.tag_form.new_tag_successfully_saved'));\n return $scope.tags[$scope.tags.length - 1].id = resp.id;\n }\n , function (error) {\n growl.error(_t('app.admin.members.tag_form.an_error_occurred_while_saving_the_new_tag'));\n return $scope.tags.splice($scope.tags.length - 1, 1);\n });\n }\n };\n\n /**\n * Deletes the tag at the specified index\n * @param index {number} tag index in the $scope.tags array\n */\n $scope.removeTag = index =>\n dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.admin.members.tag_form.confirmation_required'),\n msg: _t('app.admin.members.tag_form.confirm_delete_tag_html')\n };\n }\n }\n }\n , () => {\n Tag.delete({ id: $scope.tags[index].id }, function (resp) {\n growl.success(_t('app.admin.members.tag_form.tag_successfully_deleted'));\n return $scope.tags.splice(index, 1);\n }\n , error => growl.error(_t('app.admin.members.tag_form.an_error_occurred_and_the_tag_deletion_failed')));\n });\n}\n\n]);\n","/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/* COMMON CODE */\n\n/**\n * Provides a set of common callback methods to the $scope parameter. These methods are used\n * in the various trainings' admin controllers.\n *\n * Provides :\n * - $scope.submited(content)\n * - $scope.fileinputClass(v)\n * - $scope.onDisableToggled\n *\n * Requires :\n * - $state (Ui-Router) [ 'app.admin.trainings' ]\n * - $scope.training\n */\nclass TrainingsController {\n constructor ($scope, $state) {\n /*\n * For use with ngUpload (https://github.com/twilson63/ngUpload).\n * Intended to be the callback when the upload is done: any raised error will be stacked in the\n * $scope.alerts array. If everything goes fine, the user is redirected to the trainings list.\n * @param content {Object} JSON - The upload's result\n */\n $scope.submited = function (content) {\n if ((content.id == null)) {\n $scope.alerts = [];\n return angular.forEach(content, function (v, k) {\n angular.forEach(v, function (err) {\n $scope.alerts.push({\n msg: k + ': ' + err,\n type: 'danger'\n });\n });\n });\n } else {\n return $state.go('app.admin.trainings');\n }\n };\n\n /**\n * Changes the current user's view, redirecting him to the machines list\n */\n $scope.cancel = function () { $state.go('app.admin.trainings'); };\n\n /**\n * Force the 'public_page' attribute to false when the current training is disabled\n */\n $scope.onDisableToggled = function () { $scope.training.public_page = !$scope.training.disabled; };\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n }\n}\n\n/**\n * Controller used in the training creation page (admin)\n */\nApplication.Controllers.controller('NewTrainingController', [ '$scope', '$state', 'machinesPromise', 'CSRF',\n function ($scope, $state, machinesPromise, CSRF) {\n /* PUBLIC SCOPE */\n\n // Form action on the following URL\n $scope.method = 'post';\n\n // API URL where the form will be posted\n $scope.actionUrl = '/api/trainings/';\n\n // list of machines\n $scope.machines = machinesPromise;\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n CSRF.setMetaTags();\n\n // Using the TrainingsController\n return new TrainingsController($scope, $state);\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the training edition page (admin)\n */\nApplication.Controllers.controller('EditTrainingController', [ '$scope', '$state', '$stateParams', 'trainingPromise', 'machinesPromise', 'CSRF',\n function ($scope, $state, $stateParams, trainingPromise, machinesPromise, CSRF) {\n /* PUBLIC SCOPE */\n\n // Form action on the following URL\n $scope.method = 'patch';\n\n // API URL where the form will be posted\n $scope.actionUrl = `/api/trainings/${$stateParams.id}`;\n\n // Details of the training to edit (id in URL)\n $scope.training = trainingPromise;\n\n // list of machines\n $scope.machines = machinesPromise;\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n CSRF.setMetaTags();\n\n // Using the TrainingsController\n return new TrainingsController($scope, $state);\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the trainings management page, allowing admins users to see and manage the list of trainings and reservations.\n */\nApplication.Controllers.controller('TrainingsAdminController', ['$scope', '$state', '$uibModal', 'Training', 'trainingsPromise', 'machinesPromise', '_t', 'growl', 'dialogs', 'Member', 'uiTourService', 'settingsPromise',\n function ($scope, $state, $uibModal, Training, trainingsPromise, machinesPromise, _t, growl, dialogs, Member, uiTourService, settingsPromise) {\n\n // list of trainings\n $scope.trainings = trainingsPromise;\n\n // simplified list of machines\n $scope.machines = machinesPromise;\n\n // Training to monitor, bound with drop-down selection\n $scope.monitoring = { training: null };\n\n // list of training availabilities, grouped by date\n $scope.groupedAvailabilities = {};\n\n // default: accordions are not open\n $scope.accordions = {};\n\n // Binding for the parseInt function\n $scope.parseInt = parseInt;\n\n // Default: we show only enabled trainings\n $scope.trainingFiltering = 'enabled';\n\n // Available options for filtering trainings by status\n $scope.filterDisabled = [\n 'enabled',\n 'disabled',\n 'all'\n ];\n\n // default tab: trainings list\n $scope.tabs = { active: 0 };\n\n /**\n * In the trainings listing tab, return the stringified list of machines associated with the provided training\n * @param training {Object} Training object, inherited from $resource\n * @returns {string}\n */\n $scope.showMachines = function (training) {\n const selected = [];\n angular.forEach($scope.machines, function (m) {\n if (training.machine_ids.indexOf(m.id) >= 0) {\n return selected.push(m.name);\n }\n });\n if (selected.length) { return selected.join(', '); } else { return _t('app.admin.trainings.none'); }\n };\n\n /**\n * Removes the newly inserted but not saved training / Cancel the current training modification\n * @param rowform {Object} see http://vitalets.github.io/angular-xeditable/\n * @param index {number} training index in the $scope.trainings array\n */\n $scope.cancelTraining = function (rowform, index) {\n if ($scope.trainings[index].id != null) {\n return rowform.$cancel();\n } else {\n return $scope.trainings.splice(index, 1);\n }\n };\n\n /**\n * In the trainings monitoring tab, callback to open a modal window displaying the current bookings for the\n * provided training slot. The admin will be then able to validate the training for the users that followed\n * the training.\n * @param training {Object} Training object, inherited from $resource\n * @param availability {Object} time slot when the training occurs\n */\n $scope.showReservations = function (training, availability) {\n $uibModal.open({\n templateUrl: '/admin/trainings/validTrainingModal.html',\n controller: ['$scope', '$uibModalInstance', function ($scope, $uibModalInstance) {\n $scope.availability = availability;\n\n $scope.usersToValid = [];\n\n /**\n * Mark/unmark the provided user for training validation\n * @param user {Object} from the availability.reservation_users list\n */\n $scope.toggleSelection = function (user) {\n const index = $scope.usersToValid.indexOf(user);\n if (index > -1) {\n return $scope.usersToValid.splice(index, 1);\n } else {\n return $scope.usersToValid.push(user);\n }\n };\n\n /**\n * Validates the modifications (training validations) and save them to the server\n */\n $scope.ok = function () {\n const users = $scope.usersToValid.map(function (u) { return u.id; });\n return Training.update({ id: training.id }, {\n training: {\n users\n }\n }\n , function () { // success\n angular.forEach($scope.usersToValid, function (u) { u.is_valid = true; });\n $scope.usersToValid = [];\n return $uibModalInstance.close(training);\n });\n };\n\n /**\n * Cancel the modifications and close the modal window\n */\n return $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }\n ] });\n };\n\n /**\n * Delete the provided training and, in case of success, remove it from the trainings list afterwards\n * @param index {number} index of the provided training in $scope.trainings\n * @param training {Object} training to delete\n */\n $scope.removeTraining = function (index, training) {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.admin.trainings.confirmation_required'),\n msg: _t('app.admin.trainings.do_you_really_want_to_delete_this_training')\n };\n }\n }\n },\n function () { // deletion confirmed\n training.$delete(function () {\n $scope.trainings.splice(index, 1);\n growl.info(_t('app.admin.trainings.training_successfully_deleted'));\n },\n function (error) {\n growl.warning(_t('app.admin.trainings.unable_to_delete_the_training_because_some_users_already_booked_it'));\n console.error(error);\n });\n }\n );\n };\n\n /**\n * Takes a month number and return its localized literal name\n * @param number {Number} from 0 to 11\n * @returns {String} eg. 'janvier'\n */\n $scope.formatMonth = function (number) {\n number = parseInt(number);\n return moment().month(number).format('MMMM');\n };\n\n /**\n * Given a day, month and year, return a localized literal name for the day\n * @param day {Number} from 1 to 31\n * @param month {Number} from 0 to 11\n * @param year {Number} Gregorian's year number\n * @returns {String} eg. 'mercredi 12'\n */\n $scope.formatDay = function (day, month, year) {\n day = parseInt(day);\n month = parseInt(month);\n year = parseInt(year);\n\n return moment({ year, month, day }).format('dddd D');\n };\n\n /**\n * Callback when the drop-down selection is changed.\n * The selected training details will be loaded from the API and rendered into the accordions.\n */\n $scope.selectTrainingToMonitor = function () {\n Training.availabilities({ id: $scope.monitoring.training.id }, function (training) {\n $scope.groupedAvailabilities = groupAvailabilities([training]);\n // we open current year/month by default\n const now = moment();\n $scope.accordions[training.name] = {};\n $scope.accordions[training.name][now.year()] = { isOpenFirst: true };\n $scope.accordions[training.name][now.year()][now.month()] = { isOpenFirst: true };\n });\n };\n\n /**\n * Setup the feature-tour for the admin/trainings page.\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupTrainingsTour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('trainings');\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.admin.tour.trainings.welcome.title'),\n content: _t('app.admin.tour.trainings.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n uitour.createStep({\n selector: '.trainings-monitoring .manage-trainings',\n stepId: 'trainings',\n order: 1,\n title: _t('app.admin.tour.trainings.trainings.title'),\n content: _t('app.admin.tour.trainings.trainings.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.trainings-monitoring .filter-trainings',\n stepId: 'filter',\n order: 2,\n title: _t('app.admin.tour.trainings.filter.title'),\n content: _t('app.admin.tour.trainings.filter.content'),\n placement: 'left'\n });\n uitour.createStep({\n selector: '.trainings-monitoring .post-tracking',\n stepId: 'tracking',\n order: 3,\n title: _t('app.admin.tour.trainings.tracking.title'),\n content: _t('app.admin.tour.trainings.tracking.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 4,\n title: _t('app.admin.tour.conclusion.title'),\n content: _t('app.admin.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on step change, change the active tab if needed\n uitour.on('stepChanged', function (nextStep) {\n if (nextStep.stepId === 'filter' || nextStep.stepId === 'machines') { $scope.tabs.active = 0; }\n if (nextStep.stepId === 'tracking') { $scope.tabs.active = 1; }\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('trainings') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'trainings' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('trainings') < 0) {\n uitour.start();\n }\n }\n\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {};\n\n\n /**\n * Group the trainings availabilities by trainings and by dates and return the resulting tree\n * @param trainings {Array} $scope.trainings is expected here\n * @returns {Object} Tree constructed as /training_name/year/month/day/[availabilities]\n */\n const groupAvailabilities = function (trainings) {\n const tree = {};\n for (let training of Array.from(trainings)) {\n tree[training.name] = {};\n tree[training.name].training = training;\n for (let availability of Array.from(training.availabilities)) {\n const start = moment(availability.start_at);\n\n // init the tree structure\n if (typeof tree[training.name][start.year()] === 'undefined') {\n tree[training.name][start.year()] = {};\n }\n if (typeof tree[training.name][start.year()][start.month()] === 'undefined') {\n tree[training.name][start.year()][start.month()] = {};\n }\n if (typeof tree[training.name][start.year()][start.month()][start.date()] === 'undefined') {\n tree[training.name][start.year()][start.month()][start.date()] = [];\n }\n\n // add the availability at its right place\n tree[training.name][start.year()][start.month()][start.date()].push(availability);\n }\n }\n return tree;\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n\n]);\n","const autoNgTemplateLoaderTemplate1 = require('/usr/src/app/app/frontend/templates/shared/signupModal.html');\nconst autoNgTemplateLoaderTemplate2 = require('/usr/src/app/app/frontend/templates/shared/passwordEditModal.html');\nconst autoNgTemplateLoaderTemplate3 = require('/usr/src/app/app/frontend/templates/admin/versions/upgradeModal.html');\nconst autoNgTemplateLoaderTemplate4 = require('/usr/src/app/app/frontend/templates/shared/deviseModal.html');\nconst autoNgTemplateLoaderTemplate5 = require('/usr/src/app/app/frontend/templates/shared/passwordNewModal.html');\nconst autoNgTemplateLoaderTemplate6 = require('/usr/src/app/app/frontend/templates/shared/ConfirmationNewModal.html');\n\n/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-undef,\n standard/no-callback-literal,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nApplication.Controllers.controller('ApplicationController', ['$rootScope', '$scope', '$window', '$locale', '$timeout', 'Session', 'AuthService', 'Auth', '$uibModal', '$state', 'growl', 'Notification', '$interval', 'Setting', '_t', 'Version', 'Help',\n function ($rootScope, $scope, $window, $locale, $timeout, Session, AuthService, Auth, $uibModal, $state, growl, Notification, $interval, Setting, _t, Version, Help) {\n /* PRIVATE STATIC CONSTANTS */\n\n // User's notifications will get refreshed every 30s\n const NOTIFICATIONS_CHECK_PERIOD = 30000;\n\n /* PUBLIC SCOPE */\n\n // Fab-manager's version\n $scope.version =\n { current: '' };\n\n // currency symbol for the current locale (cf. angular-i18n)\n $rootScope.currencySymbol = $locale.NUMBER_FORMATS.CURRENCY_SYM;\n\n /**\n * Set the current user to the provided value and initialize the session\n * @param user {Object} Rails/Devise user\n */\n $scope.setCurrentUser = function (user) {\n if (!angular.isUndefinedOrNull(user)) {\n $rootScope.currentUser = user;\n Session.create(user);\n getNotifications();\n // Fab-manager's app-version\n if (user.role === 'admin') {\n // get the version\n $scope.version = Version.get({origin: window.location.origin});\n } else {\n $scope.version = { current: '' };\n }\n }\n };\n\n /**\n * Login callback\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n * @param callback {function}\n */\n $scope.login = function (e, callback) {\n if (e) { e.preventDefault(); }\n return openLoginModal(null, null, callback);\n };\n\n /**\n * Logout callback\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.logout = function (e) {\n e.preventDefault();\n return Auth.logout().then(function () {\n Session.destroy();\n $rootScope.currentUser = null;\n $rootScope.toCheckNotifications = false;\n $scope.notifications = {\n total: 0,\n unread: 0\n };\n return $state.go('app.public.home');\n }, function (error) {\n console.error(`An error occurred logging out: ${error}`);\n });\n };\n\n /**\n * Open the modal window allowing the user to create an account.\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.signup = function (e) {\n if (e) { e.preventDefault(); }\n \n \n\n return $uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate1,\n size: 'md',\n resolve: {\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['phone_required', 'recaptcha_site_key', 'confirmation_required', 'address_required']\" }).$promise; }]\n },\n controller: ['$scope', '$uibModalInstance', 'Group', 'CustomAsset', 'settingsPromise', 'growl', '_t', function ($scope, $uibModalInstance, Group, CustomAsset, settingsPromise, growl, _t) {\n // default parameters for the date picker in the account creation modal\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: false,\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n // is the phone number required to sign-up?\n $scope.phoneRequired = (settingsPromise.phone_required === 'true');\n\n // is the address required to sign-up?\n $scope.addressRequired = (settingsPromise.address_required === 'true');\n\n // reCaptcha v2 site key (or undefined)\n $scope.recaptchaSiteKey = settingsPromise.recaptcha_site_key;\n\n // callback to open the date picker (account creation modal)\n $scope.openDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n return $scope.datePicker.opened = true;\n };\n\n // retrieve the groups (standard, student ...)\n Group.query(function (groups) {\n $scope.groups = groups;\n $scope.enabledGroups = groups.filter(function (g) { return (g.slug !== 'admins') && !g.disabled; });\n });\n\n // retrieve the CGU\n CustomAsset.get({ name: 'cgu-file' }, function (cgu) {\n $scope.cgu = cgu.custom_asset;\n });\n\n // default user's parameters\n $scope.user = {\n is_allow_contact: true,\n is_allow_newsletter: false,\n // reCaptcha response, received from Google (through AJAX) and sent to server for validation\n recaptcha: undefined\n };\n\n // Errors display\n $scope.alerts = [];\n $scope.closeAlert = function (index) {\n $scope.alerts.splice(index, 1);\n };\n\n // callback for form validation\n $scope.ok = function () {\n // try to create the account\n $scope.alerts = [];\n // remove 'organization' attribute\n const orga = $scope.user.organization;\n delete $scope.user.organization;\n // register on server\n return Auth.register($scope.user).then(function (user) {\n if (user.id) {\n // creation successful\n $uibModalInstance.close({ user, settings: settingsPromise });\n } else {\n // the user was not saved in database, something wrong occurred\n growl.error(_t('app.public.common.unexpected_error_occurred'));\n }\n }, function (error) {\n // creation failed...\n // restore organization param\n $scope.user.organization = orga;\n // display errors\n angular.forEach(error.data.errors, function (v, k) {\n angular.forEach(v, function (err) {\n $scope.alerts.push({\n msg: k + ': ' + err,\n type: 'danger'\n });\n });\n });\n });\n };\n }]\n }).result['finally'](null).then(function (res) {\n // when the account was created successfully, set the session to the newly created account\n if(res.settings.confirmation_required) {\n Auth._currentUser = null;\n growl.info(_t('app.public.common.you_will_receive_confirmation_instructions_by_email_detailed'));\n } else {\n $scope.setCurrentUser(res.user);\n }\n });\n \n };\n\n /**\n * Open the modal window allowing the user to change his password.\n * @param token {string} security token for password changing. The user should have recieved it by mail\n */\n $scope.editPassword = function (token) {\n $uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate2,\n size: 'md',\n controller: ['$scope', '$uibModalInstance', '$http', function ($scope, $uibModalInstance, $http) {\n $scope.user = { reset_password_token: token };\n $scope.alerts = [];\n $scope.closeAlert = function (index) {\n $scope.alerts.splice(index, 1);\n };\n\n return $scope.changePassword = function () {\n $scope.alerts = [];\n return $http.put('/users/password.json', { user: $scope.user }).then(function () { $uibModalInstance.close(); }).catch(function (data) {\n angular.forEach(data.data.errors, function (v, k) {\n angular.forEach(v, function (err) {\n $scope.alerts.push({\n msg: k + ': ' + err,\n type: 'danger'\n });\n });\n });\n });\n };\n }]\n }).result['finally'](null).then(function () {\n growl.success(_t('app.public.common.your_password_was_successfully_changed'));\n return Auth.login().then(function (user) {\n $scope.setCurrentUser(user);\n }, function (error) {\n console.error(`Authentication failed: ${JSON.stringify(error)}`);\n }\n );\n });\n };\n\n /**\n * Compact/Expend the width of the left navigation bar\n * @param event {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.toggleNavSize = function (event) {\n let $classes, $targets;\n if (typeof event === 'undefined') {\n console.error('[ApplicationController::toggleNavSize] Missing event parameter');\n return;\n }\n\n let toggler = $(event.target);\n if (!toggler.data('toggle')) { toggler = toggler.closest('[data-toggle^=\"class\"]'); }\n\n const $class = toggler.data()['toggle'];\n const $target = toggler.data('target') || toggler.attr('data-link');\n\n if ($class) {\n const $tmp = $class.split(':')[1];\n if ($tmp) { $classes = $tmp.split(','); }\n }\n\n if ($target) {\n $targets = $target.split(',');\n }\n\n if ($classes && $classes.length) {\n $.each($targets, function (index) {\n if ($classes[index].indexOf('*') !== -1) {\n const patt = new RegExp('\\\\s',\n +$classes[index].replace(/\\*/g, '[A-Za-z0-9-_]+').split(' ').join('\\\\s|\\\\s'),\n +'\\\\s', 'g');\n $(toggler).each(function (i, it) {\n let cn = ` ${it.className} `;\n while (patt.test(cn)) {\n cn = cn.replace(patt, ' ');\n }\n return it.className = $.trim(cn);\n });\n }\n\n return (($targets[index] !== '#') && $($targets[index]).toggleClass($classes[index])) || toggler.toggleClass($classes[index]);\n });\n }\n\n toggler.toggleClass('active');\n };\n\n /**\n * Open the modal dialog showing that an upgrade is available\n */\n $scope.versionModal = function() {\n if ($scope.version.up_to_date) return;\n if ($rootScope.currentUser.role !== 'admin') return;\n\n $uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate3,\n controller: 'VersionModalController',\n resolve: {\n version() { return $scope.version; }\n }\n });\n }\n\n /**\n * Trigger the contextual help \"feature tour\".\n * @param event {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.help = function (event) {\n event.preventDefault();\n\n // we wrap the event triggering into a $timeout to prevent conflicting with current $apply\n $timeout(function () {\n var evt = new KeyboardEvent('keydown', { key: 'F1' });\n window.dispatchEvent(evt);\n });\n }\n\n /* PRIVATE SCOPE */\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n // try to retrieve any currently logged user\n Auth.login().then(function (user) {\n $scope.setCurrentUser(user);\n // force users to complete their profile if they are not\n if (user.need_completion) {\n return $state.transitionTo('app.logged.profileCompletion');\n }\n }, function () {\n console.info('No users currently logged');\n $rootScope.toCheckNotifications = false;\n });\n\n // bind to the $stateChangeStart event (AngularJS/UI-Router)\n $rootScope.$on('$stateChangeStart', function (event, toState, toParams) {\n if (!toState.data) { return; }\n\n const { authorizedRoles } = toState.data;\n if (!AuthService.isAuthorized(authorizedRoles)) {\n event.preventDefault();\n if (AuthService.isAuthenticated()) {\n // user is not allowed\n console.error('[ApplicationController::initialize] user is not allowed');\n } else {\n // user is not logged in\n openLoginModal(toState, toParams);\n }\n }\n });\n\n // we stop polling notifications when the page is not in foreground\n onPageVisible(function (state) { $rootScope.toCheckNotifications = (state === 'visible'); });\n\n Setting.query({ names: \"['fablab_name', 'name_genre', 'link_name']\" }, function (settings) {\n $scope.fablabName = settings.fablab_name;\n $scope.nameGenre = settings.name_genre;\n $scope.linkName = settings.link_name;\n });\n\n // shorthands\n $scope.isAuthenticated = Auth.isAuthenticated;\n $scope.isAuthorized = AuthService.isAuthorized;\n $rootScope.login = $scope.login;\n\n // handle F1 key to trigger help\n window.addEventListener('keydown', Help);\n };\n\n /**\n * Retrieve once the notifications from the server and display a message popup for each new one.\n * Then, periodically check for new notifications.\n */\n const getNotifications = function () {\n $rootScope.toCheckNotifications = true;\n if (!$rootScope.checkNotificationsIsInit && !!$rootScope.currentUser) {\n setTimeout(function () {\n // we request the most recent notifications\n Notification.last_unread(function (notifications) {\n $rootScope.lastCheck = new Date();\n $scope.notifications = notifications.totals;\n\n const toDisplay = [];\n angular.forEach(notifications.notifications, function (n) { toDisplay.push(n); });\n\n if (toDisplay.length < notifications.totals.unread) {\n toDisplay.push({ message: { description: _t('app.public.common.and_NUMBER_other_notifications', { NUMBER: notifications.totals.unread - toDisplay.length }) } });\n }\n\n angular.forEach(toDisplay, function (notification) { growl.info(notification.message.description); });\n });\n }, 2000);\n\n const checkNotifications = function () {\n if ($rootScope.toCheckNotifications) {\n return Notification.polling({ last_poll: $rootScope.lastCheck }).$promise.then(function (data) {\n $rootScope.lastCheck = new Date();\n $scope.notifications = data.totals;\n\n angular.forEach(data.notifications, function (notification) { growl.info(notification.message.description); });\n }).catch(function (error) {\n console.error('Error while polling notifications', error);\n });\n }\n };\n\n $interval(checkNotifications, NOTIFICATIONS_CHECK_PERIOD);\n $rootScope.checkNotificationsIsInit = true;\n }\n };\n\n /**\n * Open the modal window allowing the user to log in.\n */\n const openLoginModal = function (toState, toParams, callback) {\n \n \n return $uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate4,\n backdrop: 'static',\n size: 'sm',\n resolve: {\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['confirmation_required']\" }).$promise; }]\n },\n controller: ['$scope', '$uibModalInstance', '_t', 'settingsPromise', function ($scope, $uibModalInstance, _t, settingsPromise) {\n const user = ($scope.user = {});\n\n // email confirmation required before user sign-in?\n $scope.confirmationRequired = settingsPromise.confirmation_required;\n\n $scope.login = function () {\n Auth.login(user).then(function (user) {\n // Authentication succeeded ...\n $uibModalInstance.close(user);\n if (callback && (typeof callback === 'function')) {\n return callback(user);\n }\n }\n , function (error) {\n console.error(`Authentication failed: ${JSON.stringify(error)}`);\n $scope.alerts = [];\n return $scope.alerts.push({\n msg: error.data.error,\n type: 'danger'\n });\n });\n };\n // handle modal behaviors. The provided reason will be used to define the following actions\n $scope.dismiss = function () { $uibModalInstance.dismiss('cancel'); };\n\n $scope.openSignup = function (e) {\n e.preventDefault();\n return $uibModalInstance.dismiss('signup');\n };\n\n $scope.openConfirmationNewModal = function(e) {\n e.preventDefault();\n return $uibModalInstance.dismiss('confirmationNew');\n };\n\n $scope.openResetPassword = function (e) {\n e.preventDefault();\n return $uibModalInstance.dismiss('resetPassword');\n };\n }]\n }).result['finally'](null).then(function (user) {\n // what to do when the modal is closed\n\n // authentication succeeded, set the session, gather the notifications and redirect\n $scope.setCurrentUser(user);\n\n if ((toState !== null) && (toParams !== null)) {\n return $state.go(toState, toParams);\n }\n }, function (reason) {\n // authentication did not end successfully\n if (reason === 'signup') {\n // open sign-up modal\n $scope.signup();\n } else if (reason === 'resetPassword') {\n // open the 'reset password' modal\n return $uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate5,\n size: 'sm',\n controller: ['$scope', '$uibModalInstance', '$http', function ($scope, $uibModalInstance, $http) {\n $scope.user = { email: '' };\n return $scope.sendReset = function () {\n $scope.alerts = [];\n return $http.post('/users/password.json', { user: $scope.user }).then(function () { $uibModalInstance.close(); }).catch(function () {\n $scope.alerts.push({\n msg: _t('app.public.common.your_email_address_is_unknown'),\n type: 'danger'\n });\n });\n };\n }]\n }).result['finally'](null).then(function () { growl.info(_t('app.public.common.you_will_receive_in_a_moment_an_email_with_instructions_to_reset_your_password')); });\n } else if (reason === 'confirmationNew') {\n // open the 'reset password' modal\n return $uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate6,\n size: 'sm',\n controller: ['$scope', '$uibModalInstance', '$http', function ($scope, $uibModalInstance, $http) {\n $scope.user = { email: '' };\n return $scope.submitConfirmationNewForm = function () {\n $scope.alerts = [];\n return $http.post('/users/confirmation.json', { user: $scope.user }).then(function () { $uibModalInstance.close(); }).catch(function (res) {\n $scope.alerts.push({\n msg: res.data.errors.email[0],\n type: 'danger'\n });\n });\n };\n }]\n }).result['finally'](null).then(function () { growl.info(_t('app.public.common.you_will_receive_confirmation_instructions_by_email_detailed')); });\n }\n });\n // otherwise the user just closed the modal\n \n };\n\n\n /**\n * Detect if the current page (tab/window) is active of put as background.\n * When the status changes, the callback is triggered with the new status as parameter\n * Inspired by http://stackoverflow.com/questions/1060008/is-there-a-way-to-detect-if-a-browser-window-is-not-currently-active#answer-1060034\n */\n const onPageVisible = function (callback) {\n let hidden = 'hidden';\n\n const onchange = function (evt) {\n const v = 'visible';\n const h = 'hidden';\n const evtMap = {\n focus: v,\n focusin: v,\n pageshow: v,\n blur: h,\n focusout: h,\n pagehide: h\n };\n evt = evt || window.event;\n if (evt.type in evtMap) {\n if (typeof callback === 'function') { callback(evtMap[evt.type]); }\n } else {\n if (typeof callback === 'function') { callback(this[hidden] ? 'hidden' : 'visible'); }\n }\n };\n\n // Standards:\n if (hidden in document) {\n document.addEventListener('visibilitychange', onchange);\n } else if ((hidden = 'mozHidden') in document) {\n document.addEventListener('mozvisibilitychange', onchange);\n } else if ((hidden = 'webkitHidden') in document) {\n document.addEventListener('webkitvisibilitychange', onchange);\n } else if ((hidden = 'msHidden') in document) {\n document.addEventListener('msvisibilitychange', onchange);\n // IE 9 and lower\n } else if ('onfocusin' in document) {\n document.onfocusin = (document.onfocusout = onchange);\n // All others\n } else {\n window.onpageshow = (window.onpagehide = (window.onfocus = (window.onblur = onchange)));\n }\n // set the initial state (but only if browser supports the Page Visibility API)\n if (document[hidden] !== undefined) {\n return onchange({ type: document[hidden] ? 'blur' : 'focus' });\n }\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the modal showing details about the version and the upgrades\n */\nApplication.Controllers.controller('VersionModalController', ['$scope', '$uibModalInstance', 'version', function ($scope, $uibModalInstance, version) {\n // version infos (current version + upgrade infos from hub)\n $scope.version = version;\n\n // callback to close the modal\n $scope.close = function () {\n $uibModalInstance.dismiss();\n }\n}]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/**\n * Controller used in the public calendar global\n */\n\nApplication.Controllers.controller('CalendarController', ['$scope', '$state', '$aside', 'moment', 'Availability', 'Slot', 'Setting', 'growl', 'dialogs', 'bookingWindowStart', 'bookingWindowEnd', '_t', 'uiCalendarConfig', 'CalendarConfig', 'trainingsPromise', 'machinesPromise', 'spacesPromise', 'iCalendarPromise',\n function ($scope, $state, $aside, moment, Availability, Slot, Setting, growl, dialogs, bookingWindowStart, bookingWindowEnd, _t, uiCalendarConfig, CalendarConfig, trainingsPromise, machinesPromise, spacesPromise, iCalendarPromise) {\n /* PRIVATE STATIC CONSTANTS */\n let currentMachineEvent = null;\n machinesPromise.forEach(m => m.checked = true);\n trainingsPromise.forEach(t => t.checked = true);\n spacesPromise.forEach(s => s.checked = true);\n\n // check all formation/machine is select in filter\n const isSelectAll = (type, scope) => scope[type].length === scope[type].filter(t => t.checked).length;\n\n /* PUBLIC SCOPE */\n\n // List of trainings\n $scope.trainings = trainingsPromise.filter(t => !t.disabled);\n\n // List of machines\n $scope.machines = machinesPromise.filter(t => !t.disabled);\n\n // List of spaces\n $scope.spaces = spacesPromise.filter(t => !t.disabled);\n\n // List of external iCalendar sources\n $scope.externals = iCalendarPromise.map(e => Object.assign(e, { checked: true }));\n\n // add availabilities source to event sources\n $scope.eventSources = [];\n\n // filter availabilities if have change\n $scope.filterAvailabilities = function (filter, scope) {\n if (!scope) { scope = $scope; }\n scope.filter = ($scope.filter = {\n trainings: isSelectAll('trainings', scope),\n machines: isSelectAll('machines', scope),\n spaces: isSelectAll('spaces', scope),\n externals: isSelectAll('externals', scope),\n evt: filter.evt,\n dispo: filter.dispo\n });\n // remove all\n $scope.eventSources.splice(0, $scope.eventSources.length);\n // recreate source for trainings/machines/events with new filters\n $scope.eventSources.push({\n url: availabilitySourceUrl()\n });\n // external iCalendar events sources\n $scope.externals.forEach(e => {\n if (e.checked) {\n if (!$scope.eventSources.some(evt => evt.id === e.id)) {\n $scope.eventSources.push({\n id: e.id,\n url: `/api/i_calendar/${e.id}/events`,\n textColor: e.text_color || '#000',\n color: e.color\n });\n }\n } else {\n if ($scope.eventSources.some(evt => evt.id === e.id)) {\n const idx = $scope.eventSources.findIndex(evt => evt.id === e.id);\n $scope.eventSources.splice(idx, 1);\n }\n }\n });\n uiCalendarConfig.calendars.calendar.fullCalendar('refetchEvents');\n };\n\n /**\n * Return a CSS-like style of the given calendar configuration\n * @param calendar\n */\n $scope.calendarStyle = function (calendar) {\n return {\n 'border-color': calendar.color,\n color: calendar.text_color\n };\n };\n\n // a variable for formation/machine/event/dispo checkbox is or not checked\n $scope.filter = {\n trainings: isSelectAll('trainings', $scope),\n machines: isSelectAll('machines', $scope),\n spaces: isSelectAll('spaces', $scope),\n externals: isSelectAll('externals', $scope),\n evt: true,\n dispo: true\n };\n\n // toggle to select all formation/machine\n $scope.toggleFilter = function (type, filter) {\n $scope[type].forEach(t => t.checked = filter[type]);\n $scope.filterAvailabilities(filter, $scope);\n };\n\n $scope.openFilterAside = () =>\n $aside.open({\n templateUrl: '/calendar/filterAside.html',\n placement: 'right',\n size: 'md',\n backdrop: false,\n resolve: {\n trainings () {\n return $scope.trainings;\n },\n machines () {\n return $scope.machines;\n },\n spaces () {\n return $scope.spaces;\n },\n externals () {\n return $scope.externals;\n },\n filter () {\n return $scope.filter;\n },\n toggleFilter () {\n return $scope.toggleFilter;\n },\n filterAvailabilities () {\n return $scope.filterAvailabilities;\n }\n },\n controller: ['$scope', '$uibModalInstance', 'trainings', 'machines', 'spaces', 'externals', 'filter', 'toggleFilter', 'filterAvailabilities', function ($scope, $uibModalInstance, trainings, machines, spaces, externals, filter, toggleFilter, filterAvailabilities) {\n $scope.trainings = trainings;\n $scope.machines = machines;\n $scope.spaces = spaces;\n $scope.externals = externals;\n $scope.filter = filter;\n\n $scope.toggleFilter = (type, filter) => toggleFilter(type, filter);\n\n $scope.filterAvailabilities = filter => filterAvailabilities(filter, $scope);\n\n return $scope.close = function (e) {\n $uibModalInstance.dismiss();\n return e.stopPropagation();\n };\n }]\n });\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = () => {\n // fullCalendar (v2) configuration\n $scope.calendarConfig = CalendarConfig({\n slotEventOverlap: true,\n header: {\n left: 'month agendaWeek agendaDay',\n center: 'title',\n right: 'today prev,next'\n },\n minTime: moment.duration(moment(bookingWindowStart.setting.value).format('HH:mm:ss')),\n maxTime: moment.duration(moment(bookingWindowEnd.setting.value).format('HH:mm:ss')),\n defaultView: window.innerWidth <= 480 ? 'agendaDay' : 'agendaWeek',\n eventClick (event, jsEvent, view) {\n return calendarEventClickCb(event, jsEvent, view);\n },\n viewRender (view, element) {\n return viewRenderCb(view, element);\n },\n eventRender (event, element) {\n return eventRenderCb(event, element);\n }\n });\n $scope.eventSources = [{\n url: availabilitySourceUrl()\n }];\n $scope.externals.forEach(e => {\n if (e.checked) {\n $scope.eventSources.push({\n id: e.id,\n url: `/api/i_calendar/${e.id}/events`,\n textColor: e.text_color || '#000',\n color: e.color\n });\n }\n });\n };\n\n /**\n * Callback triggered when an event object is clicked in the fullCalendar view\n */\n const calendarEventClickCb = function (event) {\n // current calendar object\n const { calendar } = uiCalendarConfig.calendars;\n if (event.available_type === 'machines') {\n currentMachineEvent = event;\n calendar.fullCalendar('changeView', 'agendaDay');\n calendar.fullCalendar('gotoDate', event.start);\n } else if (event.available_type === 'space') {\n calendar.fullCalendar('changeView', 'agendaDay');\n calendar.fullCalendar('gotoDate', event.start);\n } else if (event.available_type === 'event') {\n $state.go('app.public.events_show', { id: event.event_id });\n } else if (event.available_type === 'training') {\n $state.go('app.public.training_show', { id: event.training_id });\n } else {\n if (event.machine_id) {\n $state.go('app.public.machines_show', { id: event.machine_id });\n } else if (event.space_id) {\n $state.go('app.public.space_show', { id: event.space_id });\n }\n }\n };\n\n // agendaDay view: disable slotEventOverlap\n // agendaWeek view: enable slotEventOverlap\n const toggleSlotEventOverlap = function (view) {\n // set defaultView, because when we change slotEventOverlap\n // ui-calendar will trigger rerender calendar\n $scope.calendarConfig.defaultView = view.type;\n const today = currentMachineEvent ? currentMachineEvent.start : moment().utc().startOf('day');\n if ((today > view.intervalStart) && (today < view.intervalEnd) && (today !== view.intervalStart)) {\n $scope.calendarConfig.defaultDate = today;\n } else {\n $scope.calendarConfig.defaultDate = view.intervalStart;\n }\n if (view.type === 'agendaDay') {\n return $scope.calendarConfig.slotEventOverlap = false;\n } else {\n return $scope.calendarConfig.slotEventOverlap = true;\n }\n };\n\n /**\n * This function is called when calendar view is rendered or changed\n * @see https://fullcalendar.io/docs/v3/viewRender#v2\n */\n const viewRenderCb = function (view) {\n toggleSlotEventOverlap(view);\n if (view.type === 'agendaDay') {\n // get availabilties by 1 day for show machine slots\n return uiCalendarConfig.calendars.calendar.fullCalendar('refetchEvents');\n }\n };\n\n /**\n * Callback triggered by fullCalendar when it is about to render an event.\n * @see https://fullcalendar.io/docs/v3/eventRender#v2\n */\n const eventRenderCb = function (event, element) {\n if (event.tags && event.tags.length > 0) {\n let html = '';\n for (const tag of Array.from(event.tags)) {\n html += `${tag.name} `;\n }\n element.find('.fc-title').append(`
${html}`);\n }\n };\n\n const getFilter = function () {\n const t = $scope.trainings.filter(t => t.checked).map(t => t.id);\n const m = $scope.machines.filter(m => m.checked).map(m => m.id);\n const s = $scope.spaces.filter(s => s.checked).map(s => s.id);\n return { t, m, s, evt: $scope.filter.evt, dispo: $scope.filter.dispo };\n };\n\n const availabilitySourceUrl = () => `/api/availabilities/public?${$.param(getFilter())}`;\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n","'use strict';\n\n/**\n * Controller used for the cookies consent modal\n */\nApplication.Controllers.controller('CookiesController', ['$scope', '$cookies', 'Setting',\n function ($scope, $cookies, Setting) {\n /* PUBLIC SCOPE */\n\n // the acceptation state (undefined if no decision was made until now)\n $scope.cookiesState = undefined;\n\n // link pointed by \"learn more\"\n $scope.learnMoreUrl = 'https://www.cookiesandyou.com/';\n\n // current user wallet\n $scope.declineCookies = function () {\n const expires = moment().add(13, 'months').toDate();\n $cookies.put('fab-manager-cookies-consent', 'decline', { expires });\n readCookie();\n };\n\n // current wallet transactions\n $scope.acceptCookies = function () {\n const expires = moment().add(13, 'months').toDate();\n $cookies.put('fab-manager-cookies-consent', 'accept', { expires });\n readCookie();\n // enable tracking using code provided by google analytics\n /* eslint-disable */\n (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');\n\n ga('create', Fablab.trackingId, 'auto');\n ga('send', 'pageview');\n /* eslint-enable */\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n readCookie();\n // if the privacy policy was defined, redirect the user to it\n Setting.get({ name: 'privacy_body' }, data => {\n if (data.setting.value) {\n $scope.learnMoreUrl = '#!/privacy-policy';\n }\n });\n // if the tracking ID was not set in the settings, only functional cookies will be set, so user consent is not required\n if (!Fablab.trackingId) $scope.cookiesState = 'ignore';\n };\n\n const readCookie = function () {\n $scope.cookiesState = $cookies.get('fab-manager-cookies-consent');\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\nApplication.Controllers.controller('DashboardController', ['$scope', 'memberPromise', 'trainingsPromise', 'SocialNetworks', function ($scope, memberPromise, trainingsPromise, SocialNetworks) {\n // Current user's profile\n $scope.user = memberPromise;\n\n // List of social networks associated with this user and toggle 'show all' state\n $scope.social = {\n showAllLinks: false,\n networks: SocialNetworks\n };\n\n /**\n * Check if the member has used his training credits for the given credit\n * @param trainingCredits array of credits used by the member\n * @param trainingId id of the training to find\n */\n $scope.hasUsedTrainingCredit = function (trainingCredits, trainingId) {\n return trainingCredits.find(tc => tc.training_id === trainingId);\n };\n\n /**\n * Return the name associated with the provided training ID\n * @param trainingId training identifier\n * @return {string}\n */\n $scope.getTrainingName = function (trainingId) {\n return trainingsPromise.find(t => t.id === trainingId).name;\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = () => $scope.social.networks = filterNetworks();\n\n /**\n * Filter the social networks or websites that are associated with the profile of the user provided in promise\n * and return the filtered networks\n * @return {Array}\n */\n const filterNetworks = function () {\n const networks = [];\n for (const network of Array.from(SocialNetworks)) {\n if ($scope.user.profile[network] && ($scope.user.profile[network].length > 0)) {\n networks.push(network);\n }\n }\n return networks;\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n}\n\n]);\n","const autoNgTemplateLoaderTemplate1 = require('/usr/src/app/app/frontend/templates/events/deleteRecurrent.html');\nconst autoNgTemplateLoaderTemplate2 = require('/usr/src/app/app/frontend/templates/events/modify_event_reservation_modal.html');\nconst autoNgTemplateLoaderTemplate3 = require('/usr/src/app/app/frontend/templates/stripe/payment_modal.html');\nconst autoNgTemplateLoaderTemplate4 = require('/usr/src/app/app/frontend/templates/shared/valid_reservation_modal.html');\nconst autoNgTemplateLoaderTemplate5 = require('/usr/src/app/app/frontend/templates/shared/_reserve_slot_same_time.html');\n\n/* eslint-disable\n camelcase,\n handle-callback-err,\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nApplication.Controllers.controller('EventsController', ['$scope', '$state', 'Event', 'categoriesPromise', 'themesPromise', 'ageRangesPromise', 'settingsPromise',\n function ($scope, $state, Event, categoriesPromise, themesPromise, ageRangesPromise, settingsPromise) {\n /* PUBLIC SCOPE */\n\n // The events displayed on the page\n $scope.events = [];\n\n // The currently displayed page number\n $scope.page = 1;\n\n // List of categories for the events\n $scope.categories = categoriesPromise;\n\n // List of events themes\n $scope.themes = themesPromise;\n\n // List of age ranges\n $scope.ageRanges = ageRangesPromise;\n\n // Hide or show the 'load more' button\n $scope.noMoreResults = false;\n\n // Active filters for the events list\n $scope.filters = {\n category_id: null,\n theme_id: null,\n age_range_id: null\n };\n\n $scope.monthNames = [\"janvier\", \"février\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"août\", \"septembre\", \"octobre\", \"novembre\", \"décembre\"];\n\n /**\n * Adds a resultset of events to the bottom of the page, grouped by month\n */\n $scope.loadMoreEvents = function () {\n $scope.page += 1;\n return Event.query(Object.assign({ page: $scope.page }, $scope.filters), function (data) {\n $scope.events = $scope.events.concat(data);\n groupEvents($scope.events);\n\n if (!data[0] || (data[0].nb_total_events <= $scope.events.length)) {\n return $scope.noMoreResults = true;\n }\n });\n };\n\n /**\n * Callback to redirect the user to the specified event page\n * @param event {{id:number}}\n */\n $scope.showEvent = function (event) { $state.go('app.public.events_show', { id: event.id }); };\n\n /**\n * Callback to refresh the events list according to the filters set\n */\n $scope.filterEvents = function () {\n // reinitialize results datasets\n $scope.page = 1;\n $scope.eventsGroupByMonth = {};\n $scope.events = [];\n $scope.monthOrder = [];\n $scope.noMoreResults = false;\n\n // run a search query\n return Event.query(Object.assign({ page: $scope.page }, $scope.filters), function (data) {\n $scope.events = data;\n groupEvents(data);\n\n if (!data[0] || (data[0].nb_total_events <= $scope.events.length)) {\n return $scope.noMoreResults = true;\n }\n });\n };\n\n /**\n * Test if the provided event occurs on a single day or on many days\n * @param event {{start_date:Date, end_date:Date}} Event object as retreived from the API\n * @return {boolean} false if the event occurs on many days\n */\n $scope.onSingleDay = function (event) { moment(event.start_date).isSame(event.end_date, 'day'); };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n $scope.filterEvents();\n };\n\n /**\n * Group the provided events by month/year and concat them with existing results\n * Then compute the ordered list of months for the complete resultset.\n * Affect the resulting events groups in $scope.eventsGroupByMonth and the ordered month keys in $scope.monthOrder.\n * @param events {Array} Events retrieved from the API\n */\n const groupEvents = function (events) {\n if (events.length > 0) {\n const eventsGroupedByMonth = _.groupBy(events, function (obj) {\n return _.map(['month_id', 'year'], function (key) {\n return obj[key];\n });\n });\n $scope.eventsGroupByMonth = Object.assign($scope.eventsGroupByMonth, eventsGroupedByMonth);\n return $scope.monthOrder = Object.keys($scope.eventsGroupByMonth);\n }\n };\n\n // # !!! MUST BE CALLED AT THE END of the controller\n initialize();\n }\n]);\n\nApplication.Controllers.controller('ShowEventController', ['$scope', '$state', '$stateParams', '$rootScope', 'Event', '$uibModal', 'Member', 'Reservation', 'Price', 'CustomAsset', 'Slot', 'eventPromise', 'growl', '_t', 'Wallet', 'AuthService', 'helpers', 'dialogs', 'priceCategoriesPromise', 'settingsPromise',\n function ($scope, $state, $stateParams, $rootScope, Event, $uibModal, Member, Reservation, Price, CustomAsset, Slot, eventPromise, growl, _t, Wallet, AuthService, helpers, dialogs, priceCategoriesPromise, settingsPromise) {\n /* PUBLIC SCOPE */\n\n // reservations for the currently shown event\n $scope.reservations = [];\n\n // current date & time\n $scope.now = moment();\n\n // user to deal with\n $scope.ctrl =\n { member: {} };\n\n // parameters for a new reservation\n $scope.reserve = {\n nbPlaces: {\n normal: []\n },\n nbReservePlaces: 0,\n tickets: {},\n toReserve: false,\n amountTotal: 0,\n totalNoCoupon: 0,\n totalSeats: 0\n };\n\n // Discount coupon to apply to the basket, if any\n $scope.coupon =\n { applied: null };\n\n // Get the details for the current event (event's id is recovered from the current URL)\n $scope.event = eventPromise;\n\n // List of price categories for the events\n $scope.priceCategories = priceCategoriesPromise;\n\n // Global config: is the user authorized to change his bookings slots?\n $scope.enableBookingMove = (settingsPromise.booking_move_enable === 'true');\n\n // Global config: delay in hours before a booking while changing the booking slot is forbidden\n $scope.moveBookingDelay = parseInt(settingsPromise.booking_move_delay);\n\n // Global config: is the user authorized to cancel his booking slots?\n $scope.enableBookingCancel = settingsPromise.booking_cancel_enable === 'true';\n\n // Global config: delay in hours from now when restrictions occurs about cancelling reservations\n $scope.cancelBookingDelay = parseInt(settingsPromise.booking_cancel_delay);\n\n // Message displayed to the end user about rules that applies to events reservations\n $scope.eventExplicationsAlert = settingsPromise.event_explications_alert;\n\n /**\n * Callback to delete the provided event (admins only)\n * @param event {$resource} angular's Event $resource\n */\n $scope.deleteEvent = function (event) {\n // open a confirmation dialog\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: autoNgTemplateLoaderTemplate1,\n size: 'md',\n controller: 'DeleteRecurrentEventController',\n resolve: {\n eventPromise: ['Event', function (Event) { return Event.get({ id: $scope.event.id }).$promise; }]\n }\n });\n // once the dialog was closed, do things depending on the result\n modalInstance.result.then(function (res) {\n if (res.status == 'success') {\n $state.go('app.public.events_list');\n }\n });\n };\n\n /**\n * Callback to call when the number of tickets to book changes in the current booking\n */\n $scope.changeNbPlaces = function () {\n // compute the total remaning places\n let remain = $scope.event.nb_free_places - $scope.reserve.nbReservePlaces;\n for (let ticket in $scope.reserve.tickets) {\n remain -= $scope.reserve.tickets[ticket];\n }\n // we store the total number of seats booked, this is used to know if the 'pay' button must be shown\n $scope.reserve.totalSeats = $scope.event.nb_free_places - remain;\n\n // update the available seats for full price tickets\n const fullPriceRemains = $scope.reserve.nbReservePlaces + remain;\n $scope.reserve.nbPlaces.normal = __range__(0, fullPriceRemains, true);\n\n // update the available seats for other prices tickets\n for (let key in $scope.reserve.nbPlaces) {\n if (key !== 'normal') {\n const priceRemain = $scope.reserve.tickets[key] + remain;\n $scope.reserve.nbPlaces[key] = __range__(0, priceRemain, true);\n }\n }\n\n // recompute the total price\n return $scope.computeEventAmount();\n };\n\n /**\n * Callback to reset the current reservation parameters\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.cancelReserve = function (e) {\n e.preventDefault();\n return resetEventReserve();\n };\n\n /**\n * Callback to allow the user to set the details for his reservation\n */\n $scope.reserveEvent = function () {\n if ($scope.event.nb_total_places > 0) {\n $scope.reserveSuccess = false;\n if (!$scope.isAuthenticated()) {\n $scope.login(null, function (user) {\n if (user.role !== 'admin' || user.role !== 'manager') {\n $scope.ctrl.member = user;\n }\n const sameTimeReservations = findReservationsAtSameTime();\n if (sameTimeReservations.length > 0) {\n showReserveSlotSameTimeModal(sameTimeReservations, function(res) {\n $scope.reserve.toReserve = !$scope.reserve.toReserve;\n });\n } else {\n $scope.reserve.toReserve = !$scope.reserve.toReserve;\n }\n });\n } else {\n if (AuthService.isAuthorized(['admin', 'manager'])) {\n $scope.reserve.toReserve = !$scope.reserve.toReserve;\n } else {\n Member.get({ id: $scope.currentUser.id }, function (member) {\n $scope.ctrl.member = member;\n const sameTimeReservations = findReservationsAtSameTime();\n if (sameTimeReservations.length > 0) {\n showReserveSlotSameTimeModal(sameTimeReservations, function(res) {\n $scope.reserve.toReserve = !$scope.reserve.toReserve;\n });\n } else {\n $scope.reserve.toReserve = !$scope.reserve.toReserve;\n }\n });\n }\n }\n }\n };\n\n /**\n * Callback to deal with the reservations of the user selected in the dropdown list instead of the current user's\n * reservations. (admins only)\n */\n $scope.updateMember = function () {\n resetEventReserve();\n $scope.reserveSuccess = false;\n if ($scope.ctrl.member) {\n Member.get({ id: $scope.ctrl.member.id }, function (member) {\n $scope.ctrl.member = member;\n getReservations($scope.event.id, 'Event', $scope.ctrl.member.id);\n });\n }\n };\n\n /**\n * Callback to trigger the payment process of the current reservation\n */\n $scope.payEvent = function () {\n // first, we check that a user was selected\n if (Object.keys($scope.ctrl.member).length > 0) {\n const reservation = mkReservation($scope.ctrl.member, $scope.reserve, $scope.event);\n\n return Wallet.getWalletByUser({ user_id: $scope.ctrl.member.id }, function (wallet) {\n const amountToPay = helpers.getAmountToPay($scope.reserve.amountTotal, wallet.amount);\n if ((AuthService.isAuthorized(['member']) && amountToPay > 0)\n || (AuthService.isAuthorized('manager') && $scope.ctrl.member.id === $rootScope.currentUser.id && amountToPay > 0)) {\n if (settingsPromise.online_payment_module !== 'true') {\n growl.error(_t('app.public.events_show.online_payment_disabled'));\n } else {\n return payByStripe(reservation);\n }\n } else {\n if (AuthService.isAuthorized('admin')\n || (AuthService.isAuthorized('manager') && $scope.ctrl.member.id !== $rootScope.currentUser.id)\n || amountToPay === 0) {\n return payOnSite(reservation);\n }\n }\n });\n } else {\n // otherwise we alert, this error musn't occur when the current user is not admin\n return growl.error(_t('app.public.events_show.please_select_a_member_first'));\n }\n };\n\n /**\n * Callback to validate the booking of a free event\n */\n $scope.validReserveEvent = function () {\n const reservation = {\n user_id: $scope.ctrl.member.id,\n reservable_id: $scope.event.id,\n reservable_type: 'Event',\n slots_attributes: [],\n nb_reserve_places: $scope.reserve.nbReservePlaces,\n tickets_attributes: []\n };\n // a single slot is used for events\n reservation.slots_attributes.push({\n start_at: $scope.event.start_date,\n end_at: $scope.event.end_date,\n availability_id: $scope.event.availability.id\n });\n // iterate over reservations per prices\n for (let price_id in $scope.reserve.tickets) {\n const seats = $scope.reserve.tickets[price_id];\n reservation.tickets_attributes.push({\n event_price_category_id: price_id,\n booked: seats\n });\n }\n // set the attempting marker\n $scope.attempting = true;\n // save the reservation to the API\n return Reservation.save({ reservation }, function (reservation) {\n // reservation successfull\n afterPayment(reservation);\n return $scope.attempting = false;\n }\n , function (response) {\n // reservation failed\n $scope.alerts = [];\n $scope.alerts.push({\n msg: response.data.card[0],\n type: 'danger'\n });\n // unset the attempting marker\n return $scope.attempting = false;\n });\n };\n\n /**\n * Callback to cancel a reservation\n * @param reservation {{id:number, reservable_id:number, nb_reserve_places:number}}\n */\n $scope.cancelReservation = function(reservation) {\n dialogs.confirm({\n resolve: {\n object: function() {\n return {\n title: _t('app.public.events_show.cancel_the_reservation'),\n msg: _t('app.public.events_show.do_you_really_want_to_cancel_this_reservation_this_apply_to_all_booked_tickets')\n };\n }\n }\n }, function() { // cancel confirmed\n Slot.cancel({\n id: reservation.slots[0].id\n }, function() { // successfully canceled\n let index;\n growl.success(_t('app.public.events_show.reservation_was_successfully_cancelled'));\n index = $scope.reservations.indexOf(reservation);\n $scope.event.nb_free_places = $scope.event.nb_free_places + reservation.total_booked_seats;\n $scope.reservations[index].slots[0].canceled_at = new Date();\n }, function(error) {\n growl.warning(_t('app.public.events_show.cancellation_failed'));\n });\n });\n };\n\n /**\n * Test if the provided reservation has been cancelled\n * @param reservation {Reservation}\n * @returns {boolean}\n */\n $scope.isCancelled = function(reservation) {\n return !!(reservation.slots[0].canceled_at);\n }\n\n /**\n * Callback to alter an already booked reservation date. A modal window will be opened to allow the user to choose\n * a new date for his reservation (if any available)\n * @param reservation {{id:number, reservable_id:number, nb_reserve_places:number}}\n */\n $scope.modifyReservation = function (reservation) {\n const index = $scope.reservations.indexOf(reservation);\n return $uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate2,\n resolve: {\n event () { return $scope.event; },\n reservation () { return reservation; }\n },\n controller: ['$scope', '$uibModalInstance', 'event', 'reservation', 'Reservation', function ($scope, $uibModalInstance, event, reservation, Reservation) {\n // we copy the controller's resolved parameters into the scope\n $scope.event = event;\n $scope.reservation = angular.copy(reservation);\n\n // set the reservable_id to the first available event\n for (evt of Array.from(event.recurrence_events)) {\n if (evt.nb_free_places > reservation.total_booked_seats) {\n $scope.reservation.reservable_id = evt.id;\n break;\n }\n }\n\n // Callback to validate the new reservation's date\n $scope.ok = function () {\n let eventToPlace = null;\n angular.forEach(event.recurrence_events, function (e) {\n if (e.id === parseInt($scope.reservation.reservable_id, 10)) {\n return eventToPlace = e;\n }\n });\n $scope.reservation.slots[0].start_at = eventToPlace.start_date;\n $scope.reservation.slots[0].end_at = eventToPlace.end_date;\n $scope.reservation.slots[0].availability_id = eventToPlace.availability_id;\n $scope.reservation.slots_attributes = $scope.reservation.slots;\n $scope.attempting = true;\n Reservation.update({ id: reservation.id }, { reservation: $scope.reservation }, function (reservation) {\n $uibModalInstance.close(reservation);\n $scope.attempting = true;\n }\n , function (response) {\n $scope.alerts = [];\n angular.forEach(response, function (v, k) {\n angular.forEach(v, function (err) {\n $scope.alerts.push({ msg: k + ': ' + err, type: 'danger' });\n });\n });\n $scope.attempting = false;\n });\n };\n\n // Callback to cancel the modification\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }\n ] })\n .result['finally'](null).then(function (reservation) {\n // remove the reservation from the user's reservations list for this event (occurrence)\n $scope.reservations.splice(index, 1);\n // add the number of places transfered (to the new date) to the total of free places for this event\n $scope.event.nb_free_places = $scope.event.nb_free_places + reservation.total_booked_seats;\n // remove the number of places transfered from the total of free places of the receiving occurrance\n angular.forEach($scope.event.recurrence_events, function (e) {\n if (e.id === parseInt(reservation.reservable.id, 10)) {\n return e.nb_free_places = e.nb_free_places - reservation.total_booked_seats;\n }\n });\n });\n };\n\n /**\n * Checks if the provided reservation is able to be moved (date change)\n * @param reservation {{slots:[], total_booked_seats:number}}\n */\n $scope.reservationCanModify = function (reservation) {\n const slotStart = moment(reservation.slots[0].start_at);\n const now = moment();\n\n let isAble = false;\n angular.forEach($scope.event.recurrence_events, function (e) {\n if (e.nb_free_places >= reservation.total_booked_seats) { return isAble = true; }\n });\n return (isAble && $scope.enableBookingMove && (slotStart.diff(now, 'hours') >= $scope.moveBookingDelay));\n };\n\n /**\n * Checks if the provided reservation is able to be cancelled\n * @param reservation {{slots:[]}}\n */\n $scope.reservationCanCancel = function(reservation) {\n var now, slotStart;\n slotStart = moment(reservation.slots[0].start_at);\n now = moment();\n return $scope.enableBookingCancel && slotStart.diff(now, \"hours\") >= $scope.cancelBookingDelay;\n };\n\n /**\n * Compute the total amount for the current reservation according to the previously set parameters\n * and assign the result in $scope.reserve.amountTotal\n */\n $scope.computeEventAmount = function () {\n // first we check that a user was selected\n if (Object.keys($scope.ctrl.member).length > 0) {\n const r = mkReservation($scope.ctrl.member, $scope.reserve, $scope.event);\n return Price.compute(mkRequestParams(r, $scope.coupon.applied), function (res) {\n $scope.reserve.amountTotal = res.price;\n return $scope.reserve.totalNoCoupon = res.price_without_coupon;\n });\n } else {\n return $scope.reserve.amountTotal = null;\n }\n };\n\n /**\n * Return the URL allowing to share the current project on the Facebook social network\n */\n $scope.shareOnFacebook = function () { return `https://www.facebook.com/share.php?u=${$state.href('app.public.events_show', { id: $scope.event.id }, { absolute: true }).replace('#', '%23')}`; };\n\n /**\n * Return the URL allowing to share the current project on the Twitter social network\n */\n $scope.shareOnTwitter = function () { return `https://twitter.com/intent/tweet?url=${encodeURIComponent($state.href('app.public.events_show', { id: $scope.event.id }, { absolute: true }))}&text=${encodeURIComponent($scope.event.title)}`; };\n\n /**\n * Return the textual description of the conditions applyable to the given price's category\n * @param category_id {number} ID of the price's category\n */\n $scope.getPriceCategoryConditions = function (category_id) {\n for (let cat of Array.from($scope.priceCategories)) {\n if (cat.id === category_id) {\n return cat.conditions;\n }\n }\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n // set the controlled user as the current user if the current user is not an admin\n if ($scope.currentUser) {\n if ($scope.currentUser.role !== 'admin') {\n $scope.ctrl.member = $scope.currentUser;\n }\n }\n\n // initialize the \"reserve\" object with the event's data\n resetEventReserve();\n\n // if non-admin, get the current user's reservations into $scope.reservations\n if ($scope.currentUser) {\n getReservations($scope.event.id, 'Event', $scope.currentUser.id);\n }\n\n // watch when a coupon is applied to re-compute the total price\n $scope.$watch('coupon.applied', function (newValue, oldValue) {\n if ((newValue !== null) || (oldValue !== null)) {\n return $scope.computeEventAmount();\n }\n });\n };\n\n /**\n * Retrieve the reservations for the couple event / user\n * @param reservable_id {number} the current event id\n * @param reservable_type {string} 'Event'\n * @param user_id {number} the user's id (current or managed)\n */\n const getReservations = function (reservable_id, reservable_type, user_id) {\n Reservation.query({\n reservable_id,\n reservable_type,\n user_id\n }).$promise.then(function (reservations) { $scope.reservations = reservations; });\n };\n\n /**\n * Create an hash map implementing the Reservation specs\n * @param member {Object} User as retreived from the API: current user / selected user if current is admin\n * @param reserve {Object} Reservation parameters (places...)\n * @param event {Object} Current event\n * @return {{user_id:number, reservable_id:number, reservable_type:string, slots_attributes:Array, nb_reserve_places:number}}\n */\n const mkReservation = function (member, reserve, event) {\n const reservation = {\n user_id: member.id,\n reservable_id: event.id,\n reservable_type: 'Event',\n slots_attributes: [],\n nb_reserve_places: reserve.nbReservePlaces,\n tickets_attributes: []\n };\n\n reservation.slots_attributes.push({\n start_at: event.start_date,\n end_at: event.end_date,\n availability_id: event.availability.id,\n offered: event.offered || false\n });\n\n for (let evt_px_cat of Array.from(event.prices)) {\n const booked = reserve.tickets[evt_px_cat.id];\n if (booked > 0) {\n reservation.tickets_attributes.push({\n event_price_category_id: evt_px_cat.id,\n booked\n });\n }\n }\n\n return reservation;\n };\n\n /**\n * Format the parameters expected by /api/prices/compute or /api/reservations and return the resulting object\n * @param reservation {Object} as returned by mkReservation()\n * @param coupon {Object} Coupon as returned from the API\n * @return {{reservation:Object, coupon_code:string}}\n */\n const mkRequestParams = function (reservation, coupon) {\n const params = {\n reservation,\n coupon_code: ((coupon ? coupon.code : undefined))\n };\n\n return params;\n };\n\n /**\n * Set the current reservation to the default values. This implies the reservation form to be hidden.\n */\n const resetEventReserve = function () {\n if ($scope.event) {\n $scope.reserve = {\n nbPlaces: {\n normal: __range__(0, $scope.event.nb_free_places, true)\n },\n nbReservePlaces: 0,\n tickets: {},\n toReserve: false,\n amountTotal: 0,\n totalSeats: 0\n };\n\n for (let evt_px_cat of Array.from($scope.event.prices)) {\n $scope.reserve.nbPlaces[evt_px_cat.id] = __range__(0, $scope.event.nb_free_places, true);\n $scope.reserve.tickets[evt_px_cat.id] = 0;\n }\n\n return $scope.event.offered = false;\n }\n };\n\n /**\n * Open a modal window which trigger the stripe payment process\n * @param reservation {Object} to book\n */\n const payByStripe = function (reservation) {\n $uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate3,\n size: 'md',\n resolve: {\n reservation () {\n return reservation;\n },\n price () {\n return Price.compute(mkRequestParams(reservation, $scope.coupon.applied)).$promise;\n },\n wallet () {\n return Wallet.getWalletByUser({ user_id: reservation.user_id }).$promise;\n },\n cgv () {\n return CustomAsset.get({ name: 'cgv-file' }).$promise;\n },\n objectToPay () {\n return {\n eventToReserve: $scope.event,\n reserve: $scope.reserve,\n member: $scope.ctrl.member\n };\n },\n coupon () {\n return $scope.coupon.applied;\n },\n cartItems () {\n return mkRequestParams(reservation, $scope.coupon.applied);\n },\n stripeKey: ['Setting', function (Setting) { return Setting.get({ name: 'stripe_public_key' }).$promise; }]\n },\n controller: ['$scope', '$uibModalInstance', '$state', 'reservation', 'price', 'cgv', 'Auth', 'Reservation', 'growl', 'wallet', 'helpers', '$filter', 'coupon', 'cartItems', 'stripeKey',\n function ($scope, $uibModalInstance, $state, reservation, price, cgv, Auth, Reservation, growl, wallet, helpers, $filter, coupon, cartItems, stripeKey) {\n // User's wallet amount\n $scope.wallet = wallet;\n\n // Price\n $scope.price = price.price;\n\n // Amount to pay\n $scope.amount = helpers.getAmountToPay(price.price, wallet.amount);\n\n // Cart items\n $scope.cartItems = cartItems;\n\n // CGV\n $scope.cgv = cgv.custom_asset;\n\n // Reservation\n $scope.reservation = reservation;\n\n // Used in wallet info template to interpolate some translations\n $scope.numberFilter = $filter('number');\n\n // stripe publishable key\n $scope.stripeKey = stripeKey.setting.value;\n\n // Callback to handle the post-payment and reservation\n $scope.onPaymentSuccess = function (reservation) {\n $uibModalInstance.close(reservation);\n };\n }\n ]\n }).result['finally'](null).then(function (reservation) { afterPayment(reservation); });\n };\n\n /**\n * Open a modal window which trigger the local payment process\n * @param reservation {Object} to book\n */\n const payOnSite = function (reservation) {\n $uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate4,\n size: 'sm',\n resolve: {\n reservation () {\n return reservation;\n },\n price () {\n return Price.compute(mkRequestParams(reservation, $scope.coupon.applied)).$promise;\n },\n wallet () {\n return Wallet.getWalletByUser({ user_id: reservation.user_id }).$promise;\n },\n coupon () {\n return $scope.coupon.applied;\n },\n cartItems () {\n return mkRequestParams(reservation, $scope.coupon.applied);\n },\n },\n controller: ['$scope', '$uibModalInstance', '$state', 'reservation', 'price', 'Auth', 'Reservation', 'wallet', 'helpers', '$filter', 'coupon', 'cartItems',\n function ($scope, $uibModalInstance, $state, reservation, price, Auth, Reservation, wallet, helpers, $filter, coupon, cartItems) {\n // User's wallet amount\n $scope.wallet = wallet;\n\n // Price\n $scope.price = price.price;\n\n // Cart items\n $scope.cartItems = cartItems;\n\n // price to pay\n $scope.amount = helpers.getAmountToPay(price.price, wallet.amount);\n\n // Reservation\n $scope.reservation = reservation;\n\n // Used in wallet info template to interpolate some translations\n $scope.numberFilter = $filter('number');\n\n // Button label\n if ($scope.amount > 0) {\n $scope.validButtonName = _t('app.public.events_show.confirm_payment_of_html', { ROLE: $scope.currentUser.role, AMOUNT: $filter('currency')($scope.amount) });\n } else {\n if ((price.price > 0) && ($scope.walletAmount === 0)) {\n $scope.validButtonName = _t('app.public.events_show.confirm_payment_of_html', { ROLE: $scope.currentUser.role, AMOUNT: $filter('currency')(price.price) });\n } else {\n $scope.validButtonName = _t('app.shared.buttons.confirm');\n }\n }\n\n // Callback to validate the payment\n $scope.ok = function () {\n $scope.attempting = true;\n return Reservation.save(mkRequestParams($scope.reservation, coupon), function (reservation) {\n $uibModalInstance.close(reservation);\n return $scope.attempting = true;\n }\n , function (response) {\n $scope.alerts = [];\n angular.forEach(response, function (v, k) {\n angular.forEach(v, function (err) {\n $scope.alerts.push({\n msg: k + ': ' + err,\n type: 'danger'\n });\n });\n });\n return $scope.attempting = false;\n });\n };\n\n // Callback to cancel the payment\n return $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }\n ] })\n .result['finally'](null).then(function (reservation) { afterPayment(reservation); });\n };\n\n /**\n * What to do after the payment was successful\n * @param reservation {Object} booked reservation\n */\n const afterPayment = function (reservation) {\n $scope.event.nb_free_places = $scope.event.nb_free_places - reservation.total_booked_seats;\n resetEventReserve();\n $scope.reserveSuccess = true;\n $scope.coupon.applied = null;\n $scope.reservations.push(reservation);\n if ($scope.currentUser.role === 'admin') {\n return $scope.ctrl.member = null;\n }\n };\n\n /**\n * Find user's reservations, the same date at the same time, with event\n */\n const findReservationsAtSameTime = function () {\n let sameTimeReservations = [\n 'training_reservations',\n 'machine_reservations',\n 'space_reservations',\n 'events_reservations'\n ].map(function(k) {\n return _.filter($scope.ctrl.member[k], function(r) {\n if (r.reservable_type === 'Event' && r.reservable.id === $scope.event.id) {\n return false;\n }\n return moment($scope.event.start_time).isSame(r.start_at) ||\n (moment($scope.event.end_time).isAfter(r.start_at) && moment($scope.event.end_time).isBefore(r.end_at)) ||\n (moment($scope.event.start_time).isAfter(r.start_at) && moment($scope.event.start_time).isBefore(r.end_at)) ||\n (moment($scope.event.start_time).isBefore(r.start_at) && moment($scope.event.end_time).isAfter(r.end_at));\n });\n });\n return _.union.apply(null, sameTimeReservations);\n };\n\n /**\n * A modal for show reservations the same date at the same time\n *\n * @param sameTimeReservations {Array} reservations the same date at the same time\n * @param callback {function} callback will invoke when user confirm\n */\n const showReserveSlotSameTimeModal = function(sameTimeReservations, callback) {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: autoNgTemplateLoaderTemplate5,\n size: 'md',\n controller: 'ReserveSlotSameTimeController',\n resolve: {\n sameTimeReservations: function() { return sameTimeReservations; },\n bookOverlappingSlotsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'book_overlapping_slots' }).$promise; }]\n }\n });\n modalInstance.result.then(callback);\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\nfunction __range__ (left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n\n\n/**\n * Controller used in the event deletion modal window\n */\nApplication.Controllers.controller('DeleteRecurrentEventController', ['$scope', '$uibModalInstance', 'Event', 'eventPromise', 'growl', '_t',\n function ($scope, $uibModalInstance, Event, eventPromise, growl, _t) {\n\n // is the current event (to be deleted) recurrent?\n $scope.isRecurrent = eventPromise.recurrence_events.length > 0;\n\n // with recurrent slots: how many slots should we delete?\n $scope.deleteMode = 'single';\n\n /**\n * Confirmation callback\n */\n $scope.ok = function () {\n const { id, start_at, end_at } = eventPromise;\n // the admin has confirmed, delete the slot\n Event.delete(\n { id, mode: $scope.deleteMode },\n function (res) {\n // delete success\n if (res.deleted > 1) {\n growl.success(_t(\n 'app.public.events_show.events_deleted',\n {COUNT: res.deleted - 1}\n ));\n } else {\n growl.success(_t(\n 'app.public.events_show.event_successfully_deleted'\n ));\n }\n $uibModalInstance.close({\n status: 'success',\n events: res.details.map(function (d) { return d.event.id })\n });\n },\n function (res) {\n // not everything was deleted\n const { data } = res;\n if (data.total > 1) {\n growl.warning(_t(\n 'app.public.events_show.events_not_deleted',\n {TOTAL: data.total, COUNT: data.total - data.deleted}\n ));\n } else {\n growl.error(_t(\n 'app.public.events_show.unable_to_delete_the_event'\n ));\n }\n $uibModalInstance.close({\n status: 'failed',\n availabilities: data.details.filter(function (d) { return d.status }).map(function (d) { return d.event.id })\n });\n });\n }\n\n /**\n * Cancellation callback\n */\n $scope.cancel = function () {\n $uibModalInstance.dismiss('cancel');\n }\n }\n]);\n","'use strict';\n\nApplication.Controllers.controller('HomeController', ['$scope', '$stateParams', '$translatePartialLoader', 'AuthService', 'settingsPromise', 'Member', 'uiTourService', '_t',\n function ($scope, $stateParams, $translatePartialLoader, AuthService, settingsPromise, Member, uiTourService, _t) {\n /* PUBLIC SCOPE */\n\n // Home page HTML content\n $scope.homeContent = null;\n\n // Status of the components in the home page (exists or not?)\n $scope.status = {\n news: false,\n projects: false,\n twitter: false,\n members: false,\n events: false\n };\n\n /**\n * Setup the feature-tour for the home page. (admins only)\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupHomeTour = function () {\n if (AuthService.isAuthorized(['admin', 'manager'])) {\n // Workaround for the following bug: sometimes, when the feature tour is shown, the translations keys are not\n // interpreted. This is an ugly hack, but we can't do better for now because angular-ui-tour does not support\n // removing steps (this would allow us to recreate the steps when the translations are loaded), and we can't use\n // promises with _t's translations (this would be a very big refactoring)\n setTimeout(setupWelcomeTour, 1000);\n }\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n // if we receive a token to reset the password as GET parameter, trigger the\n // changePassword modal from the parent controller\n if ($stateParams.reset_password_token) {\n return $scope.$parent.editPassword($stateParams.reset_password_token);\n }\n\n // We set the home page content, with the directives replacing the placeholders\n $scope.homeContent = insertDirectives(settingsPromise.home_content);\n\n // for admins, setup the tour on login\n $scope.$watch('currentUser', function (newValue, oldValue) {\n if (!oldValue && newValue && newValue.role === 'admin') {\n const uitour = uiTourService.getTourByName('welcome');\n if (!uitour.hasStep()) {\n setupWelcomeTour();\n }\n }\n });\n };\n\n /**\n * Parse the provided html and replace the elements with special IDs (#news, #projects, #twitter, #members, #events)\n * by their respective angular directives\n * @param html {String} a valid html string, as defined by the summernote editor in admin/settings/home_page\n * @returns {string} a valid html string containing angular directives for the specified plugins\n */\n const insertDirectives = function (html) {\n const node = document.createElement('div');\n node.innerHTML = html.trim();\n\n node.querySelectorAll('div#news').forEach((newsNode) => {\n const news = document.createElement('news');\n newsNode.parentNode.replaceChild(news, newsNode);\n $scope.status.news = true;\n });\n\n node.querySelectorAll('div#projects').forEach((projectsNode) => {\n const projects = document.createElement('projects');\n projectsNode.parentNode.replaceChild(projects, projectsNode);\n $scope.status.projects = true;\n });\n\n node.querySelectorAll('div#twitter').forEach((twitterNode) => {\n const twitter = document.createElement('twitter');\n twitterNode.parentNode.replaceChild(twitter, twitterNode);\n $scope.status.twitter = true;\n });\n\n node.querySelectorAll('div#members').forEach((membersNode) => {\n const members = document.createElement('members');\n membersNode.parentNode.replaceChild(members, membersNode);\n $scope.status.members = true;\n });\n\n node.querySelectorAll('div#events').forEach((eventsNode) => {\n const events = document.createElement('events');\n eventsNode.parentNode.replaceChild(events, eventsNode);\n $scope.status.events = true;\n });\n\n return node.outerHTML;\n };\n\n /**\n * Setup the feature-tour for the home page that will present an overview of the whole app.\n * This is intended as a contextual help.\n */\n const setupWelcomeTour = function () {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('welcome');\n // add the steps\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.public.tour.welcome.welcome.title'),\n content: _t('app.public.tour.welcome.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n uitour.createStep({\n selector: '.nav-primary li.home-link',\n stepId: 'home',\n order: 1,\n title: _t('app.public.tour.welcome.home.title'),\n content: _t('app.public.tour.welcome.home.content'),\n placement: 'right'\n });\n uitour.createStep({\n selector: '.nav-primary li.public-calendar-link',\n stepId: 'calendar',\n order: 2,\n title: _t('app.public.tour.welcome.calendar.title'),\n content: _t('app.public.tour.welcome.calendar.content'),\n placement: 'right'\n });\n uitour.createStep({\n selector: '.nav-primary li.reserve-machine-link',\n stepId: 'machines',\n order: 3,\n title: _t('app.public.tour.welcome.machines.title'),\n content: _t('app.public.tour.welcome.machines.content'),\n placement: 'right'\n });\n if ($scope.$root.modules.spaces) {\n uitour.createStep({\n selector: '.nav-primary li.reserve-space-link',\n stepId: 'spaces',\n order: 4,\n title: _t('app.public.tour.welcome.spaces.title'),\n content: _t('app.public.tour.welcome.spaces.content'),\n placement: 'right'\n });\n }\n uitour.createStep({\n selector: '.nav-primary li.reserve-training-link',\n stepId: 'trainings',\n order: 5,\n title: _t('app.public.tour.welcome.trainings.title'),\n content: _t('app.public.tour.welcome.trainings.content'),\n placement: 'right'\n });\n uitour.createStep({\n selector: '.nav-primary li.reserve-event-link',\n stepId: 'events',\n order: 6,\n title: _t('app.public.tour.welcome.events.title'),\n content: _t('app.public.tour.welcome.events.content'),\n placement: 'right'\n });\n uitour.createStep({\n selector: '.nav-primary li.projects-gallery-link',\n stepId: 'projects',\n order: 7,\n title: _t('app.public.tour.welcome.projects.title'),\n content: _t('app.public.tour.welcome.projects.content'),\n placement: 'right'\n });\n uitour.createStep({\n selector: '.nav-primary li.plans-link',\n stepId: 'plans',\n order: 8,\n title: _t('app.public.tour.welcome.plans.title'),\n content: _t('app.public.tour.welcome.plans.content'),\n placement: 'right'\n });\n uitour.createStep({\n selector: '.nav-primary .admin-section',\n stepId: 'admin',\n order: 9,\n title: _t('app.public.tour.welcome.admin.title', { ROLE: _t(`app.public.common.${$scope.currentUser.role}`) }),\n content: _t('app.public.tour.welcome.admin.content'),\n placement: 'right'\n });\n uitour.createStep({\n selector: '.navbar.header li.about-page-link',\n stepId: 'about',\n order: 10,\n title: _t('app.public.tour.welcome.about.title'),\n content: _t('app.public.tour.welcome.about.content'),\n placement: 'bottom',\n popupClass: 'shift-right-40'\n });\n uitour.createStep({\n selector: '.navbar.header li.notification-center-link',\n stepId: 'notifications',\n order: 11,\n title: _t('app.public.tour.welcome.notifications.title'),\n content: _t('app.public.tour.welcome.notifications.content'),\n placement: 'bottom'\n });\n uitour.createStep({\n selector: '.navbar.header li.user-menu-dropdown',\n stepId: 'profile',\n order: 12,\n title: _t('app.public.tour.welcome.profile.title'),\n content: _t('app.public.tour.welcome.profile.content'),\n placement: 'bottom',\n popupClass: 'shift-left-80'\n });\n if ($scope.status.news && settingsPromise.home_blogpost) {\n uitour.createStep({\n selector: 'news',\n stepId: 'news',\n order: 13,\n title: _t('app.public.tour.welcome.news.title'),\n content: _t('app.public.tour.welcome.news.content'),\n placement: 'bottom'\n });\n }\n if ($scope.status.projects) {\n uitour.createStep({\n selector: 'projects',\n stepId: 'last_projects',\n order: 14,\n title: _t('app.public.tour.welcome.last_projects.title'),\n content: _t('app.public.tour.welcome.last_projects.content'),\n placement: 'right'\n });\n }\n if ($scope.status.twitter) {\n uitour.createStep({\n selector: 'twitter',\n stepId: 'last_tweet',\n order: 15,\n title: _t('app.public.tour.welcome.last_tweet.title'),\n content: _t('app.public.tour.welcome.last_tweet.content'),\n placement: 'left'\n });\n }\n if ($scope.status.members) {\n uitour.createStep({\n selector: 'members',\n stepId: 'last_members',\n order: 16,\n title: _t('app.public.tour.welcome.last_members.title'),\n content: _t('app.public.tour.welcome.last_members.content'),\n placement: 'left'\n });\n }\n if ($scope.status.events) {\n uitour.createStep({\n selector: 'events',\n stepId: 'next_events',\n order: 17,\n title: _t('app.public.tour.welcome.next_events.title'),\n content: _t('app.public.tour.welcome.next_events.content'),\n placement: 'top'\n });\n }\n uitour.createStep({\n selector: 'body',\n stepId: 'customize',\n order: 18,\n title: _t('app.public.tour.welcome.customize.title'),\n content: _t('app.public.tour.welcome.customize.content'),\n placement: 'bottom',\n orphan: 'true'\n });\n if (AuthService.isAuthorized('admin')) {\n uitour.createStep({\n selector: '.app-generator .app-version',\n stepId: 'version',\n order: 19,\n title: _t('app.public.tour.welcome.version.title'),\n content: _t('app.public.tour.welcome.version.content'),\n placement: 'top'\n });\n }\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 20,\n title: _t('app.public.tour.conclusion.title'),\n content: _t('app.public.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('welcome') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'welcome' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('welcome') < 0) {\n uitour.start();\n }\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n","const autoNgTemplateLoaderTemplate1 = require('/usr/src/app/app/frontend/templates/machines/training_reservation_modal.html');\nconst autoNgTemplateLoaderTemplate2 = require('/usr/src/app/app/frontend/templates/machines/request_training_modal.html');\n\n/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/* COMMON CODE */\n\n/**\n * Provides a set of common callback methods to the $scope parameter. These methods are used\n * in the various machines' admin controllers.\n *\n * Provides :\n * - $scope.submited(content)\n * - $scope.cancel()\n * - $scope.fileinputClass(v)\n * - $scope.addFile()\n * - $scope.deleteFile(file)\n *\n * Requires :\n * - $scope.machine.machine_files_attributes = []\n * - $state (Ui-Router) [ 'app.public.machines_list' ]\n */\nclass MachinesController {\n constructor ($scope, $state) {\n /**\n * For use with ngUpload (https://github.com/twilson63/ngUpload).\n * Intended to be the callback when the upload is done: any raised error will be stacked in the\n * $scope.alerts array. If everything goes fine, the user is redirected to the machines list.\n * @param content {Object} JSON - The upload's result\n */\n $scope.submited = function (content) {\n if ((content.id == null)) {\n $scope.alerts = [];\n angular.forEach(content, function (v, k) {\n angular.forEach(v, function (err) {\n $scope.alerts.push({\n msg: k + ': ' + err,\n type: 'danger'\n });\n });\n });\n } else {\n return $state.go('app.public.machines_list');\n }\n };\n\n /**\n * Changes the current user's view, redirecting him to the machines list\n */\n $scope.cancel = function () { $state.go('app.public.machines_list'); };\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n\n /**\n * This will create a single new empty entry into the machine attachements list.\n */\n $scope.addFile = function () { $scope.machine.machine_files_attributes.push({}); };\n\n /**\n * This will remove the given file from the machine attachements list. If the file was previously uploaded\n * to the server, it will be marked for deletion on the server. Otherwise, it will be simply truncated from\n * the attachements array.\n * @param file {Object} the file to delete\n */\n $scope.deleteFile = function (file) {\n const index = $scope.machine.machine_files_attributes.indexOf(file);\n if (file.id != null) {\n return file._destroy = true;\n } else {\n return $scope.machine.machine_files_attributes.splice(index, 1);\n }\n };\n }\n}\n\n/**\n * Manages the transition when a user clicks on the reservation button.\n * According to the status of user currently logged into the system, redirect him to the reservation page,\n * or display a modal window asking him to complete a training before he can book a machine reservation.\n * @param machine {{id:number}} An object containg the id of the machine to book,\n * the object will be completed before the fonction returns.\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\nconst _reserveMachine = function (machine, e) {\n const _this = this;\n e.preventDefault();\n e.stopPropagation();\n\n // retrieve the full machine object\n return machine = _this.Machine.get({ id: machine.id }, function () {\n // if the currently logged'in user has completed the training for this machine, or this machine does not require\n // a prior training, just redirect him to the machine's booking page\n if (machine.current_user_is_training || (machine.trainings.length === 0)) {\n return _this.$state.go('app.logged.machines_reserve', { id: machine.slug });\n } else {\n // otherwise, if a user is authenticated ...\n if (_this.$scope.isAuthenticated()) {\n // ... and have booked a training for this machine, tell him that he must wait for an admin to validate\n // the training before he can book the reservation\n if (machine.current_user_training_reservation) {\n return _this.$uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: ['$scope', '$uibModalInstance', function ($scope, $uibModalInstance) {\n $scope.machine = machine;\n return $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n });\n // ... but does not have booked the training, tell him to register for a training session first\n // unless all associated trainings are disabled\n } else {\n // if all trainings are disabled, just redirect the user to the reservation calendar\n if (machine.trainings.map(function (t) { return t.disabled; }).reduce(function (acc, val) { return acc && val; }, true)) {\n return _this.$state.go('app.logged.machines_reserve', { id: machine.slug });\n // otherwise open the information modal\n } else {\n return _this.$uibModal.open({\n templateUrl: autoNgTemplateLoaderTemplate2,\n controller: ['$scope', '$uibModalInstance', '$state', function ($scope, $uibModalInstance, $state) {\n $scope.machine = machine;\n $scope.member = _this.$scope.currentUser;\n\n // transform the name of the trainings associated with the machine to integrate them in a sentence\n $scope.humanizeTrainings = function () {\n let text = '';\n angular.forEach($scope.machine.trainings, function (training) {\n if (text.length > 0) {\n text += _this._t('app.public.machines_list._or_the_');\n }\n return text += training.name.substr(0, 1).toLowerCase() + training.name.substr(1);\n });\n return text;\n };\n\n // modal is closed with validation\n $scope.ok = function () {\n $state.go('app.logged.trainings_reserve', { id: $scope.machine.trainings[0].id });\n return $uibModalInstance.close(machine);\n };\n\n // modal is closed with escaping\n return $scope.cancel = function (e) {\n e.preventDefault();\n return $uibModalInstance.dismiss('cancel');\n };\n }\n ] });\n }\n }\n\n // if the user is not logged, open the login modal window\n } else {\n return _this.$scope.login();\n }\n }\n });\n};\n\n/**\n * Controller used in the public listing page, allowing everyone to see the list of machines\n */\nApplication.Controllers.controller('MachinesController', ['$scope', '$state', '_t', 'AuthService', 'Machine', '$uibModal', 'machinesPromise', 'settingsPromise', 'Member', 'uiTourService',\n function ($scope, $state, _t, AuthService, Machine, $uibModal, machinesPromise, settingsPromise, Member, uiTourService) {\n /* PUBLIC SCOPE */\n\n // Retrieve the list of machines\n $scope.machines = machinesPromise;\n\n /**\n * Redirect the user to the machine details page\n */\n $scope.showMachine = function (machine) { $state.go('app.public.machines_show', { id: machine.slug }); };\n\n /**\n * Callback to book a reservation for the current machine\n */\n $scope.reserveMachine = _reserveMachine.bind({\n $scope,\n $state,\n _t,\n $uibModal,\n Machine\n });\n\n // Default: we show only enabled machines\n $scope.machineFiltering = 'enabled';\n\n // Available options for filtering machines by status\n $scope.filterDisabled = [\n 'enabled',\n 'disabled',\n 'all'\n ];\n\n /**\n * Setup the feature-tour for the machines page. (admins only)\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupMachinesTour = function () {\n // setup the tour for admins only\n if (AuthService.isAuthorized(['admin', 'manager'])) {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('machines');\n if (AuthService.isAuthorized('admin')) {\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.public.tour.machines.welcome.title'),\n content: _t('app.public.tour.machines.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n if ($scope.machines.length > 0) {\n uitour.createStep({\n selector: '.machines-list .show-button',\n stepId: 'view',\n order: 1,\n title: _t('app.public.tour.machines.view.title'),\n content: _t('app.public.tour.machines.view.content'),\n placement: 'top'\n });\n }\n } else {\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome_manager',\n order: 0,\n title: _t('app.public.tour.machines.welcome_manager.title'),\n content: _t('app.public.tour.machines.welcome_manager.content'),\n placement: 'bottom',\n orphan: true\n });\n }\n if ($scope.machines.length > 0) {\n uitour.createStep({\n selector: '.machines-list .reserve-button',\n stepId: 'reserve',\n order: 2,\n title: _t('app.public.tour.machines.reserve.title'),\n content: _t('app.public.tour.machines.reserve.content'),\n placement: 'top'\n });\n }\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 3,\n title: _t('app.public.tour.conclusion.title'),\n content: _t('app.public.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('machines') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'machines' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('machines') < 0) {\n uitour.start();\n }\n }\n }\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {}\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the machine creation page (admin)\n */\nApplication.Controllers.controller('NewMachineController', ['$scope', '$state', 'CSRF', function ($scope, $state, CSRF) {\n CSRF.setMetaTags();\n\n // API URL where the form will be posted\n $scope.actionUrl = '/api/machines/';\n\n // Form action on the above URL\n $scope.method = 'post';\n\n // default machine parameters\n $scope.machine =\n { machine_files_attributes: [] };\n\n // Using the MachinesController\n return new MachinesController($scope, $state);\n}\n]);\n\n/**\n * Controller used in the machine edition page (admin)\n */\nApplication.Controllers.controller('EditMachineController', ['$scope', '$state', '$stateParams', 'machinePromise', 'CSRF',\n function ($scope, $state, $stateParams, machinePromise, CSRF) {\n /* PUBLIC SCOPE */\n\n // API URL where the form will be posted\n $scope.actionUrl = `/api/machines/${$stateParams.id}`;\n\n // Form action on the above URL\n $scope.method = 'put';\n\n // Retrieve the details for the machine id in the URL, if an error occurs redirect the user to the machines list\n $scope.machine = machinePromise;\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n CSRF.setMetaTags();\n\n // Using the MachinesController\n return new MachinesController($scope, $state);\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the machine details page (public)\n */\nApplication.Controllers.controller('ShowMachineController', ['$scope', '$state', '$uibModal', '$stateParams', '_t', 'Machine', 'growl', 'machinePromise', 'dialogs',\n function ($scope, $state, $uibModal, $stateParams, _t, Machine, growl, machinePromise, dialogs) {\n // Retrieve the details for the machine id in the URL, if an error occurs redirect the user to the machines list\n $scope.machine = machinePromise;\n\n /**\n * Callback to delete the current machine (admins only)\n */\n $scope.delete = function (machine) {\n // check the permissions\n if ($scope.currentUser.role !== 'admin') {\n console.error(_t('app.public.machines_show.unauthorized_operation'));\n } else {\n dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.public.machines_show.confirmation_required'),\n msg: _t('app.public.machines_show.do_you_really_want_to_delete_this_machine')\n };\n }\n }\n }\n , function () { // deletion confirmed\n // delete the machine then redirect to the machines listing\n machine.$delete(\n function () { $state.go('app.public.machines_list'); },\n function (error) { growl.warning(_t('app.public.machines_show.the_machine_cant_be_deleted_because_it_is_already_reserved_by_some_users')); console.error(error); }\n );\n });\n }\n };\n\n /**\n * Callback to book a reservation for the current machine\n */\n return $scope.reserveMachine = _reserveMachine.bind({\n $scope,\n $state,\n _t,\n $uibModal,\n Machine\n });\n }\n]);\n\n/**\n * Controller used in the machine reservation page (for logged users who have completed the training and admins).\n * This controller workflow is pretty similar to the trainings reservation controller.\n */\n\nApplication.Controllers.controller('ReserveMachineController', ['$scope', '$stateParams', '_t', 'moment', 'Auth', '$timeout', 'Member', 'Availability', 'plansPromise', 'groupsPromise', 'machinePromise', 'settingsPromise', 'uiCalendarConfig', 'CalendarConfig',\n function ($scope, $stateParams, _t, moment, Auth, $timeout, Member, Availability, plansPromise, groupsPromise, machinePromise, settingsPromise, uiCalendarConfig, CalendarConfig) {\n /* PRIVATE STATIC CONSTANTS */\n\n // Slot free to be booked\n const FREE_SLOT_BORDER_COLOR = '#e4cd78';\n\n // Slot already booked by another user\n const UNAVAILABLE_SLOT_BORDER_COLOR = '#1d98ec';\n\n // Slot already booked by the current user\n const BOOKED_SLOT_BORDER_COLOR = '#b2e774';\n\n /* PUBLIC SCOPE */\n\n // bind the machine availabilities with full-Calendar events\n $scope.eventSources = [];\n\n // indicates the state of the current view : calendar or plans information\n $scope.plansAreShown = false;\n\n // will store the user's plan if he chose to buy one\n $scope.selectedPlan = null;\n\n // the moment when the plan selection changed for the last time, used to trigger changes in the cart\n $scope.planSelectionTime = null;\n\n // mapping of fullCalendar events.\n $scope.events = {\n reserved: [], // Slots that the user wants to book\n modifiable: null, // Slot that the user wants to change\n placable: null, // Destination slot for the change\n paid: [], // Slots that were just booked by the user (transaction ok)\n moved: null // Slots that were just moved by the user (change done) -> {newSlot:* oldSlot: *}\n };\n\n // the moment when the slot selection changed for the last time, used to trigger changes in the cart\n $scope.selectionTime = null;\n\n // the last clicked event in the calender\n $scope.selectedEvent = null;\n\n // the application global settings\n $scope.settings = settingsPromise;\n\n // list of plans, classified by group\n $scope.groups = groupsPromise;\n $scope.plans = plansPromise;\n $scope.plansClassifiedByGroup = [];\n for (let group of Array.from(groupsPromise)) {\n const groupObj = { id: group.id, name: group.name, plans: [] };\n for (let plan of Array.from(plansPromise)) {\n if (plan.group_id === group.id) { groupObj.plans.push(plan); }\n }\n $scope.plansClassifiedByGroup.push(groupObj);\n }\n\n // the user to deal with, ie. the current user for non-admins\n $scope.ctrl =\n { member: {} };\n\n // current machine to reserve\n $scope.machine = machinePromise;\n\n // fullCalendar (v2) configuration\n $scope.calendarConfig = CalendarConfig({\n minTime: moment.duration(moment(settingsPromise.booking_window_start).format('HH:mm:ss')),\n maxTime: moment.duration(moment(settingsPromise.booking_window_end).format('HH:mm:ss')),\n eventClick (event, jsEvent, view) {\n return calendarEventClickCb(event, jsEvent, view);\n },\n eventRender (event, element, view) {\n return eventRenderCb(event, element);\n }\n });\n\n // Global config: message to the end user concerning the subscriptions rules\n $scope.subscriptionExplicationsAlert = settingsPromise.subscription_explications_alert;\n\n // Global config: message to the end user concerning the machine bookings\n $scope.machineExplicationsAlert = settingsPromise.machine_explications_alert;\n\n /**\n * Change the last selected slot's appearance to looks like 'added to cart'\n */\n $scope.markSlotAsAdded = function () {\n $scope.selectedEvent.backgroundColor = FREE_SLOT_BORDER_COLOR;\n $scope.selectedEvent.title = _t('app.logged.machines_reserve.i_reserve');\n updateEvents($scope.selectedEvent);\n };\n\n /**\n * Change the last selected slot's appearance to looks like 'never added to cart'\n */\n $scope.markSlotAsRemoved = function (slot) {\n slot.backgroundColor = 'white';\n slot.borderColor = FREE_SLOT_BORDER_COLOR;\n slot.title = '';\n slot.isValid = false;\n slot.slot_id = null;\n slot.is_reserved = false;\n slot.can_modify = false;\n slot.offered = false;\n updateEvents(slot);\n };\n\n /**\n * Callback when a slot was successfully cancelled. Reset the slot style as 'ready to book'\n */\n $scope.slotCancelled = function () { $scope.markSlotAsRemoved($scope.selectedEvent); };\n\n /**\n * Change the last selected slot's appearance to looks like 'currently looking for a new destination to exchange'\n */\n $scope.markSlotAsModifying = function () {\n $scope.selectedEvent.backgroundColor = '#eee';\n $scope.selectedEvent.title = _t('app.logged.machines_reserve.i_change');\n updateEvents($scope.selectedEvent);\n };\n\n /**\n * Change the last selected slot's appearance to looks like 'the slot being exchanged will take this place'\n */\n $scope.changeModifyMachineSlot = function () {\n if ($scope.events.placable) {\n $scope.events.placable.backgroundColor = 'white';\n $scope.events.placable.title = '';\n updateEvents($scope.events.placable);\n }\n if (!$scope.events.placable || ($scope.events.placable._id !== $scope.selectedEvent._id)) {\n $scope.selectedEvent.backgroundColor = '#bbb';\n $scope.selectedEvent.title = _t('app.logged.machines_reserve.i_shift');\n updateEvents($scope.selectedEvent);\n }\n return true;\n };\n\n /**\n * When modifying an already booked reservation, callback when the modification was successfully done.\n */\n $scope.modifyMachineSlot = function () {\n const save = {\n slotId: $scope.events.modifiable.slot_id,\n borderColor: $scope.events.modifiable.borderColor,\n user: angular.copy($scope.events.modifiable.user),\n title: $scope.currentUser.id === $scope.events.modifiable.user.id ? _t('app.logged.machines_reserve.i_ve_reserved') : _t('app.logged.machines_reserve.not_available')\n };\n\n $scope.events.modifiable.backgroundColor = 'white';\n $scope.events.modifiable.title = '';\n $scope.events.modifiable.borderColor = FREE_SLOT_BORDER_COLOR;\n $scope.events.modifiable.slot_id = null;\n $scope.events.modifiable.is_reserved = false;\n $scope.events.modifiable.can_modify = false;\n updateEvents($scope.events.modifiable);\n\n $scope.events.placable.title = save.title;\n $scope.events.placable.backgroundColor = 'white';\n $scope.events.placable.borderColor = save.borderColor;\n $scope.events.placable.slot_id = save.slotId;\n $scope.events.placable.is_reserved = true;\n $scope.events.placable.can_modify = true;\n $scope.events.placable.user = angular.copy(save.user);\n updateEvents($scope.events.placable);\n\n refetchCalendar();\n };\n\n /**\n * Cancel the current booking modification, resetting the whole process\n */\n $scope.cancelModifyMachineSlot = function () {\n if ($scope.events.placable) {\n $scope.events.placable.backgroundColor = 'white';\n $scope.events.placable.title = '';\n }\n $scope.events.modifiable.title = $scope.currentUser.id === $scope.events.modifiable.user.id ? _t('app.logged.machines_reserve.i_ve_reserved') : _t('app.logged.machines_reserve.not_available');\n $scope.events.modifiable.backgroundColor = 'white';\n\n updateEvents($scope.events.placable, $scope.events.modifiable);\n };\n\n /**\n * Callback to deal with the reservations of the user selected in the dropdown list instead of the current user's\n * reservations. (admins only)\n */\n $scope.updateMember = function () {\n $scope.plansAreShown = false;\n $scope.selectedPlan = null;\n Member.get({ id: $scope.ctrl.member.id }, function (member) { $scope.ctrl.member = member; });\n };\n\n /**\n * Changes the user current view from the plan subscription screen to the machine reservation agenda\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.doNotSubscribePlan = function (e) {\n e.preventDefault();\n $scope.plansAreShown = false;\n $scope.selectPlan($scope.selectedPlan);\n return $scope.planSelectionTime = new Date();\n };\n\n /**\n * Switch the user's view from the reservation agenda to the plan subscription\n */\n $scope.showPlans = function () { $scope.plansAreShown = true; };\n\n /**\n * Add the provided plan to the current shopping cart\n * @param plan {Object} the plan to subscribe\n */\n $scope.selectPlan = function (plan) {\n setTimeout(() => {\n // toggle selected plan\n if ($scope.selectedPlan !== plan) {\n $scope.selectedPlan = plan;\n } else {\n $scope.selectedPlan = null;\n }\n $scope.planSelectionTime = new Date();\n $scope.$apply();\n }, 50);\n };\n\n /**\n * Check if the provided plan is currently selected\n * @param plan {Object} Resource plan\n */\n $scope.isSelected = function (plan) {\n return $scope.selectedPlan === plan;\n };\n\n /**\n * Once the reservation is booked (payment process successfully completed), change the event style\n * in fullCalendar, update the user's subscription and free-credits if needed\n * @param reservation {Object}\n */\n $scope.afterPayment = function (reservation) {\n angular.forEach($scope.events.reserved, function (machineSlot, key) {\n machineSlot.is_reserved = true;\n machineSlot.can_modify = true;\n if ($scope.currentUser.role === 'admin' || ($scope.currentUser.role === 'manager' && reservation.user_id !== $scope.currentUser.id)) {\n // an admin or a manager booked for someone else\n machineSlot.title = _t('app.logged.machines_reserve.not_available');\n machineSlot.borderColor = UNAVAILABLE_SLOT_BORDER_COLOR;\n updateMachineSlot(machineSlot, reservation, $scope.ctrl.member);\n } else {\n // booked for \"myself\"\n machineSlot.title = _t('app.logged.machines_reserve.i_ve_reserved');\n machineSlot.borderColor = BOOKED_SLOT_BORDER_COLOR;\n updateMachineSlot(machineSlot, reservation, $scope.currentUser);\n }\n machineSlot.backgroundColor = 'white';\n });\n\n if ($scope.selectedPlan) {\n $scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);\n if ($scope.ctrl.member.id === Auth._currentUser.id) {\n Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);\n }\n $scope.plansAreShown = false;\n $scope.selectedPlan = null;\n }\n\n refetchCalendar();\n };\n\n /**\n * To use as callback in Array.prototype.filter to get only enabled plans\n */\n $scope.filterDisabledPlans = function (plan) { return !plan.disabled; };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n $scope.eventSources.push({\n events: function (start, end, timezone, callback) {\n Availability.machine({ machineId: $stateParams.id }, function (availabilities) {\n callback(availabilities);\n });\n },\n textColor: 'black'\n });\n\n if ($scope.currentUser.role !== 'admin') {\n return Member.get({ id: $scope.currentUser.id }, function (member) { $scope.ctrl.member = member; });\n }\n };\n\n /**\n * Triggered when the user click on a reservation slot in the agenda.\n * Defines the behavior to adopt depending on the slot status (already booked, free, ready to be reserved ...),\n * the user's subscription (current or about to be took) and the time (the user cannot modify a booked reservation\n * if it's too late).\n */\n const calendarEventClickCb = function (event, jsEvent, view) {\n $scope.selectedEvent = event;\n return $scope.selectionTime = new Date();\n };\n\n /**\n * Triggered when fullCalendar tries to graphically render an event block.\n * Append the event tag into the block, just after the event title.\n * @see http://fullcalendar.io/docs/event_rendering/eventRender/\n */\n const eventRenderCb = function (event, element) {\n if (($scope.currentUser.role === 'admin') && (event.tags.length > 0)) {\n let html = '';\n for (let tag of Array.from(event.tags)) {\n html += `${tag.name}`;\n }\n element.find('.fc-time').append(html);\n }\n };\n\n /**\n * After payment, update the id of the newly reserved slot with the id returned by the server.\n * This will allow the user to modify the reservation he just booked. The associated user will also be registered\n * with the slot.\n * @param slot {Object}\n * @param reservation {Object}\n * @param user {Object} user associated with the slot\n */\n const updateMachineSlot = function (slot, reservation, user) {\n angular.forEach(reservation.slots, function (s) {\n if (slot.start.isSame(s.start_at)) {\n slot.slot_id = s.id;\n slot.user = user;\n }\n });\n updateEvents(slot);\n };\n\n /**\n * Update the calendar's display to render the new attributes of the events\n * @param events Object[] events to update in full-calendar\n */\n const updateEvents = function (...events) {\n const realEvents = events.filter(e => !_.isNil(e));\n uiCalendarConfig.calendars.calendar.fullCalendar('updateEvents', realEvents);\n };\n\n /**\n * Asynchronously fetch the events from the API and refresh the calendar's view with these new events\n */\n const refetchCalendar = function () {\n uiCalendarConfig.calendars.calendar.fullCalendar('refetchEvents');\n setTimeout(() => {\n uiCalendarConfig.calendars.calendar.fullCalendar('rerenderEvents');\n }, 200);\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n","/* eslint-disable\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/**\n * Navigation controller. List the links availables in the left navigation pane and their icon.\n */\nApplication.Controllers.controller('MainNavController', ['$scope', function ($scope) {\n // Common links (public application)\n $scope.navLinks = [\n {\n state: 'app.public.home',\n linkText: 'app.public.common.home',\n linkIcon: 'home',\n class: 'home-link'\n },\n { class: 'menu-spacer' },\n {\n state: 'app.public.calendar',\n linkText: 'app.public.common.public_calendar',\n linkIcon: 'calendar',\n class: 'public-calendar-link'\n },\n {\n state: 'app.public.machines_list',\n linkText: 'app.public.common.reserve_a_machine',\n linkIcon: 'cogs',\n class: 'reserve-machine-link'\n },\n {\n state: 'app.public.events_list',\n linkText: 'app.public.common.events_registrations',\n linkIcon: 'tags',\n class: 'reserve-event-link'\n },\n { class: 'menu-spacer' },\n {\n state: 'app.public.projects_list',\n linkText: 'app.public.common.projects_gallery',\n linkIcon: 'th',\n class: 'projects-gallery-link'\n },\n { class: 'menu-spacer' }\n\n ];\n\n if ($scope.$root.modules.plans) {\n $scope.navLinks.push({\n state: 'app.public.plans',\n linkText: 'app.public.common.subscriptions',\n linkIcon: 'credit-card',\n class: 'plans-link'\n });\n }\n\n if ($scope.$root.modules.trainings) {\n $scope.navLinks.splice(4, 0, {\n state: 'app.public.trainings_list',\n linkText: 'app.public.common.trainings_registrations',\n linkIcon: 'graduation-cap',\n class: 'reserve-training-link'\n });\n }\n\n if ($scope.$root.modules.spaces) {\n $scope.navLinks.splice(4, 0, {\n state: 'app.public.spaces_list',\n linkText: 'app.public.common.reserve_a_space',\n linkIcon: 'rocket',\n class: 'reserve-space-link'\n });\n }\n\n Fablab.adminNavLinks = Fablab.adminNavLinks || [];\n const adminNavLinks = [\n {\n state: 'app.admin.calendar',\n linkText: 'app.public.common.manage_the_calendar',\n linkIcon: 'calendar',\n authorizedRoles: ['admin', 'manager']\n },\n {\n state: 'app.public.machines_list',\n linkText: 'app.public.common.manage_the_machines',\n linkIcon: 'cogs',\n authorizedRoles: ['admin', 'manager']\n },\n {\n state: 'app.admin.events',\n linkText: 'app.public.common.manage_the_events',\n linkIcon: 'tags',\n authorizedRoles: ['admin', 'manager']\n },\n { class: 'menu-spacer' },\n {\n state: 'app.admin.members',\n linkText: 'app.public.common.manage_the_users',\n linkIcon: 'users',\n authorizedRoles: ['admin', 'manager']\n },\n {\n state: 'app.admin.pricing',\n linkText: 'app.public.common.subscriptions_and_prices',\n linkIcon: 'money',\n authorizedRoles: ['admin']\n },\n {\n state: 'app.admin.invoices',\n linkText: 'app.public.common.manage_the_invoices',\n linkIcon: 'file-pdf-o',\n authorizedRoles: ['admin', 'manager']\n },\n {\n class: 'menu-spacer',\n authorizedRoles: ['admin']\n },\n {\n state: 'app.admin.settings',\n linkText: 'app.public.common.customization',\n linkIcon: 'gear',\n authorizedRoles: ['admin']\n },\n {\n state: 'app.admin.projects',\n linkText: 'app.public.common.projects',\n linkIcon: 'tasks',\n authorizedRoles: ['admin']\n },\n {\n state: 'app.admin.open_api_clients',\n linkText: 'app.public.common.open_api_clients',\n linkIcon: 'cloud',\n authorizedRoles: ['admin']\n }\n ].concat(Fablab.adminNavLinks);\n\n $scope.adminNavLinks = adminNavLinks;\n\n if ($scope.$root.modules.trainings) {\n $scope.adminNavLinks.splice(3, 0, {\n state: 'app.admin.trainings',\n linkText: 'app.public.common.trainings_monitoring',\n linkIcon: 'graduation-cap',\n authorizedRoles: ['admin', 'manager']\n });\n }\n\n if ($scope.$root.modules.spaces) {\n $scope.adminNavLinks.splice(3, 0, {\n state: 'app.public.spaces_list',\n linkText: 'app.public.common.manage_the_spaces',\n linkIcon: 'rocket'\n });\n }\n\n if ($scope.$root.modules.statistics) {\n $scope.adminNavLinks.splice($scope.$root.modules.spaces ? 9 : 8, 0, {\n state: 'app.admin.statistics',\n linkText: 'app.public.common.statistics',\n linkIcon: 'bar-chart-o',\n authorizedRoles: ['admin']\n });\n }\n}\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/**\n * Controller used in the members listing page\n */\nApplication.Controllers.controller('MembersController', ['$scope', 'Member', 'membersPromise', function ($scope, Member, membersPromise) {\n /* PRIVATE STATIC CONSTANTS */\n\n // number of invoices loaded each time we click on 'load more...'\n const MEMBERS_PER_PAGE = 10;\n\n /* PUBLIC SCOPE */\n\n // currently displayed page of members\n $scope.page = 1;\n\n // members list\n $scope.members = membersPromise;\n\n // true when all members are loaded\n $scope.noMoreResults = false;\n\n /**\n * Callback for the 'load more' button.\n * Will load the next results of the current search, if any\n */\n $scope.showNextMembers = function () {\n $scope.page += 1;\n return Member.query({\n requested_attributes: '[profile]',\n page: $scope.page,\n size: MEMBERS_PER_PAGE\n }, function (members) {\n $scope.members = $scope.members.concat(members);\n\n if (!members[0] || (members[0].maxMembers <= $scope.members.length)) {\n return $scope.noMoreResults = true;\n }\n });\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n if (!membersPromise[0] || (membersPromise[0].maxMembers <= $scope.members.length)) {\n return $scope.noMoreResults = true;\n }\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n}\n\n]);\n\n/**\n * Controller used when editing the current user's profile (in dashboard)\n */\nApplication.Controllers.controller('EditProfileController', ['$scope', '$rootScope', '$state', '$window', '$sce', '$cookies', '$injector', 'Member', 'Auth', 'Session', 'activeProviderPromise', 'settingsPromise', 'growl', 'dialogs', 'CSRF', 'memberPromise', 'groups', '_t',\n function ($scope, $rootScope, $state, $window, $sce, $cookies, $injector, Member, Auth, Session, activeProviderPromise, settingsPromise, growl, dialogs, CSRF, memberPromise, groups, _t) {\n /* PUBLIC SCOPE */\n\n // API URL where the form will be posted\n $scope.actionUrl = `/api/members/${$scope.currentUser.id}`;\n\n // list of groups\n $scope.groups = groups.filter(g => !g.disabled);\n\n // Form action on the above URL\n $scope.method = 'patch';\n\n // Current user's profile\n $scope.user = memberPromise;\n\n // default : do not show the group changing form\n $scope.group =\n { change: false };\n\n // group ID of the current/selected user\n $scope.userGroup = memberPromise.group_id;\n\n // active authentication provider parameters\n $scope.activeProvider = activeProviderPromise;\n\n // allow the user to change his password except if he connect from an SSO\n $scope.preventPassword = false;\n\n // get the status of cookies acceptance\n $scope.cookiesStatus = $cookies.get('fab-manager-cookies-consent');\n\n // mapping of fields to disable\n $scope.preventField = {};\n\n // Should the passord be modified?\n $scope.password = { change: false };\n\n // is the phone number required in _member_form?\n $scope.phoneRequired = (settingsPromise.phone_required === 'true');\n\n // is the address required in _member_form?\n $scope.addressRequired = (settingsPromise.address_required === 'true');\n\n // Angular-Bootstrap datepicker configuration for birthday\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n // This boolean value will tell if the current user is the super-admin\n $scope.isSuperAdmin = memberPromise.id === Fablab.superadminId;\n\n /**\n * Return the group object, identified by the ID set in $scope.userGroup\n */\n $scope.getUserGroup = function () {\n for (const group of Array.from($scope.groups)) {\n if (group.id === $scope.userGroup) {\n return group;\n }\n }\n };\n\n /**\n * Change the group of the current user to the one set in $scope.userGroup\n */\n $scope.selectGroup = () =>\n Member.update({ id: $scope.user.id }, { user: { group_id: $scope.userGroup } }, function (user) {\n $scope.user = user;\n $rootScope.currentUser = user;\n Auth._currentUser.group_id = user.group_id;\n $scope.group.change = false;\n return growl.success(_t('app.logged.dashboard.settings.your_group_has_been_successfully_changed'));\n }\n , function (err) {\n growl.error(_t('app.logged.dashboard.settings.an_unexpected_error_prevented_your_group_from_being_changed'));\n return console.error(err);\n });\n\n /**\n * Callback to diplay the datepicker as a dropdown when clicking on the input field\n * @param $event {Object} jQuery event object\n */\n $scope.openDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n return $scope.datePicker.opened = true;\n };\n\n /**\n * For use with ngUpload (https://github.com/twilson63/ngUpload).\n * Intended to be the callback when the upload is done: any raised error will be stacked in the\n * $scope.alerts array. If everything goes fine, the user's profile is updated and the user is\n * redirected to the home page\n * @param content {Object} JSON - The upload's result\n */\n $scope.submited = function (content) {\n if ((content.id == null)) {\n $scope.alerts = [];\n return angular.forEach(content, (v, k) =>\n angular.forEach(v, err =>\n $scope.alerts.push({\n msg: k + ': ' + err,\n type: 'danger'\n })\n )\n );\n } else {\n $scope.currentUser.profile.user_avatar = content.profile.user_avatar;\n Auth._currentUser.profile.user_avatar = content.profile.user_avatar;\n $scope.currentUser.name = content.name;\n Auth._currentUser.name = content.name;\n $scope.currentUser = content;\n Auth._currentUser = content;\n $rootScope.currentUser = content;\n return $state.go('app.public.home');\n }\n };\n\n /**\n * Ask for confirmation then delete the current user's account\n * @param user {Object} the current user (to delete)\n */\n $scope.deleteUser = user =>\n dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.logged.dashboard.settings.confirmation_required'),\n msg: $sce.trustAsHtml(\n _t('app.logged.dashboard.settings.confirm_delete_your_account') + '
' +\n '' + _t('app.logged.dashboard.settings.all_data_will_be_lost') + '

' +\n _t('app.logged.dashboard.settings.invoicing_data_kept') + '
' +\n _t('app.logged.dashboard.settings.statistic_data_anonymized') + '
' +\n _t('app.logged.dashboard.settings.no_further_access_to_projects')\n )\n };\n }\n }\n }\n , () => // cancel confirmed\n Member.remove({ id: user.id }, () =>\n Auth.logout().then(function () {\n $state.go('app.public.home');\n return growl.success(_t('app.logged.dashboard.settings.your_user_account_has_been_successfully_deleted_goodbye'));\n })\n\n , function (error) {\n console.log(error);\n return growl.error(_t('app.logged.dashboard.settings.an_error_occured_preventing_your_account_from_being_deleted'));\n })\n );\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n\n /**\n * Check if the of the properties editable by the user are linked to the SSO\n * @return {boolean} true if some editable fields are mapped with the SSO, false otherwise\n */\n $scope.hasSsoFields = () =>\n // if check if keys > 1 because there's a minimum of 1 mapping (id <-> provider-uid)\n // so the user may want to edit his profile on the SSO if at least 2 mappings exists\n Object.keys($scope.preventField).length > 1;\n\n /**\n * Disconnect and re-connect the user to the SSO to force the synchronisation of the profile's data\n */\n $scope.syncProfile = () =>\n Auth.logout().then(function (oldUser) {\n Session.destroy();\n $rootScope.currentUser = null;\n $rootScope.toCheckNotifications = false;\n $scope.notifications = {\n total: 0,\n unread: 0\n };\n return $window.location.href = $scope.activeProvider.link_to_sso_connect;\n });\n\n /**\n * Destroy the cookie used to save the user's preference, this will trigger the choice popup again\n */\n $scope.resetCookies = function () {\n $cookies.remove('fab-manager-cookies-consent');\n $scope.cookiesStatus = undefined;\n $injector.get('$state').reload();\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n CSRF.setMetaTags();\n\n // init the birth date to JS object\n $scope.user.statistic_profile.birthday = moment($scope.user.statistic_profile.birthday).toDate();\n\n if ($scope.activeProvider.providable_type !== 'DatabaseProvider') {\n $scope.preventPassword = true;\n }\n // bind fields protection with sso fields\n return angular.forEach(activeProviderPromise.mapping, map => $scope.preventField[map] = true);\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used on the public user's profile page (seeing another user's profile)\n */\nApplication.Controllers.controller('ShowProfileController', ['$scope', 'memberPromise', 'SocialNetworks', function ($scope, memberPromise, SocialNetworks) {\n // Selected user's information\n $scope.user = memberPromise; // DEPENDENCY WITH NAVINUM GAMIFICATION PLUGIN !!!!\n\n // List of social networks associated with this user and toggle 'show all' state\n $scope.social = {\n showAllLinks: false,\n networks: SocialNetworks\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = () => $scope.social.networks = filterNetworks();\n\n /**\n * Filter social network or website that are associated with the profile of the user provided in promise\n * and return the filtered networks\n * @return {Array}\n */\n var filterNetworks = function () {\n const networks = [];\n for (const network of Array.from(SocialNetworks)) {\n if ($scope.user.profile[network] && ($scope.user.profile[network].length > 0)) {\n networks.push(network);\n }\n }\n return networks;\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n}\n\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n no-unused-vars,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/**\n * Controller used in notifications page\n * inherits $scope.$parent.notifications (global notifications state) from ApplicationController\n */\nApplication.Controllers.controller('NotificationsController', ['$scope', 'Notification', function ($scope, Notification) {\n /* PUBLIC SCOPE */\n\n // Array containg the archived notifications (already read)\n $scope.notificationsRead = [];\n\n // Array containg the new notifications (not read)\n $scope.notificationsUnread = [];\n\n // Total number of notifications for the current user\n $scope.total = 0;\n\n // Total number of unread notifications for the current user\n $scope.totalUnread = 0;\n\n // By default, the pagination mode is activated to limit the page size\n $scope.paginateActive = true;\n\n // The currently displayed page number\n $scope.page = 1;\n\n /**\n * Mark the provided notification as read, updating its status on the server and moving it\n * to the already read notifications list.\n * @param notification {{id:number}} the notification to mark as read\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.markAsRead = function (notification, e) {\n e.preventDefault();\n return Notification.update({ id: notification.id }, {\n id: notification.id,\n is_read: true\n }\n , function (updatedNotif) {\n // remove notif from unreads\n const index = $scope.notificationsUnread.indexOf(notification);\n $scope.notificationsUnread.splice(index, 1);\n // add update notif to read\n $scope.notificationsRead.push(updatedNotif);\n // update counters\n $scope.$parent.notifications.unread -= 1;\n return $scope.totalUnread -= 1;\n });\n };\n\n /**\n * Mark every unread notifications as read and move them for the unread list to to read array.\n */\n $scope.markAllAsRead = () =>\n Notification.update({}\n , function () { // success\n // add notifs to read\n angular.forEach($scope.notificationsUnread, function (n) {\n n.is_read = true;\n return $scope.notificationsRead.push(n);\n });\n // clear unread\n $scope.notificationsUnread = [];\n // update counters\n $scope.$parent.notifications.unread = 0;\n return $scope.totalUnread = 0;\n });\n\n /**\n * Request the server to retrieve the next notifications and add them\n * to their corresponding notifications list (read or unread).\n */\n $scope.addMoreNotifications = function () {\n Notification.query({ page: $scope.page }, function (notifications) {\n $scope.total = notifications.totals.total;\n $scope.totalUnread = notifications.totals.unread;\n angular.forEach(notifications.notifications, function (notif) {\n if (notif.is_read) {\n return $scope.notificationsRead.push(notif);\n } else {\n return $scope.notificationsUnread.push(notif);\n }\n });\n return $scope.paginateActive = (notifications.totals.total > ($scope.notificationsRead.length + $scope.notificationsUnread.length));\n });\n\n return $scope.page += 1;\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = () => $scope.addMoreNotifications();\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n}\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\nApplication.Controllers.controller('PlansIndexController', ['$scope', '$rootScope', '$state', '$uibModal', 'Auth', 'AuthService', 'dialogs', 'growl', 'plansPromise', 'groupsPromise', 'Subscription', 'Member', 'subscriptionExplicationsPromise', '_t', 'Wallet', 'helpers', 'settingsPromise', 'Price',\n function ($scope, $rootScope, $state, $uibModal, Auth, AuthService, dialogs, growl, plansPromise, groupsPromise, Subscription, Member, subscriptionExplicationsPromise, _t, Wallet, helpers, settingsPromise, Price) {\n /* PUBLIC SCOPE */\n\n // list of groups\n $scope.groups = groupsPromise.filter(function (g) { return (g.slug !== 'admins') & !g.disabled; });\n\n // default : do not show the group changing form\n // group ID of the current/selected user\n $scope.group = {\n change: false,\n id: null\n };\n\n // list of plans, classified by group\n $scope.plansClassifiedByGroup = [];\n\n // user to deal with\n $scope.ctrl = {\n member: null,\n member_id: null\n };\n\n // already subscribed plan of the current user\n $scope.paid =\n { plan: null };\n\n // plan to subscribe (shopping cart)\n $scope.selectedPlan = null;\n\n // the moment when the plan selection changed for the last time, used to trigger changes in the cart\n $scope.planSelectionTime = null;\n\n // the application global settings\n $scope.settings = settingsPromise;\n\n // Discount coupon to apply to the basket, if any\n $scope.coupon =\n { applied: null };\n\n // text that appears in the bottom-right box of the page (subscriptions rules details)\n $scope.subscriptionExplicationsAlert = subscriptionExplicationsPromise.setting.value;\n\n /**\n * Callback to deal with the subscription of the user selected in the dropdown list instead of the current user's\n * subscription. (admins and managers only)\n */\n $scope.updateMember = function () {\n $scope.selectedPlan = null;\n $scope.paid.plan = null;\n $scope.group.change = false;\n Member.get({ id: $scope.ctrl.member.id }, function (member) {\n $scope.ctrl.member = member;\n $scope.group.id = $scope.ctrl.member.group_id;\n });\n };\n\n /**\n * Add the provided plan to the shopping basket\n * @param plan {Object} The plan to subscribe to\n */\n $scope.selectPlan = function (plan) {\n setTimeout(() => {\n if ($scope.isAuthenticated()) {\n if ($scope.selectedPlan !== plan) {\n $scope.selectedPlan = plan;\n $scope.planSelectionTime = new Date();\n } else {\n $scope.selectedPlan = null;\n }\n } else {\n $scope.login();\n }\n $scope.$apply();\n }, 50);\n };\n\n /**\n * Check if the provided plan is currently selected\n * @param plan {Object} Resource plan\n */\n $scope.isSelected = function (plan) {\n return $scope.selectedPlan === plan;\n };\n\n /**\n * Return the group object, identified by the ID set in $scope.group.id\n */\n $scope.getUserGroup = function () {\n for (const group of Array.from($scope.groups)) {\n if (group.id === $scope.group.id) {\n return group;\n }\n }\n };\n\n /**\n * Change the group of the current/selected user to the one set in $scope.group.id\n */\n $scope.selectGroup = function () {\n Member.update({ id: $scope.ctrl.member.id }, { user: { group_id: $scope.group.id } }, function (user) {\n $scope.ctrl.member = user;\n $scope.group.change = false;\n $scope.selectedPlan = null;\n if (AuthService.isAuthorized('member') ||\n (AuthService.isAuthorized('manager') && $scope.currentUser.id !== $scope.ctrl.member.id)) {\n $rootScope.currentUser = user;\n Auth._currentUser.group_id = user.group_id;\n growl.success(_t('app.public.plans.your_group_was_successfully_changed'));\n } else {\n growl.success(_t('app.public.plans.the_user_s_group_was_successfully_changed'));\n }\n }\n , function (err) {\n if (AuthService.isAuthorized('member') ||\n (AuthService.isAuthorized('manager') && $scope.currentUser.id !== $scope.ctrl.member.id)) {\n growl.error(_t('app.public.plans.an_error_prevented_your_group_from_being_changed'));\n } else {\n growl.error(_t('app.public.plans.an_error_prevented_to_change_the_user_s_group'));\n }\n console.error(err);\n });\n };\n\n /**\n * Return an enumerable meaninful string for the gender of the provider user\n * @param user {Object} Database user record\n * @return {string} 'male' or 'female'\n */\n $scope.getGender = function (user) {\n if (user && user.statistic_profile) {\n if (user.statistic_profile.gender === 'true') { return 'male'; } else { return 'female'; }\n } else { return 'other'; }\n };\n\n /**\n * Test if the provided date is in the future\n * @param dateTime {Date}\n * @return {boolean}\n */\n $scope.isInFuture = function (dateTime) {\n return (moment().diff(moment(dateTime)) < 0);\n };\n\n /**\n * To use as callback in Array.prototype.filter to get only enabled plans\n */\n $scope.filterDisabledPlans = function (plan) { return !plan.disabled; };\n\n /**\n * Once the subscription has been confirmed (payment process successfully completed), mark the plan as subscribed,\n * and update the user's subscription\n */\n $scope.afterPayment = function () {\n $scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);\n if ($scope.ctrl.member.id === Auth._currentUser.id) {\n Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);\n }\n $scope.paid.plan = angular.copy($scope.selectedPlan);\n $scope.selectedPlan = null;\n $scope.coupon.applied = null;\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n // group all plans by Group\n for (const group of $scope.groups) {\n const groupObj = { id: group.id, name: group.name, plans: [], actives: 0 };\n for (const plan of plansPromise) {\n if (plan.group_id === group.id) {\n groupObj.plans.push(plan);\n if (!plan.disabled) { groupObj.actives++; }\n }\n }\n $scope.plansClassifiedByGroup.push(groupObj);\n }\n\n if ($scope.currentUser) {\n if (!AuthService.isAuthorized('admin')) {\n $scope.ctrl.member = $scope.currentUser;\n $scope.paid.plan = $scope.currentUser.subscribed_plan;\n $scope.group.id = $scope.currentUser.group_id;\n }\n }\n\n $scope.$on('devise:new-session', function (event, user) { if (user.role !== 'admin') { $scope.ctrl.member = user; } });\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n","'use strict';\n\nApplication.Controllers.controller('PrivacyController', ['$scope', 'Setting', function ($scope, Setting) {\n /* PUBLIC SCOPE */\n\n Setting.get({ name: 'privacy_body' }, data => { $scope.privacyBody = data.setting; });\n\n Setting.get({ name: 'privacy_dpo' }, data => { $scope.privacyDpo = data.setting; });\n}\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\n'use strict';\n\nApplication.Controllers.controller('CompleteProfileController', ['$scope', '$rootScope', '$state', '$window', '_t', 'growl', 'CSRF', 'Auth', 'Member', 'settingsPromise', 'activeProviderPromise', 'groupsPromise', 'cguFile', 'memberPromise', 'Session', 'dialogs', 'AuthProvider',\n function ($scope, $rootScope, $state, $window, _t, growl, CSRF, Auth, Member, settingsPromise, activeProviderPromise, groupsPromise, cguFile, memberPromise, Session, dialogs, AuthProvider) {\n /* PUBLIC SCOPE */\n\n // API URL where the form will be posted\n $scope.actionUrl = `/api/members/${memberPromise.id}`;\n\n // Form action on the above URL\n $scope.method = 'patch';\n\n // genre of the application name (eg. \"_le_ Fablab\" or \"_la_ Fabrique\")\n $scope.nameGenre = settingsPromise.name_genre;\n\n // name of the current fablab application (eg. \"Fablab de la Casemate\")\n $scope.fablabName = settingsPromise.fablab_name;\n\n // information from the current SSO provider\n $scope.activeProvider = activeProviderPromise;\n\n // list of user's groups (student/standard/...)\n $scope.groups = groupsPromise;\n\n // current user, contains information retrieved from the SSO\n $scope.user = memberPromise;\n\n // disallow the user to change his password as he connect from SSO\n $scope.preventPassword = true;\n\n // mapping of fields to disable\n $scope.preventField = {};\n\n // CGU\n $scope.cgu = cguFile.custom_asset;\n\n // is the phone number required in _member_form?\n $scope.phoneRequired = (settingsPromise.phone_required === 'true');\n\n // is the address required in _member_form?\n $scope.addressRequired = (settingsPromise.address_required === 'true');\n\n // Angular-Bootstrap datepicker configuration for birthday\n $scope.datePicker = {\n format: Fablab.uibDateFormat,\n opened: false, // default: datePicker is not shown\n options: {\n startingDay: Fablab.weekStartingDay\n }\n };\n\n /**\n * Callback to diplay the datepicker as a dropdown when clicking on the input field\n * @param $event {Object} jQuery event object\n */\n $scope.openDatePicker = function ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n return $scope.datePicker.opened = true;\n };\n\n /**\n * For use with ngUpload (https://github.com/twilson63/ngUpload).\n * Intended to be the callback when the upload is done: any raised error will be stacked in the\n * $scope.alerts array. If everything goes fine, the user's profile is updated and the user is\n * redirected to the home page\n * @param content {Object} JSON - The upload's result\n */\n $scope.submited = function (content) {\n if ((content.id == null)) {\n $scope.alerts = [];\n angular.forEach(content, function (v, k) {\n angular.forEach(v, function (err) {\n $scope.alerts.push({\n msg: k + ': ' + err,\n type: 'danger'\n });\n });\n });\n } else {\n $scope.user.profile.user_avatar = content.profile.user_avatar;\n Auth._currentUser.profile.user_avatar = content.profile.user_avatar;\n $scope.user.name = content.name;\n Auth._currentUser.name = content.name;\n $scope.user = content;\n Auth._currentUser = content;\n $rootScope.currentUser = content;\n return $state.go('app.public.home');\n }\n };\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n\n /**\n * Merge the current user into the account with the given auth_token\n */\n $scope.registerAuthToken = function () {\n Member.merge({ id: $rootScope.currentUser.id }, { user: { auth_token: $scope.user.auth_token } }, function (user) {\n $scope.user = user;\n Auth._currentUser = user;\n $rootScope.currentUser = user;\n $state.go('app.public.home');\n }\n , function (err) {\n if (err.data.error) {\n growl.error(err.data.error);\n } else {\n growl.error(_t('app.logged.profile_completion.an_unexpected_error_occurred_check_your_authentication_code'));\n console.error(err);\n }\n });\n };\n\n /**\n * Return the email given by the SSO provider, parsed if needed\n * @return {String} E-mail of the current user\n */\n $scope.ssoEmail = function () {\n const { email } = memberPromise;\n if (email) {\n const duplicate = email.match(/^<([^>]+)>.{20}-duplicate$/);\n if (duplicate) {\n return duplicate[1];\n }\n }\n return email;\n };\n\n /**\n * Test if the user's mail is marked as duplicate\n * @return {boolean}\n */\n $scope.hasDuplicate = function () {\n const { email } = memberPromise;\n if (email) {\n return !(email.match(/^<([^>]+)>.{20}-duplicate$/) === null);\n }\n };\n\n /**\n * Ask for email confirmation and send the SSO merging token again\n * @param event {Object} jQuery event object\n */\n $scope.resendCode = function (event) {\n event.preventDefault();\n event.stopPropagation();\n dialogs.confirm(\n {\n templateUrl: '/profile/resend_code_modal.html',\n resolve: {\n object () {\n return { email: memberPromise.email };\n }\n }\n },\n function (email) {\n // Request the server to send an auth-migration email to the current user\n AuthProvider.send_code({ email },\n function (res) { growl.info(_t('app.logged.profile_completion.code_successfully_sent_again')); },\n function (err) { growl.error(err.data.error); }\n );\n }\n );\n };\n\n /**\n * Disconnect and re-connect the user to the SSO to force the synchronisation of the profile's data\n */\n $scope.syncProfile = function () {\n Auth.logout().then(function (oldUser) {\n Session.destroy();\n $rootScope.currentUser = null;\n $rootScope.toCheckNotifications = false;\n $scope.notifications = {\n total: 0,\n unread: 0\n };\n $window.location.href = activeProviderPromise.link_to_sso_connect;\n });\n };\n\n /**\n * Hide the new account messages.\n * If hidden, the page will be used only to complete the current user's profile.\n */\n $scope.hideNewAccountConfirmation = function () {\n return !$scope.activeProvider.previous_provider || $scope.activeProvider.previous_provider.id === $scope.activeProvider.id;\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n CSRF.setMetaTags();\n\n // init the birth date to JS object\n $scope.user.statistic_profile.birthday = $scope.user.statistic_profile.birthday ? moment($scope.user.statistic_profile.birthday).toDate() : undefined;\n\n // bind fields protection with sso fields\n angular.forEach(activeProviderPromise.mapping, function (map) { $scope.preventField[map] = true; });\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n\n]);\n","/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/* COMMON CODE */\n\n/**\n * Provides a set of common properties and methods to the $scope parameter. They are used\n * in the various projects' admin controllers.\n *\n * Provides :\n * - $scope.totalSteps\n * - $scope.machines = [{Machine}]\n * - $scope.components = [{Component}]\n * - $scope.themes = [{Theme}]\n * - $scope.licences = [{Licence}]\n * - $scope.allowedExtensions = [{String}]\n * - $scope.submited(content)\n * - $scope.cancel()\n * - $scope.addFile()\n * - $scope.deleteFile(file)\n * - $scope.addStep()\n * - $scope.deleteStep(step)\n * - $scope.changeStepIndex(step, newIdx)\n *\n * Requires :\n * - $scope.project.project_caos_attributes = []\n * - $scope.project.project_steps_attributes = []\n * - $state (Ui-Router) [ 'app.public.projects_show', 'app.public.projects_list' ]\n */\nclass ProjectsController {\n constructor ($scope, $state, Project, Machine, Member, Component, Theme, Licence, $document, Diacritics, dialogs, allowedExtensions, _t) {\n // Retrieve the list of machines from the server\n Machine.query().$promise.then(function (data) {\n $scope.machines = data.map(function (d) {\n return ({\n id: d.id,\n name: d.name\n });\n });\n });\n\n // Retrieve the list of components from the server\n Component.query().$promise.then(function (data) {\n $scope.components = data.map(function (d) {\n return ({\n id: d.id,\n name: d.name\n });\n });\n });\n\n // Retrieve the list of themes from the server\n Theme.query().$promise.then(function (data) {\n $scope.themes = data.map(function (d) {\n return ({\n id: d.id,\n name: d.name\n });\n });\n });\n\n // Retrieve the list of licences from the server\n Licence.query().$promise.then(function (data) {\n $scope.licences = data.map(function (d) {\n return ({\n id: d.id,\n name: d.name\n });\n });\n });\n\n // Total number of documentation steps for the current project\n $scope.totalSteps = $scope.project.project_steps_attributes.length;\n\n // List of extensions allowed for CAD attachements upload\n $scope.allowedExtensions = allowedExtensions.setting.value.split(' ');\n\n /**\n * For use with ngUpload (https://github.com/twilson63/ngUpload).\n * Intended to be the callback when an upload is done: any raised error will be stacked in the\n * $scope.alerts array. If everything goes fine, the user is redirected to the project page.\n * @param content {Object} JSON - The upload's result\n */\n $scope.submited = function (content) {\n if ((content.id == null)) {\n $scope.alerts = [];\n angular.forEach(content, function (v, k) {\n angular.forEach(v, function (err) {\n $scope.alerts.push({\n msg: k + ': ' + err,\n type: 'danger'\n });\n });\n });\n // using https://github.com/oblador/angular-scroll\n $('section[ui-view=main]').scrollTop(0, 200);\n } else {\n return $state.go('app.public.projects_show', { id: content.slug });\n }\n };\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n\n /**\n * This will create a single new empty entry into the project's CAO attachements list.\n */\n $scope.addFile = function () { $scope.project.project_caos_attributes.push({}); };\n\n /**\n * This will remove the given file from the project's CAO attachements list. If the file was previously uploaded\n * to the server, it will be marked for deletion on the server. Otherwise, it will be simply truncated from\n * the CAO attachements array.\n * @param file {Object} the file to delete\n */\n $scope.deleteFile = function (file) {\n const index = $scope.project.project_caos_attributes.indexOf(file);\n if (file.id != null) {\n return file._destroy = true;\n } else {\n return $scope.project.project_caos_attributes.splice(index, 1);\n }\n };\n\n /**\n * This will create a single new empty entry into the project's steps list.\n */\n $scope.addStep = function () {\n $scope.totalSteps += 1;\n return $scope.project.project_steps_attributes.push({ step_nb: $scope.totalSteps, project_step_images_attributes: [] });\n };\n\n /**\n * This will remove the given step from the project's steps list. If the step was previously saved\n * on the server, it will be marked for deletion for the next saving. Otherwise, it will be simply truncated from\n * the steps array.\n * @param step {Object} the step to delete\n */\n $scope.deleteStep = function (step) {\n dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.shared.project.confirmation_required'),\n msg: _t('app.shared.project.do_you_really_want_to_delete_this_step')\n };\n }\n }\n }\n , function () { // deletion confirmed\n const index = $scope.project.project_steps_attributes.indexOf(step);\n if (step.id != null) {\n step._destroy = true;\n } else {\n $scope.project.project_steps_attributes.splice(index, 1);\n }\n\n // update the new total number of steps\n $scope.totalSteps -= 1;\n // reindex the remaining steps\n return (function () {\n const result = [];\n for (let s of Array.from($scope.project.project_steps_attributes)) {\n if (s.step_nb > step.step_nb) {\n result.push(s.step_nb -= 1);\n } else {\n result.push(undefined);\n }\n }\n return result;\n })();\n });\n };\n\n /**\n * Change the step_nb property of the given step to the new value provided. The step that was previously at this\n * index will be assigned to the old position of the provided step.\n * @param event {Object} see https://docs.angularjs.org/guide/expression#-event-\n * @param step {Object} the project's step to reindex\n * @param newIdx {number} the new index to assign to the step\n */\n $scope.changeStepIndex = function (event, step, newIdx) {\n if (event) { event.preventDefault(); }\n for (let s of Array.from($scope.project.project_steps_attributes)) {\n if (s.step_nb === newIdx) {\n s.step_nb = step.step_nb;\n step.step_nb = newIdx;\n break;\n }\n }\n return false;\n };\n\n /**\n * This function will query the API to autocomplete the typed user's name\n * @param nameLookup {string}\n */\n $scope.autoCompleteName = function (nameLookup) {\n if (!nameLookup) {\n return;\n }\n const asciiName = Diacritics.remove(nameLookup);\n\n Member.search(\n { query: asciiName },\n function (users) { $scope.matchingMembers = users; },\n function (error) { console.error(error); }\n );\n };\n\n /**\n * This will create a single new empty entry into the project's step image list.\n */\n $scope.addProjectStepImage = function (step) { step.project_step_images_attributes.push({}); };\n\n /**\n * This will remove the given image from the project's step image list.\n * @param step {Object} the project step has images\n * @param image {Object} the image to delete\n */\n $scope.deleteProjectStepImage = function (step, image) {\n const index = step.project_step_images_attributes.indexOf(image);\n if (image.id != null) {\n return image._destroy = true;\n } else {\n return step.project_step_images_attributes.splice(index, 1);\n }\n };\n\n /**\n * Returns the text to display on the save button, depending on the current state of the project\n */\n $scope.saveButtonValue = function () {\n if (!$scope.project.state || $scope.project.state === 'draft') {\n return _t('app.shared.project.save_as_draft');\n }\n return _t('app.shared.buttons.save');\n }\n }\n}\n\n/**\n * Controller used on projects listing page\n */\nApplication.Controllers.controller('ProjectsController', ['$scope', '$state', 'Project', 'machinesPromise', 'themesPromise', 'componentsPromise', 'paginationService', 'OpenlabProject', '$window', 'growl', '_t', '$location', '$timeout', 'settingsPromise', 'openLabActive',\n function ($scope, $state, Project, machinesPromise, themesPromise, componentsPromise, paginationService, OpenlabProject, $window, growl, _t, $location, $timeout, settingsPromise, openLabActive) {\n /* PRIVATE STATIC CONSTANTS */\n\n // Number of projects added to the page when the user clicks on 'load more projects'\n // -- dependency in app/models/project.rb\n const PROJECTS_PER_PAGE = 16;\n\n /* PUBLIC SCOPE */\n\n // Fab-manager's instance ID in the openLab network\n $scope.openlabAppId = settingsPromise.openlab_app_id\n\n // Is openLab enabled on the instance?\n $scope.openlab = {\n projectsActive: openLabActive.isPresent,\n searchOverWholeNetwork: false\n };\n\n // default search parameters\n $scope.search = {\n q: ($location.$$search.q || ''),\n from: ($location.$$search.from || undefined),\n machine_id: (parseInt($location.$$search.machine_id) || undefined),\n component_id: (parseInt($location.$$search.component_id) || undefined),\n theme_id: (parseInt($location.$$search.theme_id) || undefined)\n };\n\n // list of projects to display\n $scope.projects = [];\n\n // list of machines / used for filtering\n $scope.machines = machinesPromise;\n\n // list of themes / used for filtering\n $scope.themes = themesPromise;\n\n // list of components / used for filtering\n $scope.components = componentsPromise;\n\n /**\n * Callback triggered when the button \"search from the whole network\" is toggled\n */\n $scope.searchOverWholeNetworkChanged = function () {\n $scope.resetFiltersAndTriggerSearch();\n };\n\n /**\n * Callback to load the next projects of the result set, for the current search\n */\n $scope.loadMore = function () {\n if ($scope.openlab.searchOverWholeNetwork === true) {\n return $scope.projectsPagination.loadMore({ q: $scope.search.q });\n } else {\n return $scope.projectsPagination.loadMore({ search: $scope.search });\n }\n };\n\n /**\n * Reinitialize the search filters (used by the projects from the instance DB) and trigger a new search query\n */\n $scope.resetFiltersAndTriggerSearch = function () {\n $scope.search.q = '';\n $scope.search.from = undefined;\n $scope.search.machine_id = undefined;\n $scope.search.component_id = undefined;\n $scope.search.theme_id = undefined;\n $scope.setUrlQueryParams($scope.search);\n $scope.triggerSearch();\n };\n\n /**\n * Query the list of projects. Depending on $scope.openlab.searchOverWholeNetwork, the resulting list\n * will be fetched from OpenLab or from the instance DB\n */\n $scope.triggerSearch = function () {\n const currentPage = parseInt($location.$$search.page) || 1;\n if ($scope.openlab.searchOverWholeNetwork === true) {\n updateUrlParam('whole_network', 't');\n $scope.projectsPagination = new paginationService.Instance(OpenlabProject, currentPage, PROJECTS_PER_PAGE, null, { }, loadMoreOpenlabCallback);\n OpenlabProject.query({ q: $scope.search.q, page: currentPage, per_page: PROJECTS_PER_PAGE }, function (projectsPromise) {\n if (projectsPromise.errors) {\n growl.error(_t('app.public.projects_list.openlab_search_not_available_at_the_moment'));\n $scope.openlab.searchOverWholeNetwork = false;\n $scope.triggerSearch();\n } else {\n $scope.projectsPagination.totalCount = projectsPromise.meta.total;\n $scope.projects = normalizeProjectsAttrs(projectsPromise.projects);\n }\n });\n } else {\n updateUrlParam('whole_network', 'f');\n $scope.projectsPagination = new paginationService.Instance(Project, currentPage, PROJECTS_PER_PAGE, null, { }, loadMoreCallback, 'search');\n Project.search({ search: $scope.search, page: currentPage, per_page: PROJECTS_PER_PAGE }, function (projectsPromise) {\n $scope.projectsPagination.totalCount = projectsPromise.meta.total;\n $scope.projects = projectsPromise.projects;\n });\n }\n };\n\n /**\n * Callback to switch the user's view to the detailed project page\n * @param project {{slug:string}} The project to display\n */\n $scope.showProject = function (project) {\n if (($scope.openlab.searchOverWholeNetwork === true) && (project.app_id !== Fablab.openlabAppId)) {\n $window.open(project.project_url, '_blank');\n return true;\n } else {\n return $state.go('app.public.projects_show', { id: project.slug });\n }\n };\n\n /**\n * function to set all url query search parameters from search object\n */\n $scope.setUrlQueryParams = function (search) {\n updateUrlParam('page', 1);\n updateUrlParam('q', search.q);\n updateUrlParam('from', search.from);\n updateUrlParam('theme_id', search.theme_id);\n updateUrlParam('component_id', search.component_id);\n updateUrlParam('machine_id', search.machine_id);\n return true;\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n if ($location.$$search.whole_network === 'f') {\n $scope.openlab.searchOverWholeNetwork = false;\n } else {\n $scope.openlab.searchOverWholeNetwork = ($scope.openlab.projectsActive && settingsPromise.openlab_default === 'true') || false;\n }\n return $scope.triggerSearch();\n };\n\n /**\n * function to update url query param, little hack to turn off reloadOnSearch and re-enable it after we set the params.\n * params example: 'q' , 'presse-purée'\n */\n const updateUrlParam = function (name, value) {\n $state.current.reloadOnSearch = false;\n $location.search(name, value);\n $timeout(function () { $state.current.reloadOnSearch = undefined; });\n };\n\n /**\n * Callback triggered when the next projects were loaded from the result set (from the instance DB)\n * @param projectsPromise {{projects: []}}\n */\n const loadMoreCallback = function (projectsPromise) {\n $scope.projects = $scope.projects.concat(projectsPromise.projects);\n updateUrlParam('page', $scope.projectsPagination.currentPage);\n };\n\n /**\n * Callback triggered when the next projects were loaded from the result set (from OpenLab)\n * @param projectsPromise {{projects: []}}\n */\n const loadMoreOpenlabCallback = function (projectsPromise) {\n $scope.projects = $scope.projects.concat(normalizeProjectsAttrs(projectsPromise.projects));\n updateUrlParam('page', $scope.projectsPagination.currentPage);\n };\n\n const normalizeProjectsAttrs = function (projects) {\n return projects.map(function (project) {\n project.project_image = project.image_url;\n return project;\n });\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the project creation page\n */\nApplication.Controllers.controller('NewProjectController', ['$scope', '$state', 'Project', 'Machine', 'Member', 'Component', 'Theme', 'Licence', '$document', 'CSRF', 'Diacritics', 'dialogs', 'allowedExtensions', '_t',\n function ($scope, $state, Project, Machine, Member, Component, Theme, Licence, $document, CSRF, Diacritics, dialogs, allowedExtensions, _t) {\n CSRF.setMetaTags();\n\n // API URL where the form will be posted\n $scope.actionUrl = '/api/projects/';\n\n // Form action on the above URL\n $scope.method = 'post';\n\n // Default project parameters\n $scope.project = {\n project_steps_attributes: [],\n project_caos_attributes: []\n };\n\n $scope.matchingMembers = [];\n\n // Using the ProjectsController\n return new ProjectsController($scope, $state, Project, Machine, Member, Component, Theme, Licence, $document, Diacritics, dialogs, allowedExtensions, _t);\n }\n]);\n\n/**\n * Controller used in the project edition page\n */\nApplication.Controllers.controller('EditProjectController', ['$rootScope', '$scope', '$state', '$stateParams', 'Project', 'Machine', 'Member', 'Component', 'Theme', 'Licence', '$document', 'CSRF', 'projectPromise', 'Diacritics', 'dialogs', 'allowedExtensions', '_t',\n function ($rootScope, $scope, $state, $stateParams, Project, Machine, Member, Component, Theme, Licence, $document, CSRF, projectPromise, Diacritics, dialogs, allowedExtensions, _t) {\n /* PUBLIC SCOPE */\n\n // API URL where the form will be posted\n $scope.actionUrl = `/api/projects/${$stateParams.id}`;\n\n // Form action on the above URL\n $scope.method = 'put';\n\n // Retrieve the project's details, if an error occurred, redirect the user to the projects list page\n $scope.project = projectPromise;\n\n $scope.matchingMembers = $scope.project.project_users.map(function (u) {\n return ({\n id: u.id,\n name: u.full_name\n });\n });\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n CSRF.setMetaTags();\n\n if ($scope.project.author_id !== $rootScope.currentUser.id && $scope.project.user_ids.indexOf($rootScope.currentUser.id) === -1 && $scope.currentUser.role !== 'admin') {\n $state.go('app.public.projects_show', { id: $scope.project.slug });\n console.error('[EditProjectController::initialize] user is not allowed')\n }\n\n // Using the ProjectsController\n return new ProjectsController($scope, $state, Project, Machine, Member, Component, Theme, Licence, $document, Diacritics, dialogs, allowedExtensions, _t);\n }\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the public project's details page\n */\nApplication.Controllers.controller('ShowProjectController', ['$scope', '$state', 'projectPromise', 'shortnamePromise', '$location', '$uibModal', 'dialogs', '_t',\n function ($scope, $state, projectPromise, shortnamePromise, $location, $uibModal, dialogs, _t) {\n /* PUBLIC SCOPE */\n\n // Store the project's details\n $scope.project = projectPromise;\n $scope.projectUrl = $location.absUrl();\n $scope.disqusShortname = shortnamePromise.setting.value;\n\n /**\n * Test if the provided user has the edition rights on the current project\n * @param [user] {{id:number}} (optional) the user to check rights\n * @returns boolean\n */\n $scope.projectEditableBy = function (user) {\n if ((user == null)) { return false; }\n if ($scope.project.author_id === user.id) { return true; }\n let canEdit = false;\n angular.forEach($scope.project.project_users, function (u) {\n if ((u.id === user.id) && u.is_valid) { return canEdit = true; }\n });\n return canEdit;\n };\n\n /**\n * Test if the provided user has the deletion rights on the current project\n * @param [user] {{id:number}} (optional) the user to check rights\n * @returns boolean\n */\n $scope.projectDeletableBy = function (user) {\n if ((user == null)) { return false; }\n if ($scope.project.author_id === user.id) { return true; }\n };\n\n /**\n * Callback to delete the current project. Then, the user is redirected to the projects list page,\n * which is refreshed. Admins and project owner only are allowed to delete a project\n */\n $scope.deleteProject = function () {\n // check the permissions\n if (($scope.currentUser.role === 'admin') || $scope.projectDeletableBy($scope.currentUser)) {\n // delete the project then refresh the projects list\n return dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.public.projects_show.confirmation_required'),\n msg: _t('app.public.projects_show.do_you_really_want_to_delete_this_project')\n };\n }\n }\n }\n , function () { // cancel confirmed\n $scope.project.$delete(function () { $state.go('app.public.projects_list', {}, { reload: true }); });\n });\n } else {\n return console.error(_t('app.public.projects_show.unauthorized_operation'));\n }\n };\n\n /**\n * Open a modal box containg a form that allow the end-user to signal an abusive content\n * @param e {Object} jQuery event\n */\n $scope.signalAbuse = function (e) {\n if (e) { e.preventDefault(); }\n\n $uibModal.open({\n templateUrl: '/shared/signalAbuseModal.html',\n size: 'md',\n resolve: {\n project () { return $scope.project; }\n },\n controller: ['$scope', '$uibModalInstance', '_t', 'growl', 'Abuse', 'project', function ($scope, $uibModalInstance, _t, growl, Abuse, project) {\n // signaler's profile & signalement infos\n $scope.signaler = {\n signaled_type: 'Project',\n signaled_id: project.id\n };\n\n // callback for signaling cancellation\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n\n // callback for form validation\n return $scope.ok = function () {\n Abuse.save(\n {},\n { abuse: $scope.signaler },\n function (res) {\n // creation successful\n growl.success(_t('app.public.projects_show.your_report_was_successful_thanks'));\n return $uibModalInstance.close(res);\n }\n , function (error) {\n // creation failed...\n growl.error(_t('app.public.projects_show.an_error_occured_while_sending_your_report'));\n }\n );\n };\n }]\n });\n };\n\n /**\n * Return the URL allowing to share the current project on the Facebook social network\n */\n $scope.shareOnFacebook = function () { return `https://www.facebook.com/share.php?u=${$state.href('app.public.projects_show', { id: $scope.project.slug }, { absolute: true }).replace('#', '%23')}`; };\n\n /**\n * Return the URL allowing to share the current project on the Twitter social network\n */\n $scope.shareOnTwitter = function () { return `https://twitter.com/intent/tweet?url=${encodeURIComponent($state.href('app.public.projects_show', { id: $scope.project.slug }, { absolute: true }))}&text=${encodeURIComponent($scope.project.name)}`; };\n }\n]);\n","/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-self-compare,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\n/* COMMON CODE */\n\n/**\n * Provides a set of common callback methods to the $scope parameter. These methods are used\n * in the various spaces' admin controllers.\n *\n * Provides :\n * - $scope.submited(content)\n * - $scope.cancel()\n * - $scope.fileinputClass(v)\n * - $scope.addFile()\n * - $scope.deleteFile(file)\n *\n * Requires :\n * - $scope.space.space_files_attributes = []\n * - $state (Ui-Router) [ 'app.public.spaces_list' ]\n*/\nclass SpacesController {\n constructor ($scope, $state) {\n /*\n * For use with ngUpload (https://github.com/twilson63/ngUpload).\n * Intended to be the callback when the upload is done: any raised error will be stacked in the\n * $scope.alerts array. If everything goes fine, the user is redirected to the spaces list.\n * @param content {Object} JSON - The upload's result\n */\n $scope.submited = function (content) {\n if ((content.id == null)) {\n $scope.alerts = [];\n angular.forEach(content, function (v, k) {\n angular.forEach(v, function (err) {\n $scope.alerts.push({\n msg: k + ': ' + err,\n type: 'danger'\n });\n });\n });\n } else {\n $state.go('app.public.spaces_list');\n }\n };\n\n /**\n * Changes the current user's view, redirecting him to the spaces list\n */\n $scope.cancel = function () { $state.go('app.public.spaces_list'); };\n\n /**\n * For use with 'ng-class', returns the CSS class name for the uploads previews.\n * The preview may show a placeholder or the content of the file depending on the upload state.\n * @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)\n */\n $scope.fileinputClass = function (v) {\n if (v) {\n return 'fileinput-exists';\n } else {\n return 'fileinput-new';\n }\n };\n\n /**\n * This will create a single new empty entry into the space attachments list.\n */\n $scope.addFile = function () { $scope.space.space_files_attributes.push({}); };\n\n /**\n * This will remove the given file from the space attachments list. If the file was previously uploaded\n * to the server, it will be marked for deletion on the server. Otherwise, it will be simply truncated from\n * the attachments array.\n * @param file {Object} the file to delete\n */\n $scope.deleteFile = function (file) {\n const index = $scope.space.space_files_attributes.indexOf(file);\n if (file.id != null) {\n return file._destroy = true;\n } else {\n return $scope.space.space_files_attributes.splice(index, 1);\n }\n };\n }\n}\n\n/**\n * Controller used in the public listing page, allowing everyone to see the list of spaces\n */\nApplication.Controllers.controller('SpacesController', ['$scope', '$state', 'spacesPromise', 'AuthService', '_t', 'Member', 'uiTourService', 'settingsPromise',\n function ($scope, $state, spacesPromise, AuthService, _t, Member, uiTourService, settingsPromise) {\n /* PUBLIC SCOPE */\n\n // Retrieve the list of spaces\n $scope.spaces = spacesPromise;\n\n /**\n * Redirect the user to the space details page\n */\n $scope.showSpace = function (space) { $state.go('app.public.space_show', { id: space.slug }); };\n\n /**\n * Callback to book a reservation for the current space\n */\n $scope.reserveSpace = function (space) { $state.go('app.logged.space_reserve', { id: space.slug }); };\n\n // Default: we show only enabled spaces\n $scope.spaceFiltering = 'enabled';\n\n // Available options for filtering spaces by status\n $scope.filterDisabled = [\n 'enabled',\n 'disabled',\n 'all'\n ];\n\n /**\n * Setup the feature-tour for the spaces page. (admins only)\n * This is intended as a contextual help (when pressing F1)\n */\n $scope.setupSpacesTour = function () {\n // setup the tour for admins only\n if (AuthService.isAuthorized(['admin', 'manager'])) {\n // get the tour defined by the ui-tour directive\n const uitour = uiTourService.getTourByName('spaces');\n if (AuthService.isAuthorized('admin')) {\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome',\n order: 0,\n title: _t('app.public.tour.spaces.welcome.title'),\n content: _t('app.public.tour.spaces.welcome.content'),\n placement: 'bottom',\n orphan: true\n });\n if ($scope.spaces.length > 0) {\n uitour.createStep({\n selector: '.spaces-list .show-button',\n stepId: 'view',\n order: 1,\n title: _t('app.public.tour.spaces.view.title'),\n content: _t('app.public.tour.spaces.view.content'),\n placement: 'top'\n });\n }\n } else {\n uitour.createStep({\n selector: 'body',\n stepId: 'welcome_manager',\n order: 0,\n title: _t('app.public.tour.spaces.welcome_manager.title'),\n content: _t('app.public.tour.spaces.welcome_manager.content'),\n placement: 'bottom',\n orphan: true\n });\n }\n if ($scope.spaces.length > 0) {\n uitour.createStep({\n selector: '.spaces-list .reserve-button',\n stepId: 'reserve',\n order: 2,\n title: _t('app.public.tour.spaces.reserve.title'),\n content: _t('app.public.tour.spaces.reserve.content'),\n placement: 'top'\n });\n }\n uitour.createStep({\n selector: 'body',\n stepId: 'conclusion',\n order: 3,\n title: _t('app.public.tour.conclusion.title'),\n content: _t('app.public.tour.conclusion.content'),\n placement: 'bottom',\n orphan: true\n });\n // on tour end, save the status in database\n uitour.on('ended', function () {\n if (uitour.getStatus() === uitour.Status.ON && $scope.currentUser.profile.tours.indexOf('spaces') < 0) {\n Member.completeTour({ id: $scope.currentUser.id }, { tour: 'spaces' }, function (res) {\n $scope.currentUser.profile.tours = res.tours;\n });\n }\n });\n // if the user has never seen the tour, show him now\n if (settingsPromise.feature_tour_display !== 'manual' && $scope.currentUser.profile.tours.indexOf('spaces') < 0) {\n uitour.start();\n }\n }\n }\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {}\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n]);\n\n/**\n * Controller used in the space creation page (admin)\n */\nApplication.Controllers.controller('NewSpaceController', ['$scope', '$state', 'CSRF', function ($scope, $state, CSRF) {\n CSRF.setMetaTags();\n\n // API URL where the form will be posted\n $scope.actionUrl = '/api/spaces/';\n\n // Form action on the above URL\n $scope.method = 'post';\n\n // default space parameters\n $scope.space =\n { space_files_attributes: [] };\n\n // Using the SpacesController\n return new SpacesController($scope, $state);\n}]);\n\n/**\n * Controller used in the space edition page (admin)\n */\nApplication.Controllers.controller('EditSpaceController', ['$scope', '$state', '$stateParams', 'spacePromise', 'CSRF',\n function ($scope, $state, $stateParams, spacePromise, CSRF) {\n CSRF.setMetaTags();\n\n // API URL where the form will be posted\n $scope.actionUrl = `/api/spaces/${$stateParams.id}`;\n\n // Form action on the above URL\n $scope.method = 'put';\n\n // space to modify\n $scope.space = spacePromise;\n\n // Using the SpacesController\n return new SpacesController($scope, $state);\n }]);\n\nApplication.Controllers.controller('ShowSpaceController', ['$scope', '$state', 'spacePromise', '_t', 'dialogs', 'growl',\n function ($scope, $state, spacePromise, _t, dialogs, growl) {\n // Details of the space witch id/slug is provided in the URL\n $scope.space = spacePromise;\n\n /**\n * Callback to book a reservation for the current space\n * @param event {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.reserveSpace = function (event) {\n event.preventDefault();\n return $state.go('app.logged.space_reserve', { id: $scope.space.slug });\n };\n\n /**\n * Callback to book a reservation for the current space\n * @param event {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.deleteSpace = function (event) {\n event.preventDefault();\n // check the permissions\n if ($scope.currentUser.role !== 'admin') {\n return console.error(_t('app.public.space_show.unauthorized_operation'));\n } else {\n return dialogs.confirm({\n resolve: {\n object () {\n return {\n title: _t('app.public.space_show.confirmation_required'),\n msg: _t('app.public.space_show.do_you_really_want_to_delete_this_space')\n };\n }\n }\n }\n , function () { // deletion confirmed\n // delete the machine then redirect to the machines listing\n $scope.space.$delete(\n function () {\n $state.go('app.public.spaces_list');\n },\n function (error) {\n growl.warning(_t('app.public.space_show.the_space_cant_be_deleted_because_it_is_already_reserved_by_some_users'));\n console.error(error);\n }\n );\n });\n }\n };\n }]);\n\n/**\n * Controller used in the spaces reservation agenda page.\n * This controller is very similar to the machine reservation controller with one major difference: here, there is many places\n * per slots.\n */\n\nApplication.Controllers.controller('ReserveSpaceController', ['$scope', '$stateParams', 'Auth', '$timeout', 'Availability', 'Member', 'plansPromise', 'groupsPromise', 'settingsPromise', 'spacePromise', '_t', 'uiCalendarConfig', 'CalendarConfig',\n function ($scope, $stateParams, Auth, $timeout, Availability, Member, plansPromise, groupsPromise, settingsPromise, spacePromise, _t, uiCalendarConfig, CalendarConfig) {\n /* PRIVATE STATIC CONSTANTS */\n\n // Color of the selected event backgound\n const SELECTED_EVENT_BG_COLOR = '#ffdd00';\n\n // Slot free to be booked\n const FREE_SLOT_BORDER_COLOR = '#3fc7ff';\n\n // Slot with reservation from current user\n const RESERVED_SLOT_BORDER_COLOR = '#b2e774';\n\n /* PUBLIC SCOPE */\n\n // bind the spaces availabilities with full-Calendar events\n $scope.eventSources = [];\n\n // the user to deal with, ie. the current user for non-admins\n $scope.ctrl =\n { member: {} };\n\n // list of plans, classified by group\n $scope.plansClassifiedByGroup = [];\n $scope.groups = groupsPromise;\n $scope.plans = plansPromise;\n for (let group of Array.from(groupsPromise)) {\n const groupObj = { id: group.id, name: group.name, plans: [] };\n for (let plan of Array.from(plansPromise)) {\n if (plan.group_id === group.id) { groupObj.plans.push(plan); }\n }\n $scope.plansClassifiedByGroup.push(groupObj);\n }\n\n // mapping of fullCalendar events.\n $scope.events = {\n reserved: [], // Slots that the user wants to book\n modifiable: null, // Slot that the user wants to change\n placable: null, // Destination slot for the change\n paid: [], // Slots that were just booked by the user (transaction ok)\n moved: null // Slots that were just moved by the user (change done) -> {newSlot:* oldSlot: *}\n };\n\n // the moment when the slot selection changed for the last time, used to trigger changes in the cart\n $scope.selectionTime = null;\n\n // the last clicked event in the calendar\n $scope.selectedEvent = null;\n\n // indicates the state of the current view : calendar or plans information\n $scope.plansAreShown = false;\n\n // will store the user's plan if he chose to buy one\n $scope.selectedPlan = null;\n\n // the moment when the plan selection changed for the last time, used to trigger changes in the cart\n $scope.planSelectionTime = null;\n\n // Selected space\n $scope.space = spacePromise;\n\n // fullCalendar (v2) configuration\n $scope.calendarConfig = CalendarConfig({\n minTime: moment.duration(moment(settingsPromise.booking_window_start).format('HH:mm:ss')),\n maxTime: moment.duration(moment(settingsPromise.booking_window_end).format('HH:mm:ss')),\n eventClick (event, jsEvent, view) {\n return calendarEventClickCb(event, jsEvent, view);\n },\n eventRender (event, element, view) {\n return eventRenderCb(event, element, view);\n }\n });\n\n // Application global settings\n $scope.settings = settingsPromise;\n\n // Global config: message to the end user concerning the subscriptions rules\n $scope.subscriptionExplicationsAlert = settingsPromise.subscription_explications_alert;\n\n // Global config: message to the end user concerning the space reservation\n $scope.spaceExplicationsAlert = settingsPromise.space_explications_alert;\n\n /**\n * Change the last selected slot's appearance to looks like 'added to cart'\n */\n $scope.markSlotAsAdded = function () {\n $scope.selectedEvent.backgroundColor = SELECTED_EVENT_BG_COLOR;\n updateEvents($scope.selectedEvent);\n };\n\n /**\n * Change the last selected slot's appearance to looks like 'never added to cart'\n */\n $scope.markSlotAsRemoved = function (slot) {\n slot.backgroundColor = 'white';\n slot.title = '';\n slot.borderColor = FREE_SLOT_BORDER_COLOR;\n slot.slot_id = null;\n slot.isValid = false;\n slot.is_reserved = false;\n slot.can_modify = false;\n slot.offered = false;\n if (slot.is_completed) { slot.is_completed = false; }\n updateEvents(slot);\n };\n\n /**\n * Callback when a slot was successfully cancelled. Reset the slot style as 'ready to book'\n */\n $scope.slotCancelled = function () { $scope.markSlotAsRemoved($scope.selectedEvent); };\n\n /**\n * Change the last selected slot's appearance to looks like 'currently looking for a new destination to exchange'\n */\n $scope.markSlotAsModifying = function () {\n $scope.selectedEvent.backgroundColor = '#eee';\n $scope.selectedEvent.title = _t('app.logged.space_reserve.i_change');\n updateEvents($scope.selectedEvent);\n };\n\n /**\n * Change the last selected slot's appearance to looks like 'the slot being exchanged will take this place'\n */\n $scope.changeModifySpaceSlot = function () {\n if ($scope.events.placable) {\n $scope.events.placable.backgroundColor = 'white';\n $scope.events.placable.title = '';\n updateEvents($scope.events.placable);\n }\n if (!$scope.events.placable || ($scope.events.placable._id !== $scope.selectedEvent._id)) {\n $scope.selectedEvent.backgroundColor = '#bbb';\n $scope.selectedEvent.title = _t('app.logged.space_reserve.i_shift');\n updateEvents($scope.selectedEvent);\n }\n return true;\n };\n\n /**\n * When modifying an already booked reservation, callback when the modification was successfully done.\n */\n $scope.modifySpaceSlot = function () {\n const save = {\n slotId: $scope.events.modifiable.slot_id,\n borderColor: $scope.events.modifiable.borderColor,\n title: _t('app.logged.space_reserve.i_ve_reserved')\n };\n\n $scope.events.modifiable.backgroundColor = 'white';\n $scope.events.modifiable.title = '';\n $scope.events.modifiable.borderColor = FREE_SLOT_BORDER_COLOR;\n $scope.events.modifiable.slot_id = null;\n $scope.events.modifiable.is_reserved = false;\n $scope.events.modifiable.can_modify = false;\n if ($scope.events.modifiable.is_completed) { $scope.events.modifiable.is_completed = false; }\n updateEvents($scope.events.modifiable);\n\n $scope.events.placable.title = save.title;\n $scope.events.placable.backgroundColor = 'white';\n $scope.events.placable.borderColor = save.borderColor;\n $scope.events.placable.slot_id = save.slotId;\n $scope.events.placable.is_reserved = true;\n $scope.events.placable.can_modify = true;\n updateEvents($scope.events.placable);\n\n refetchCalendar();\n };\n\n /**\n * Cancel the current booking modification, reseting the whole process\n */\n $scope.cancelModifySpaceSlot = function () {\n if ($scope.events.placable) {\n $scope.events.placable.backgroundColor = 'white';\n $scope.events.placable.title = '';\n }\n $scope.events.modifiable.title = _t('app.logged.space_reserve.i_ve_reserved');\n $scope.events.modifiable.backgroundColor = 'white';\n\n updateEvents($scope.events.placable, $scope.events.modifiable);\n };\n\n /**\n * Callback to deal with the reservations of the user selected in the dropdown list instead of the current user's\n * reservations. (admins only)\n */\n $scope.updateMember = function () {\n if ($scope.ctrl.member) {\n Member.get({ id: $scope.ctrl.member.id }, function (member) {\n $scope.ctrl.member = member;\n return Availability.spaces({ spaceId: $scope.space.id, member_id: $scope.ctrl.member.id }, function (spaces) {\n uiCalendarConfig.calendars.calendar.fullCalendar('removeEvents');\n return $scope.eventSources.splice(0, 1, {\n events: spaces,\n textColor: 'black'\n }\n );\n });\n });\n }\n // as the events are re-fetched for the new user, we must re-init the cart\n $scope.events.reserved = [];\n $scope.selectedPlan = null;\n return $scope.plansAreShown = false;\n };\n\n /**\n * Add the provided plan to the current shopping cart\n * @param plan {Object} the plan to subscribe\n */\n $scope.selectPlan = function (plan) {\n setTimeout(() => {\n // toggle selected plan\n if ($scope.selectedPlan !== plan) {\n $scope.selectedPlan = plan;\n } else {\n $scope.selectedPlan = null;\n }\n $scope.planSelectionTime = new Date();\n $scope.$apply();\n }, 50);\n };\n\n /**\n * Check if the provided plan is currently selected\n * @param plan {Object} Resource plan\n */\n $scope.isSelected = function (plan) {\n return $scope.selectedPlan === plan;\n };\n\n /**\n * Changes the user current view from the plan subscription screen to the machine reservation agenda\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.doNotSubscribePlan = function (e) {\n e.preventDefault();\n $scope.plansAreShown = false;\n $scope.selectedPlan = null;\n return $scope.planSelectionTime = new Date();\n };\n\n /**\n * Switch the user's view from the reservation agenda to the plan subscription\n */\n $scope.showPlans = function () { $scope.plansAreShown = true; };\n\n /**\n * Once the reservation is booked (payment process successfully completed), change the event style\n * in fullCalendar, update the user's subscription and free-credits if needed\n * @param reservation {Object}\n */\n $scope.afterPayment = function (reservation) {\n angular.forEach($scope.events.paid, function (spaceSlot, key) {\n spaceSlot.is_reserved = true;\n spaceSlot.can_modify = true;\n spaceSlot.title = _t('app.logged.space_reserve.i_ve_reserved');\n spaceSlot.backgroundColor = 'white';\n spaceSlot.borderColor = RESERVED_SLOT_BORDER_COLOR;\n updateSpaceSlotId(spaceSlot, reservation);\n updateEvents(spaceSlot);\n });\n\n if ($scope.selectedPlan) {\n $scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);\n if ($scope.ctrl.member.id === Auth._currentUser.id) {\n Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);\n }\n $scope.plansAreShown = false;\n $scope.selectedPlan = null;\n }\n $scope.ctrl.member.training_credits = angular.copy(reservation.user.training_credits);\n $scope.ctrl.member.machine_credits = angular.copy(reservation.user.machine_credits);\n if ($scope.ctrl.member.id === Auth._currentUser.id) {\n Auth._currentUser.training_credits = angular.copy(reservation.user.training_credits);\n Auth._currentUser.machine_credits = angular.copy(reservation.user.machine_credits);\n }\n\n refetchCalendar();\n };\n\n /**\n * To use as callback in Array.prototype.filter to get only enabled plans\n */\n $scope.filterDisabledPlans = function (plan) { return !plan.disabled; };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n if ($scope.currentUser.role !== 'admin') {\n Member.get({ id: $scope.currentUser.id }, function (member) { $scope.ctrl.member = member; });\n }\n // we load the availabilities from a callback function of the $scope.eventSources, instead of resolving a promise\n // in the router because this allows to refetchEvents from fullCalendar API.\n $scope.eventSources.push({\n events: function (start, end, timezone, callback) {\n Availability.spaces({ spaceId: $stateParams.id }, function (availabilities) {\n callback(availabilities);\n });\n },\n textColor: 'black'\n });\n };\n\n /**\n * Triggered when the user clicks on a reservation slot in the agenda.\n * Defines the behavior to adopt depending on the slot status (already booked, free, ready to be reserved ...),\n * the user's subscription (current or about to be took), and the time (the user cannot modify a booked reservation\n * if it's too late).\n * @see http://fullcalendar.io/docs/mouse/eventClick/\n */\n const calendarEventClickCb = function (event, jsEvent, view) {\n $scope.selectedEvent = event;\n $scope.selectionTime = new Date();\n };\n\n /**\n * Triggered when fullCalendar tries to graphically render an event block.\n * Append the event tag into the block, just after the event title.\n * @see http://fullcalendar.io/docs/event_rendering/eventRender/\n */\n const eventRenderCb = function (event, element, view) {\n if (($scope.currentUser.role === 'admin') && (event.tags.length > 0)) {\n let html = '';\n for (let tag of Array.from(event.tags)) {\n html += `${tag.name}`;\n }\n element.find('.fc-time').append(html);\n }\n };\n\n /**\n * After payment, update the id of the newly reserved slot with the id returned by the server.\n * This will allow the user to modify the reservation he just booked.\n * @param slot {Object}\n * @param reservation {Object}\n */\n const updateSpaceSlotId = function (slot, reservation) {\n angular.forEach(reservation.slots, function (s) {\n if (slot.start.isSame(s.start_at)) {\n slot.slot_id = s.id;\n }\n });\n };\n\n /**\n * Update the calendar's display to render the new attributes of the events\n * @param events Object[] events to update in full-calendar\n */\n const updateEvents = function (...events) {\n const realEvents = events.filter(e => !_.isNil(e));\n uiCalendarConfig.calendars.calendar.fullCalendar('updateEvents', realEvents);\n };\n\n\n /**\n * Asynchronously fetch the events from the API and refresh the calendar's view with these new events\n */\n const refetchCalendar = function () {\n uiCalendarConfig.calendars.calendar.fullCalendar('refetchEvents');\n setTimeout(() => {\n uiCalendarConfig.calendars.calendar.fullCalendar('rerenderEvents');\n }, 200);\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n\n]);\n","/* eslint-disable\n handle-callback-err,\n no-return-assign,\n no-self-compare,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\n/**\n * Public listing of the trainings\n */\nApplication.Controllers.controller('TrainingsController', ['$scope', '$state', 'trainingsPromise',\n function ($scope, $state, trainingsPromise) {\n // List of trainings\n $scope.trainings = trainingsPromise;\n\n /**\n * Callback for the 'reserve' button\n */\n $scope.reserveTraining = function (training, event) { $state.go('app.logged.trainings_reserve', { id: training.slug }); };\n\n /**\n * Callback for the 'show' button\n */\n $scope.showTraining = function (training) { $state.go('app.public.training_show', { id: training.slug }); };\n }]);\n\n/**\n * Public view of a specific training\n */\nApplication.Controllers.controller('ShowTrainingController', ['$scope', '$state', 'trainingPromise', 'growl', '_t', 'dialogs',\n function ($scope, $state, trainingPromise, growl, _t, dialogs) {\n // Current training\n $scope.training = trainingPromise;\n\n /**\n * Callback to delete the current training (admins only)\n */\n $scope.delete = function (training) {\n // check the permissions\n if ($scope.currentUser.role !== 'admin') {\n growl.error(_t('app.public.training_show.unauthorized_operation'));\n } else {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.public.training_show.confirmation_required'),\n msg: _t('app.public.training_show.do_you_really_want_to_delete_this_training')\n };\n }\n }\n },\n function () { // deletion confirmed\n // delete the training then redirect to the trainings listing\n training.$delete(\n function () { $state.go('app.public.trainings_list'); },\n function (error) {\n growl.warning(_t('app.public.training_show.the_training_cant_be_deleted_because_it_is_already_reserved_by_some_users'));\n console.error(error);\n }\n );\n }\n );\n }\n };\n\n /**\n * Callback for the 'reserve' button\n */\n $scope.reserveTraining = function (training, event) { $state.go('app.logged.trainings_reserve', { id: training.id }); };\n\n /**\n * Revert view to the full list of trainings (\"<-\" button)\n */\n $scope.cancel = function (event) { $state.go('app.public.trainings_list'); };\n }]);\n\n/**\n * Controller used in the training reservation agenda page.\n * This controller is very similar to the machine reservation controller with one major difference: here, ONLY ONE\n * training can be reserved during the reservation process (the shopping cart may contains only one training and a subscription).\n */\n\nApplication.Controllers.controller('ReserveTrainingController', ['$scope', '$stateParams', 'Auth', 'AuthService', '$timeout', 'Availability', 'Member', 'plansPromise', 'groupsPromise', 'settingsPromise', 'trainingPromise', '_t', 'uiCalendarConfig', 'CalendarConfig',\n function ($scope, $stateParams, Auth, AuthService, $timeout, Availability, Member, plansPromise, groupsPromise, settingsPromise, trainingPromise, _t, uiCalendarConfig, CalendarConfig) {\n /* PRIVATE STATIC CONSTANTS */\n\n // Color of the selected event backgound\n const SELECTED_EVENT_BG_COLOR = '#ffdd00';\n\n // Slot free to be booked\n const FREE_SLOT_BORDER_COLOR = '#bd7ae9';\n\n /* PUBLIC SCOPE */\n\n // bind the trainings availabilities with full-Calendar events\n $scope.eventSources = [];\n\n // the user to deal with, ie. the current user for non-admins\n $scope.ctrl =\n { member: {} };\n\n // list of plans, classified by group\n $scope.groups = groupsPromise;\n $scope.plans = plansPromise;\n $scope.plansClassifiedByGroup = [];\n for (let group of Array.from(groupsPromise)) {\n const groupObj = { id: group.id, name: group.name, plans: [] };\n for (let plan of Array.from(plansPromise)) {\n if (plan.group_id === group.id) { groupObj.plans.push(plan); }\n }\n $scope.plansClassifiedByGroup.push(groupObj);\n }\n\n // mapping of fullCalendar events.\n $scope.events = {\n reserved: [], // Slots that the user wants to book\n modifiable: null, // Slot that the user wants to change\n placable: null, // Destination slot for the change\n paid: [], // Slots that were just booked by the user (transaction ok)\n moved: null // Slots that were just moved by the user (change done) -> {newSlot:* oldSlot: *}\n };\n\n // the moment when the slot selection changed for the last time, used to trigger changes in the cart\n $scope.selectionTime = null;\n\n // the last clicked event in the calender\n $scope.selectedEvent = null;\n\n // indicates the state of the current view : calendar or plans information\n $scope.plansAreShown = false;\n\n // will store the user's plan if he choosed to buy one\n $scope.selectedPlan = null;\n\n // the moment when the plan selection changed for the last time, used to trigger changes in the cart\n $scope.planSelectionTime = null;\n\n // Selected training\n $scope.training = trainingPromise;\n\n // 'all' OR training's slug\n $scope.mode = $stateParams.id;\n\n // fullCalendar (v2) configuration\n $scope.calendarConfig = CalendarConfig({\n minTime: moment.duration(moment(settingsPromise.booking_window_start).format('HH:mm:ss')),\n maxTime: moment.duration(moment(settingsPromise.booking_window_end).format('HH:mm:ss')),\n eventClick (event, jsEvent, view) {\n return calendarEventClickCb(event, jsEvent, view);\n },\n eventRender (event, element, view) {\n return eventRenderCb(event, element, view);\n }\n });\n\n // Application global settings\n $scope.settings = settingsPromise;\n\n // Global config: message to the end user concerning the subscriptions rules\n $scope.subscriptionExplicationsAlert = settingsPromise.subscription_explications_alert;\n\n // Global config: message to the end user concerning the training reservation\n $scope.trainingExplicationsAlert = settingsPromise.training_explications_alert;\n\n // Global config: message to the end user giving advice about the training reservation\n $scope.trainingInformationMessage = settingsPromise.training_information_message;\n\n /**\n * Change the last selected slot's appearance to looks like 'added to cart'\n */\n $scope.markSlotAsAdded = function () {\n $scope.selectedEvent.backgroundColor = SELECTED_EVENT_BG_COLOR;\n updateEvents($scope.selectedEvent);\n };\n\n /**\n * Change the last selected slot's appearance to looks like 'never added to cart'\n */\n $scope.markSlotAsRemoved = function (slot) {\n slot.backgroundColor = 'white';\n slot.title = slot.training.name;\n slot.borderColor = FREE_SLOT_BORDER_COLOR;\n slot.id = null;\n slot.isValid = false;\n slot.is_reserved = false;\n slot.can_modify = false;\n slot.offered = false;\n if (slot.is_completed) { slot.is_completed = false; }\n updateEvents(slot);\n };\n\n /**\n * Callback when a slot was successfully cancelled. Reset the slot style as 'ready to book'\n */\n $scope.slotCancelled = function () { $scope.markSlotAsRemoved($scope.selectedEvent); };\n\n /**\n * Change the last selected slot's appearence to looks like 'currently looking for a new destination to exchange'\n */\n $scope.markSlotAsModifying = function () {\n $scope.selectedEvent.backgroundColor = '#eee';\n $scope.selectedEvent.title = $scope.selectedEvent.training.name + ' - ' + _t('app.logged.trainings_reserve.i_change');\n updateEvents($scope.selectedEvent);\n };\n\n /**\n * Change the last selected slot's appearence to looks like 'the slot being exchanged will take this place'\n */\n $scope.changeModifyTrainingSlot = function () {\n if ($scope.selectedEvent.training.id !== $scope.events.modifiable.training.id) return false;\n\n if ($scope.events.placable) {\n $scope.events.placable.backgroundColor = 'white';\n $scope.events.placable.title = $scope.events.placable.training.name;\n updateEvents($scope.events.placable);\n }\n if (!$scope.events.placable || ($scope.events.placable._id !== $scope.selectedEvent._id)) {\n $scope.selectedEvent.backgroundColor = '#bbb';\n $scope.selectedEvent.title = $scope.selectedEvent.training.name + ' - ' + _t('app.logged.trainings_reserve.i_shift');\n updateEvents($scope.selectedEvent);\n }\n return true;\n };\n\n /**\n * When modifying an already booked reservation, callback when the modification was successfully done.\n */\n $scope.modifyTrainingSlot = function () {\n const save = {\n slotId: $scope.events.modifiable.slot_id,\n borderColor: $scope.events.modifiable.borderColor,\n title: !AuthService.isAuthorized(['admin', 'manager']) ? $scope.events.placable.training.name + ' - ' + _t('app.logged.trainings_reserve.i_ve_reserved') : $scope.events.placable.training.name,\n };\n\n $scope.events.modifiable.backgroundColor = 'white';\n $scope.events.modifiable.title = $scope.events.modifiable.training.name;\n $scope.events.modifiable.borderColor = FREE_SLOT_BORDER_COLOR;\n $scope.events.modifiable.slot_id = null;\n $scope.events.modifiable.is_reserved = false;\n $scope.events.modifiable.can_modify = false;\n if ($scope.events.modifiable.is_completed) { $scope.events.modifiable.is_completed = false; }\n updateEvents($scope.events.modifiable);\n\n $scope.events.placable.title = save.title;\n $scope.events.placable.backgroundColor = 'white';\n $scope.events.placable.borderColor = save.borderColor;\n $scope.events.placable.slot_id = save.slotId;\n $scope.events.placable.is_reserved = true;\n $scope.events.placable.can_modify = true;\n updateEvents($scope.events.placable);\n\n refetchCalendar();\n };\n\n /**\n * Cancel the current booking modification, reseting the whole process\n */\n $scope.cancelModifyTrainingSlot = function () {\n if ($scope.events.placable) {\n $scope.events.placable.backgroundColor = 'white';\n $scope.events.placable.title = $scope.events.placable.training.name;\n }\n $scope.events.modifiable.title = $scope.currentUser.role !== 'admin' ? $scope.events.modifiable.training.name + ' - ' + _t('app.logged.trainings_reserve.i_ve_reserved') : $scope.events.modifiable.training.name;\n $scope.events.modifiable.backgroundColor = 'white';\n\n updateEvents($scope.events.placable, $scope.events.modifiable);\n };\n\n /**\n * Callback to deal with the reservations of the user selected in the dropdown list instead of the current user's\n * reservations. (admins only)\n */\n $scope.updateMember = function () {\n if ($scope.ctrl.member) {\n Member.get({ id: $scope.ctrl.member.id }, function (member) {\n $scope.ctrl.member = member;\n const id = $stateParams.id === 'all' ? $stateParams.id : $scope.training.id;\n return Availability.trainings({ trainingId: id, member_id: $scope.ctrl.member.id }, function (trainings) {\n uiCalendarConfig.calendars.calendar.fullCalendar('removeEvents');\n return $scope.eventSources.splice(0, 1, {\n events: trainings,\n textColor: 'black'\n }\n );\n });\n });\n }\n // as the events are re-fetched for the new user, we must re-init the cart\n $scope.events.reserved = [];\n $scope.selectedPlan = null;\n return $scope.plansAreShown = false;\n };\n\n /**\n * Add the provided plan to the current shopping cart\n * @param plan {Object} the plan to subscribe\n */\n $scope.selectPlan = function (plan) {\n setTimeout(() => {\n // toggle selected plan\n if ($scope.selectedPlan !== plan) {\n $scope.selectedPlan = plan;\n } else {\n $scope.selectedPlan = null;\n }\n $scope.planSelectionTime = new Date();\n $scope.$apply();\n }, 50);\n };\n\n /**\n * Check if the provided plan is currently selected\n * @param plan {Object} Resource plan\n */\n $scope.isSelected = function (plan) {\n return $scope.selectedPlan === plan;\n };\n\n /**\n * Changes the user current view from the plan subsription screen to the machine reservation agenda\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.doNotSubscribePlan = function (e) {\n e.preventDefault();\n $scope.plansAreShown = false;\n $scope.selectedPlan = null;\n return $scope.planSelectionTime = new Date();\n };\n\n /**\n * Switch the user's view from the reservation agenda to the plan subscription\n */\n $scope.showPlans = function () { $scope.plansAreShown = true; };\n\n /**\n * Once the reservation is booked (payment process successfully completed), change the event style\n * in fullCalendar, update the user's subscription and free-credits if needed\n * @param reservation {Object}\n */\n $scope.afterPayment = function (reservation) {\n angular.forEach($scope.events.paid, function (trainingSlot, key) {\n trainingSlot.backgroundColor = 'white';\n trainingSlot.is_reserved = true;\n trainingSlot.can_modify = true;\n updateTrainingSlotId(trainingSlot, reservation);\n trainingSlot.borderColor = '#b2e774';\n trainingSlot.title = trainingSlot.training.name + ' - ' + _t('app.logged.trainings_reserve.i_ve_reserved');\n updateEvents(trainingSlot);\n });\n\n if ($scope.selectedPlan) {\n $scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);\n if ($scope.ctrl.member.id === Auth._currentUser.id) {\n Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);\n }\n $scope.plansAreShown = false;\n $scope.selectedPlan = null;\n }\n $scope.ctrl.member.training_credits = angular.copy(reservation.user.training_credits);\n $scope.ctrl.member.machine_credits = angular.copy(reservation.user.machine_credits);\n if ($scope.ctrl.member.id === Auth._currentUser.id) {\n Auth._currentUser.training_credits = angular.copy(reservation.user.training_credits);\n Auth._currentUser.machine_credits = angular.copy(reservation.user.machine_credits);\n }\n\n refetchCalendar();\n };\n\n /**\n * To use as callback in Array.prototype.filter to get only enabled plans\n */\n $scope.filterDisabledPlans = function (plan) { return !plan.disabled; };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the controller is loaded\n */\n const initialize = function () {\n if ($scope.currentUser.role !== 'admin') {\n Member.get({ id: $scope.currentUser.id }, function (member) { $scope.ctrl.member = member; });\n }\n // we load the availabilities from a callback function of the $scope.eventSources, instead of resolving a promise\n // in the router because this allows to refetchEvents from fullCalendar API.\n $scope.eventSources.push({\n events: function (start, end, timezone, callback) {\n Availability.trainings({ trainingId: $stateParams.id }, function (availabilities) {\n callback(availabilities);\n });\n },\n textColor: 'black'\n });\n };\n\n /**\n * Triggered when the user clicks on a reservation slot in the agenda.\n * Defines the behavior to adopt depending on the slot status (already booked, free, ready to be reserved ...),\n * the user's subscription (current or about to be took) and the time (the user cannot modify a booked reservation\n * if it's too late).\n * @see http://fullcalendar.io/docs/mouse/eventClick/\n */\n const calendarEventClickCb = function (event, jsEvent, view) {\n $scope.selectedEvent = event;\n if ($stateParams.id === 'all') {\n $scope.training = event.training;\n }\n return $scope.selectionTime = new Date();\n };\n\n /**\n * Triggered when fullCalendar tries to graphicaly render an event block.\n * Append the event tag into the block, just after the event title.\n * @see http://fullcalendar.io/docs/event_rendering/eventRender/\n */\n const eventRenderCb = function (event, element, view) {\n if (($scope.currentUser.role === 'admin') && (event.tags.length > 0)) {\n let html = '';\n for (let tag of Array.from(event.tags)) {\n html += `${tag.name}`;\n }\n element.find('.fc-time').append(html);\n }\n };\n\n /**\n * After payment, update the id of the newly reserved slot with the id returned by the server.\n * This will allow the user to modify the reservation he just booked.\n * @param slot {Object}\n * @param reservation {Object}\n */\n const updateTrainingSlotId = function (slot, reservation) {\n angular.forEach(reservation.slots, function (s) {\n if (slot.start.isSame(s.start_at)) {\n return slot.slot_id = s.id;\n }\n });\n };\n\n /**\n * Update the calendar's display to render the new attributes of the events\n * @param events Object[] events to update in full-calendar\n */\n const updateEvents = function (...events) {\n const realEvents = events.filter(e => !_.isNil(e));\n uiCalendarConfig.calendars.calendar.fullCalendar('updateEvents', realEvents);\n };\n\n\n /**\n * Asynchronously fetch the events from the API and refresh the calendar's view with these new events\n */\n const refetchCalendar = function () {\n uiCalendarConfig.calendars.calendar.fullCalendar('refetchEvents');\n setTimeout(() => {\n uiCalendarConfig.calendars.calendar.fullCalendar('rerenderEvents');\n }, 200);\n };\n\n // !!! MUST BE CALLED AT THE END of the controller\n return initialize();\n }\n\n]);\n","'use strict';\n\nApplication.Controllers.controller('WalletController', ['$scope', 'walletPromise', 'transactionsPromise',\n function ($scope, walletPromise, transactionsPromise) {\n /* PUBLIC SCOPE */\n\n // current user wallet\n $scope.wallet = walletPromise;\n\n // current wallet transactions\n $scope.transactions = transactionsPromise;\n }\n]);\n","'use strict';\n\nApplication.Services.factory('_t', ['$translate', function ($translate) {\n return function (key, interpolations) {\n if (interpolations == null) { interpolations = undefined; }\n return $translate.instant(key, interpolations);\n };\n}]);\n","'use strict';\n\nApplication.Services.factory('Abuse', ['$resource', function ($resource) {\n return $resource('/api/abuses/:id',\n { id: '@id' }, {\n query: {\n isArray: false\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('AccountingPeriod', ['$resource', function ($resource) {\n return $resource('/api/accounting_periods/:id',\n { id: '@id' }, {\n lastClosingEnd: {\n method: 'GET',\n url: '/api/accounting_periods/last_closing_end'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Admin', ['$resource', function ($resource) {\n return $resource('/api/admins/:id',\n { id: '@id' }, {\n query: {\n isArray: false\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('AgeRange', ['$resource', function ($resource) {\n return $resource('/api/age_ranges/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('AuthService', ['Session', function (Session) {\n const service = {};\n\n service.isAuthenticated = function() {\n return (Session.currentUser != null) && (Session.currentUser.id != null);\n };\n\n service.isAuthorized = function(authorizedRoles) {\n if (!angular.isArray(authorizedRoles)) {\n authorizedRoles = [authorizedRoles];\n }\n return service.isAuthenticated() && (authorizedRoles.indexOf(Session.currentUser.role) !== -1);\n };\n\n return service;\n}]);\n","'use strict';\n\nApplication.Services.factory('AuthProvider', ['$resource', function ($resource) {\n return $resource('/api/auth_providers/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n },\n mapping_fields: {\n method: 'GET',\n url: '/api/auth_providers/mapping_fields'\n },\n active: {\n method: 'GET',\n url: '/api/auth_providers/active'\n },\n send_code: {\n method: 'POST',\n url: '/api/auth_providers/send_code'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Availability', ['$resource', function ($resource) {\n return $resource('/api/availabilities/:id',\n { id: '@id' }, {\n machine: {\n method: 'GET',\n url: '/api/availabilities/machines/:machineId',\n params: { machineId: '@machineId' },\n isArray: true\n },\n reservations: {\n method: 'GET',\n url: '/api/availabilities/:id/reservations',\n isArray: true\n },\n trainings: {\n method: 'GET',\n url: '/api/availabilities/trainings/:trainingId',\n params: { trainingId: '@trainingId' },\n isArray: true\n },\n spaces: {\n method: 'GET',\n url: '/api/availabilities/spaces/:spaceId',\n params: { spaceId: '@spaceId' },\n isArray: true\n },\n update: {\n method: 'PUT'\n },\n lock: {\n method: 'PUT',\n url: '/api/availabilities/:id/lock'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('CalendarConfig', [() =>\n function (options) {\n // The calendar is divided in slots of 1 hour\n if (options == null) { options = {}; }\n const BASE_SLOT = '01:00:00';\n\n // The calendar will be initialized positioned under 9:00 AM\n const DEFAULT_CALENDAR_POSITION = '09:00:00';\n\n const defaultOptions = {\n timezone: Fablab.timezone,\n locale: Fablab.fullcalendar_locale,\n header: {\n left: 'month agendaWeek',\n center: 'title',\n right: 'today prev,next'\n },\n firstDay: Fablab.weekStartingDay,\n scrollTime: DEFAULT_CALENDAR_POSITION,\n slotDuration: BASE_SLOT,\n allDayDefault: false,\n minTime: '00:00:00',\n maxTime: '24:00:00',\n height: 'auto',\n buttonIcons: {\n prev: 'left-single-arrow',\n next: 'right-single-arrow'\n },\n slotLabelFormat: 'H:mm',\n views: {\n agendaWeek: {\n timeFormat: 'H:mm'\n },\n month: {\n timeFormat: 'H(:mm)'\n }\n },\n\n allDaySlot: false,\n defaultView: 'agendaWeek',\n editable: false\n };\n\n return Object.assign({}, defaultOptions, options);\n }\n\n]);\n","'use strict';\n\nApplication.Services.factory('Category', ['$resource', function ($resource) {\n return $resource('/api/categories/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Component', ['$resource', function ($resource) {\n return $resource('/api/components/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Coupon', ['$resource', function ($resource) {\n return $resource('/api/coupons/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n },\n validate: {\n method: 'POST',\n url: '/api/coupons/validate'\n },\n send: {\n method: 'POST',\n url: '/api/coupons/send'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Credit', ['$resource', function ($resource) {\n return $resource('/api/credits/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.service('CSRF', ['$cookies',\n function ($cookies) {\n return ({\n setMetaTags () {\n if (angular.element('meta[name=\"csrf-param\"]').length === 0) {\n angular.element('head').append('');\n angular.element('head').append(``);\n } else {\n angular.element('meta[name=\"csrf-token\"]').replaceWith(``);\n }\n }\n });\n }\n]);\n","'use strict';\n\nApplication.Services.factory('CustomAsset', ['$resource', function ($resource) {\n return $resource('/api/custom_assets/:name',\n { name: '@name' });\n}]);\n","/**\n * Created by sylvain on 20/08/14.\n *\n * Based on http://jsperf.com/diacritics/12\n */\nApplication.Services.service('Diacritics', [\n function () {\n return {\n\n /**\n * Fast diacritics removing function, works on the provided string.\n * Eg. \"éêè çä bönjoür\" will become \"eee ca bonjour\"\n * @param str {string} to ascii-fy\n * @returns {string} without diacritics\n */\n remove: function (str) {\n var defaultDiacriticsRemovalap = [\n { base: 'A', letters: '\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F' },\n { base: 'AA', letters: '\\uA732' },\n { base: 'AE', letters: '\\u00C6\\u01FC\\u01E2' },\n { base: 'AO', letters: '\\uA734' },\n { base: 'AU', letters: '\\uA736' },\n { base: 'AV', letters: '\\uA738\\uA73A' },\n { base: 'AY', letters: '\\uA73C' },\n { base: 'B', letters: '\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181' },\n { base: 'C', letters: '\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E' },\n { base: 'D', letters: '\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779' },\n { base: 'DZ', letters: '\\u01F1\\u01C4' },\n { base: 'Dz', letters: '\\u01F2\\u01C5' },\n { base: 'E', letters: '\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E' },\n { base: 'F', letters: '\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B' },\n { base: 'G', letters: '\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E' },\n { base: 'H', letters: '\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D' },\n { base: 'I', letters: '\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197' },\n { base: 'J', letters: '\\u004A\\u24BF\\uFF2A\\u0134\\u0248' },\n { base: 'K', letters: '\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2' },\n { base: 'L', letters: '\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780' },\n { base: 'LJ', letters: '\\u01C7' },\n { base: 'Lj', letters: '\\u01C8' },\n { base: 'M', letters: '\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C' },\n { base: 'N', letters: '\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4' },\n { base: 'NJ', letters: '\\u01CA' },\n { base: 'Nj', letters: '\\u01CB' },\n { base: 'O', letters: '\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C' },\n { base: 'OI', letters: '\\u01A2' },\n { base: 'OO', letters: '\\uA74E' },\n { base: 'OU', letters: '\\u0222' },\n { base: 'OE', letters: '\\u008C\\u0152' },\n { base: 'oe', letters: '\\u009C\\u0153' },\n { base: 'P', letters: '\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754' },\n { base: 'Q', letters: '\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A' },\n { base: 'R', letters: '\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782' },\n { base: 'S', letters: '\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784' },\n { base: 'T', letters: '\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786' },\n { base: 'TZ', letters: '\\uA728' },\n { base: 'U', letters: '\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244' },\n { base: 'V', letters: '\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245' },\n { base: 'VY', letters: '\\uA760' },\n { base: 'W', letters: '\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72' },\n { base: 'X', letters: '\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C' },\n { base: 'Y', letters: '\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE' },\n { base: 'Z', letters: '\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762' },\n { base: 'a', letters: '\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250' },\n { base: 'aa', letters: '\\uA733' },\n { base: 'ae', letters: '\\u00E6\\u01FD\\u01E3' },\n { base: 'ao', letters: '\\uA735' },\n { base: 'au', letters: '\\uA737' },\n { base: 'av', letters: '\\uA739\\uA73B' },\n { base: 'ay', letters: '\\uA73D' },\n { base: 'b', letters: '\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253' },\n { base: 'c', letters: '\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184' },\n { base: 'd', letters: '\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A' },\n { base: 'dz', letters: '\\u01F3\\u01C6' },\n { base: 'e', letters: '\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD' },\n { base: 'f', letters: '\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C' },\n { base: 'g', letters: '\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F' },\n { base: 'h', letters: '\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265' },\n { base: 'hv', letters: '\\u0195' },\n { base: 'i', letters: '\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131' },\n { base: 'j', letters: '\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249' },\n { base: 'k', letters: '\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3' },\n { base: 'l', letters: '\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747' },\n { base: 'lj', letters: '\\u01C9' },\n { base: 'm', letters: '\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F' },\n { base: 'n', letters: '\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5' },\n { base: 'nj', letters: '\\u01CC' },\n { base: 'o', letters: '\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275' },\n { base: 'oi', letters: '\\u01A3' },\n { base: 'ou', letters: '\\u0223' },\n { base: 'oo', letters: '\\uA74F' },\n { base: 'p', letters: '\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755' },\n { base: 'q', letters: '\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759' },\n { base: 'r', letters: '\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783' },\n { base: 's', letters: '\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B' },\n { base: 't', letters: '\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787' },\n { base: 'tz', letters: '\\uA729' },\n { base: 'u', letters: '\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289' },\n { base: 'v', letters: '\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C' },\n { base: 'vy', letters: '\\uA761' },\n { base: 'w', letters: '\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73' },\n { base: 'x', letters: '\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D' },\n { base: 'y', letters: '\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF' },\n { base: 'z', letters: '\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763' }\n ];\n\n var diacriticsMap = {};\n for (var i = 0; i < defaultDiacriticsRemovalap.length; i++) {\n var letters = defaultDiacriticsRemovalap[i].letters.split('');\n for (var j = 0; j < letters.length; j++) {\n diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;\n }\n }\n\n // eslint-disable-next-line no-control-regex\n return str.replace(/[^\\u0000-\\u007E]/g, function (a) {\n return diacriticsMap[a] || a;\n });\n }\n\n };\n }\n]);\n","'use strict';\n\nApplication.Services.factory('dialogs', ['$uibModal', function ($uibModal) {\n return ({\n confirm (options, success, error) {\n const defaultOpts = {\n templateUrl: '/shared/confirm_modal.html',\n size: 'sm',\n resolve: {\n object () {\n return {\n title: 'Titre de confirmation',\n msg: 'Message de confirmation'\n };\n }\n },\n controller: ['$scope', '$uibModalInstance', '$state', 'object', function ($scope, $uibModalInstance, $state, object) {\n $scope.object = object;\n $scope.ok = function (info) { $uibModalInstance.close(info); };\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n }]\n };\n if (angular.isObject(options)) { angular.extend(defaultOpts, options); }\n return $uibModal.open(defaultOpts)\n .result['finally'](null).then(function (info) {\n if (angular.isFunction(success)) {\n return success(info);\n }\n }\n , function (reason) {\n if (angular.isFunction(error)) {\n return error(reason);\n }\n });\n }\n });\n}]);\n","Application.Services.service('es', ['esFactory', function (esFactory) {\n return esFactory({ host: window.location.origin });\n}]);\n","'use strict';\n\nApplication.Services.factory('Event', ['$resource', function ($resource) {\n return $resource('/api/events/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n },\n upcoming: {\n method: 'GET',\n url: '/api/events/upcoming/:limit',\n params: { limit: '@limit' },\n isArray: true\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('EventTheme', ['$resource', function ($resource) {\n return $resource('/api/event_themes/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Export', ['$http', function ($http) {\n return ({\n status (query) {\n return $http.post('/api/exports/status', query);\n }\n });\n}]);\n","Application.Services.factory('FabAnalytics', ['$resource', function ($resource) {\n return $resource('/api/analytics',\n {}, {\n data: {\n method: 'GET',\n url: '/api/analytics/data'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Group', ['$resource', function ($resource) {\n return $resource('/api/groups/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Help', ['$rootScope', '$uibModal', '$state', 'AuthService',\n function ($rootScope, $uibModal, $state, AuthService) {\n const TOURS = {\n 'app.public.home': 'welcome',\n 'app.public.machines_list': 'machines',\n 'app.public.spaces_list': 'spaces',\n 'app.admin.trainings': 'trainings',\n 'app.admin.calendar': 'calendar',\n 'app.admin.members': 'members',\n 'app.admin.invoices': 'invoices',\n 'app.admin.pricing': 'pricing',\n 'app.admin.events': 'events',\n 'app.admin.projects': 'projects',\n 'app.admin.statistics': 'statistics',\n 'app.admin.settings': 'settings',\n 'app.admin.open_api_clients': 'open-api'\n };\n\n return function (e) {\n if (!AuthService.isAuthorized(['admin', 'manager'])) return;\n\n if (e.key === 'F1') {\n e.preventDefault();\n // retrieve the tour name, based on the current location\n const tourName = TOURS[$state.current.name];\n\n // if no tour, just open the guide\n if (tourName === undefined) {\n return window.open('https://github.com/sleede/fab-manager/raw/master/doc/fr/guide_utilisation_fab_manager_v4.7.pdf', '_blank');\n }\n\n $uibModal.open({\n animation: true,\n templateUrl: '/shared/help_modal.html',\n resolve: {\n tourName: function () { return tourName; }\n },\n controller: ['$scope', '$uibModalInstance', 'uiTourService', 'tourName', function ($scope, $uibModalInstance, uiTourService, tourName) {\n // start the tour and hide the modal\n $scope.onTour = function () {\n const tour = uiTourService.getTourByName(tourName);\n if (tour) { tour.start(); }\n\n $uibModalInstance.close('tour');\n };\n\n // open the user's guide and hide the modal\n $scope.onGuide = function () {\n $uibModalInstance.close('guide');\n };\n }]\n });\n }\n };\n }]);\n","'use strict';\n\nApplication.Services.factory('helpers', [function () {\n return ({\n getAmountToPay (price, walletAmount) {\n if (walletAmount > price) { return 0; } else { return price - walletAmount; }\n }\n });\n}]);\n","'use strict';\n\nApplication.Services.factory('Ical', ['$resource', function ($resource) {\n return $resource('/api/ical/externals');\n}]);\n","'use strict';\n\nApplication.Services.factory('ICalendar', ['$resource', function ($resource) {\n return $resource('/api/i_calendar/:id',\n { id: '@id' }, {\n events: {\n method: 'GET',\n url: '/api/i_calendar/:id/events'\n },\n sync: {\n method: 'POST',\n url: '/api/i_calendar/:id/sync',\n params: { id: '@id' }\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Import', ['$resource', function ($resource) {\n return $resource('/api/imports/:id',\n { id: '@id' }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Invoice', ['$resource', function ($resource) {\n return $resource('/api/invoices/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n },\n list: {\n url: '/api/invoices/list',\n method: 'POST',\n isArray: true\n },\n first: {\n url: '/api/invoices/first',\n method: 'GET'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Licence', ['$resource', function ($resource) {\n return $resource('/api/licences/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Machine', ['$resource', function ($resource) {\n return $resource('/api/machines/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Member', ['$resource', 'Setting', function ($resource, Setting) {\n return $resource('/api/members/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n },\n lastSubscribed: {\n method: 'GET',\n url: '/api/last_subscribed/:limit',\n params: { limit: '@limit' },\n isArray: true\n },\n merge: {\n method: 'PUT',\n url: '/api/members/:id/merge'\n },\n list: {\n url: '/api/members/list',\n method: 'POST',\n isArray: true\n },\n search: {\n method: 'GET',\n url: '/api/members/search/:query',\n params: { query: '@query' },\n isArray: true\n },\n mapping: {\n method: 'GET',\n url: '/api/members/mapping'\n },\n completeTour: {\n method: 'PATCH',\n url: '/api/members/:id/complete_tour',\n params: { id: '@id' },\n interceptor: {\n response: function (response) {\n return Setting.query({ names: \"['feature_tour_display']\" }).$promise.then((settings) => {\n if (settings.feature_tour_display === 'session') {\n Fablab.sessionTours.push(response.data.tours[0]);\n return { tours: Fablab.sessionTours };\n }\n return response.data;\n });\n }\n }\n },\n updateRole: {\n method: 'PATCH',\n url: '/api/members/:id/update_role'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Notification', ['$resource', function ($resource) {\n return $resource('/api/notifications/:id',\n { id: '@id' }, {\n query: {\n isArray: false\n },\n update: {\n method: 'PUT'\n },\n polling: {\n url: '/api/notifications/polling',\n method: 'GET'\n },\n last_unread: {\n url: '/api/notifications/last_unread',\n method: 'GET'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('OpenAPIClient', ['$resource', function ($resource) {\n return $resource('/api/open_api_clients/:id',\n { id: '@id' }, {\n resetToken: {\n method: 'PATCH',\n url: '/api/open_api_clients/:id/reset_token'\n },\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('OpenlabProject', ['$resource', function ($resource) {\n return $resource('/api/openlab_projects/:id',\n { id: '@id' }, {\n query: {\n method: 'GET',\n isArray: false\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('paginationService', [function () {\n const helpers = {};\n\n helpers.pageCount = (totalCount, perPage) => Math.ceil(totalCount / perPage);\n\n helpers.hasNextPage = function (currentPage, totalCount, perPage) {\n const _pageCount = helpers.pageCount(totalCount, perPage);\n return (_pageCount !== currentPage) && (_pageCount !== 0);\n };\n\n const Instance = function (resourceService, currentPage, perPage, totalCount, defaultQueryParams, callback, functionName) {\n this.resourceService = resourceService;\n this.currentPage = currentPage;\n this.perPage = perPage;\n this.totalCount = totalCount;\n this.defaultQueryParams = defaultQueryParams;\n this.callback = callback;\n this.functionName = functionName || 'query';\n this.loading = false;\n\n this.pageCount = function () {\n return helpers.pageCount(this.totalCount, this.perPage);\n };\n\n this.hasNextPage = function () {\n return helpers.hasNextPage(this.currentPage, this.totalCount, this.perPage);\n };\n\n this.loadMore = function (queryParams) {\n let k, v;\n this.currentPage += 1;\n this.loading = true;\n\n const _queryParams = { page: this.currentPage, per_page: this.perPage };\n\n if (queryParams) {\n for (k in queryParams) {\n v = queryParams[k];\n _queryParams[k] = v;\n }\n }\n\n for (k in this.defaultQueryParams) {\n v = this.defaultQueryParams[k];\n _queryParams[k] = v;\n }\n\n this.resourceService[this.functionName](_queryParams, dataPromise => {\n this.callback(dataPromise);\n this.loading = false;\n });\n };\n };\n\n return { Instance };\n}\n]);\n","'use strict';\n\nApplication.Services.factory('Payment', ['$resource', function ($resource) {\n return $resource('/api/payments',\n {}, {\n confirm: {\n method: 'POST',\n url: '/api/payments/confirm_payment',\n isArray: false\n },\n onlinePaymentStatus: {\n method: 'GET',\n url: '/api/payments/online_payment_status'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Plan', ['$resource', function ($resource) {\n return $resource('/api/plans/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Price', ['$resource', function ($resource) {\n return $resource('/api/prices/:id',\n {}, {\n query: {\n isArray: true\n },\n update: {\n method: 'PUT'\n },\n compute: {\n method: 'POST',\n url: '/api/prices/compute',\n isArray: false\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('PriceCategory', ['$resource', function ($resource) {\n return $resource('/api/price_categories/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Pricing', ['$resource', function ($resource) {\n return $resource('/api/pricing',\n {}, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Project', ['$resource', function ($resource) {\n return $resource('/api/projects/:id',\n { id: '@id' }, {\n lastPublished: {\n method: 'GET',\n url: '/api/projects/last_published',\n isArray: true\n },\n search: {\n method: 'GET',\n url: '/api/projects/search',\n isArray: false\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Reservation', ['$resource', function ($resource) {\n return $resource('/api/reservations/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.service('Session', [function () {\n this.create = function (user) {\n this.currentUser = user;\n };\n\n this.destroy = function () {\n this.currentUser = null;\n };\n\n return this;\n}]);\n","'use strict';\n\nApplication.Services.factory('Setting', ['$resource', function ($resource) {\n return $resource('/api/settings/:name',\n { name: '@name' }, {\n update: {\n method: 'PUT',\n transformRequest: (data) => {\n return angular.toJson({ setting: data });\n }\n },\n bulkUpdate: {\n url: '/api/settings/bulk_update',\n method: 'PATCH'\n },\n query: {\n isArray: false\n },\n reset: {\n url: '/api/settings/reset/:name',\n params: { name: '@name' },\n method: 'PUT'\n },\n isPresent: {\n url: '/api/settings/is_present/:name',\n params: { name: '@name' },\n method: 'GET'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Slot', ['$resource', function ($resource) {\n return $resource('/api/slots/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n },\n cancel: {\n method: 'PUT',\n url: '/api/slots/:id/cancel'\n }\n }\n );\n}]);\n","'use strict';\n\n// list the social networks supported in the user's profiles\nApplication.Services.factory('SocialNetworks', [function () {\n return ['facebook', 'twitter', 'viadeo', 'linkedin', 'instagram', 'youtube', 'vimeo', 'dailymotion', 'github', 'echosciences', 'website', 'pinterest', 'lastfm', 'flickr'];\n}]);\n","'use strict';\n\nApplication.Services.factory('Space', ['$resource', function ($resource) {\n return $resource('/api/spaces/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Statistics', ['$resource', function ($resource) {\n return $resource('/api/statistics');\n}]);\n","'use strict';\n\nApplication.Services.factory('Subscription', ['$resource', function ($resource) {\n return $resource('/api/subscriptions/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Tag', ['$resource', function ($resource) {\n return $resource('/api/tags/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Theme', ['$resource', function ($resource) {\n return $resource('/api/themes/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Training', ['$resource', function ($resource) {\n return $resource('/api/trainings/:id',\n { id: '@id' }, {\n update: {\n method: 'PUT'\n },\n availabilities: {\n method: 'GET',\n url: '/api/trainings/:id/availabilities'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('TrainingsPricing', ['$resource', function ($resource) {\n return $resource('/api/trainings_pricings/:id',\n {}, {\n update: {\n method: 'PUT'\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Translations', ['$translatePartialLoader', '$translate', function ($translatePartialLoader, $translate) {\n return ({\n query (stateName) {\n if (angular.isArray((stateName))) {\n angular.forEach(stateName, state => $translatePartialLoader.addPart(state));\n } else {\n $translatePartialLoader.addPart(stateName);\n }\n return $translate.refresh();\n }\n });\n}]);\n","'use strict';\n\nApplication.Services.factory('User', ['$resource', function ($resource) {\n return $resource('/api/users/:id',\n { id: '@id' }, {\n query: {\n isArray: false\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Services.factory('Version', ['$resource', function ($resource) {\n return $resource('/api/version/:origin',\n {}, {\n get: {\n method: 'POST'\n }\n });\n}]);\n","'use strict';\n\nApplication.Services.factory('Wallet', ['$resource', function ($resource) {\n return $resource('/api/wallet',\n {}, {\n getWalletByUser: {\n method: 'GET',\n url: '/api/wallet/by_user/:user_id',\n isArray: false\n },\n transactions: {\n method: 'GET',\n url: '/api/wallet/:id/transactions',\n isArray: true\n },\n credit: {\n method: 'PUT',\n url: '/api/wallet/:id/credit',\n isArray: false\n }\n }\n );\n}]);\n","'use strict';\n\nApplication.Directives.directive('bsJasnyFileinput', [function () {\n return {\n require: ['ngModel'],\n link: function ($scope, elm, attrs, requiredCtrls) {\n var ngModelCtrl = requiredCtrls[0];\n var fileinput = elm.parents('[data-provides=fileinput]');\n var filetypeRegex = attrs.bsJasnyFileinput;\n fileinput.on('clear.bs.fileinput', function (e) {\n if (ngModelCtrl) {\n ngModelCtrl.$setViewValue(null);\n ngModelCtrl.$setPristine();\n $scope.$apply();\n }\n });\n fileinput.on('change.bs.fileinput', function (e, files) {\n if (ngModelCtrl) {\n if (files) {\n ngModelCtrl.$setViewValue(files.result);\n } else {\n ngModelCtrl.$setPristine();\n }\n\n // TODO: ne marche pas pour filetype\n if (filetypeRegex) {\n if (files && typeof files.type !== 'undefined' && files.type.match(new RegExp(filetypeRegex))) { ngModelCtrl.$setValidity('filetype', true); } else { ngModelCtrl.$setValidity('filetype', false); }\n };\n }\n $scope.$apply();\n });\n }\n };\n}]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nApplication.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs', 'growl', 'Auth', 'Price', 'Wallet', 'CustomAsset', 'Slot', 'AuthService', 'Payment', 'helpers', '_t',\n function ($rootScope, $uibModal, dialogs, growl, Auth, Price, Wallet, CustomAsset, Slot, AuthService, Payment, helpers, _t) {\n return ({\n restrict: 'E',\n scope: {\n slot: '=',\n slotSelectionTime: '=',\n events: '=',\n user: '=',\n modePlans: '=',\n plan: '=',\n planSelectionTime: '=',\n settings: '=',\n plans: '=',\n groups: '=',\n onSlotAddedToCart: '=',\n onSlotRemovedFromCart: '=',\n onSlotStartToModify: '=',\n onSlotModifySuccess: '=',\n onSlotModifyCancel: '=',\n onSlotModifyUnselect: '=',\n onSlotCancelSuccess: '=',\n afterPayment: '=',\n reservableId: '@',\n reservableType: '@',\n reservableName: '@',\n limitToOneSlot: '@'\n },\n templateUrl: '/shared/_cart.html',\n link ($scope, element, attributes) {\n // will store the user's plan if he chose to buy one\n $scope.selectedPlan = null;\n\n // total amount of the bill to pay\n $scope.amountTotal = 0;\n\n // total amount of the elements in the cart, without considering any coupon\n $scope.totalNoCoupon = 0;\n\n // once the cart was paid, retain the total amount paid by the customer\n $scope.amountPaid = 0;\n\n // Discount coupon to apply to the basket, if any\n $scope.coupon = { applied: null };\n\n // Global config: is the user authorized to change his bookings slots?\n $scope.enableBookingMove = ($scope.settings.booking_move_enable === 'true');\n\n // Global config: delay in hours before a booking while changing the booking slot is forbidden\n $scope.moveBookingDelay = parseInt($scope.settings.booking_move_delay);\n\n // Global config: is the user authorized to cancel his bookings?\n $scope.enableBookingCancel = ($scope.settings.booking_cancel_enable === 'true');\n\n // Global config: delay in hours before a booking while the cancellation is forbidden\n $scope.cancelBookingDelay = parseInt($scope.settings.booking_cancel_delay);\n\n // Payment schedule\n $scope.schedule = {\n requested_schedule: false, // does the user requests a payment schedule for his subscription\n payment_schedule: undefined // the effective computed payment schedule\n };\n\n // online payments (stripe)\n $scope.stripe = {\n showModal: false,\n cartItems: undefined\n };\n\n // currently logged-in user\n $scope.currentUser = $rootScope.currentUser;\n\n /**\n * Add the provided slot to the shopping cart (state transition from free to 'about to be reserved')\n * and increment the total amount of the cart if needed.\n * @param slot {Object} fullCalendar event object\n */\n $scope.validateSlot = function (slot) {\n validateTags(slot, function () {\n validateSameTimeReservations(slot, function () {\n slot.isValid = true;\n updateCartPrice();\n });\n });\n };\n\n /**\n * Remove the provided slot from the shopping cart (state transition from 'about to be reserved' to free)\n * and decrement the total amount of the cart if needed.\n * @param slot {Object} fullCalendar event object\n * @param index {number} index of the slot in the reservation array\n * @param [event] {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.removeSlot = function (slot, index, event) {\n if (event) { event.preventDefault(); }\n $scope.events.reserved.splice(index, 1);\n // if is was the last slot, we remove any plan from the cart\n if ($scope.events.reserved.length === 0) {\n $scope.selectedPlan = null;\n $scope.plan = null;\n $scope.modePlans = false;\n }\n if (typeof $scope.onSlotRemovedFromCart === 'function') { $scope.onSlotRemovedFromCart(slot); }\n return updateCartPrice();\n };\n\n /**\n * Checks that every selected slots were added to the shopping cart. Ie. will return false if\n * any checked slot was not validated by the user.\n */\n $scope.isSlotsValid = function () {\n let isValid = true;\n if ($scope.events) {\n angular.forEach($scope.events.reserved, function (m) {\n if (!m.isValid) {\n return isValid = false;\n }\n });\n }\n return isValid;\n };\n\n /**\n * Switch the user's view from the reservation agenda to the plan subscription\n */\n $scope.showPlans = function () {\n // first, we ensure that a user was selected (admin/manager) or logged (member)\n const isSelectedUser = Object.keys($scope.user).length > 0;\n // all slots are in future\n const areFutureSlots = _.every($scope.events.reserved, function (s) {\n return s.start.isAfter();\n });\n if (isSelectedUser && areFutureSlots) {\n return $scope.modePlans = true;\n } else if (!isSelectedUser) {\n // otherwise we alert, this error musn't occur when the current user hasn't the admin role\n return growl.error(_t('app.shared.cart.please_select_a_member_first'));\n } else if (!areFutureSlots) {\n return growl.error(_t('app.shared.cart.unable_to_select_plan_if_slots_in_the_past'));\n }\n };\n\n /**\n * Validates the shopping chart and redirect the user to the payment step\n */\n $scope.payCart = function () {\n // first, we check that a user was selected\n if (Object.keys($scope.user).length > 0) {\n // check selected user has a subscription, if any slot is restricted for subscriptions\n const slotValidations = [];\n let slotNotValid;\n let slotNotValidError;\n if ($scope.events.reserved) {\n $scope.events.reserved.forEach(function (slot) {\n if (slot.plan_ids.length > 0) {\n if (\n ($scope.selectedPlan && _.includes(slot.plan_ids, $scope.selectedPlan.id)) ||\n ($scope.user.subscribed_plan && _.includes(slot.plan_ids, $scope.user.subscribed_plan.id))\n ) {\n slotValidations.push(true);\n } else {\n slotNotValid = slot;\n if ($scope.selectedPlan && !_.includes(slot.plan_ids, $scope.selectedPlan.id)) {\n slotNotValidError = 'selectedPlanError';\n }\n if ($scope.user.subscribed_plan && !_.includes(slot.plan_ids, $scope.user.subscribed_plan.id)) {\n slotNotValidError = 'userPlanError';\n }\n if (!$scope.selectedPlan || !$scope.user.subscribed_plan) {\n slotNotValidError = 'noPlanError';\n }\n slotValidations.push(false);\n }\n }\n });\n const hasPlanForSlot = slotValidations.every(function (a) {\n return a;\n });\n if (!hasPlanForSlot) {\n if (!AuthService.isAuthorized(['admin', 'manager'])) {\n return growl.error(_t('app.shared.cart.slot_restrict_subscriptions_must_select_plan'));\n } else {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/shared/_reserve_slot_without_plan.html',\n size: 'md',\n controller: 'ReserveSlotWithoutPlanController',\n resolve: {\n slot: function () {\n return slotNotValid;\n },\n slotNotValidError: function () {\n return slotNotValidError;\n }\n }\n });\n modalInstance.result.then(function (res) {\n return paySlots();\n });\n }\n } else {\n return paySlots();\n }\n } else if ($scope.selectedPlan) {\n return paySlots();\n }\n } else {\n // otherwise we alert, this error musn't occur when the current user is not admin or manager\n return growl.error(_t('app.shared.cart.please_select_a_member_first'));\n }\n };\n\n /**\n * When modifying an already booked reservation, confirm the modification.\n */\n $scope.modifySlot = function () {\n Slot.update({ id: $scope.events.modifiable.slot_id }, {\n slot: {\n start_at: $scope.events.placable.start,\n end_at: $scope.events.placable.end,\n availability_id: $scope.events.placable.availability_id\n }\n }\n , function () { // success\n // -> run the callback\n if (typeof $scope.onSlotModifySuccess === 'function') { $scope.onSlotModifySuccess(); }\n // -> set the events as successfully moved (to display a summary)\n $scope.events.moved = {\n newSlot: $scope.events.placable,\n oldSlot: $scope.events.modifiable\n };\n // -> reset the 'moving' status\n $scope.events.placable = null;\n $scope.events.modifiable = null;\n }\n , function (err) { // failure\n growl.error(_t('app.shared.cart.unable_to_change_the_reservation'));\n console.error(err);\n });\n };\n\n /**\n * Cancel the current booking modification, reseting the whole process\n * @param [event] {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.cancelModifySlot = function (event) {\n if (event) { event.preventDefault(); }\n if (typeof $scope.onSlotModifyCancel === 'function') { $scope.onSlotModifyCancel(); }\n $scope.events.placable = null;\n $scope.events.modifiable = null;\n };\n\n /**\n * When modifying an already booked reservation, cancel the choice of the new slot\n * @param e {Object} see https://docs.angularjs.org/guide/expression#-event-\n */\n $scope.removeSlotToPlace = function (e) {\n e.preventDefault();\n if (typeof $scope.onSlotModifyUnselect === 'function') { $scope.onSlotModifyUnselect(); }\n $scope.events.placable = null;\n };\n\n /**\n * Checks if $scope.events.modifiable and $scope.events.placable have tag incompatibilities\n * @returns {boolean} true in case of incompatibility\n */\n $scope.tagMissmatch = function () {\n if ($scope.events.placable.tag_ids.length === 0) { return false; }\n for (const tag of Array.from($scope.events.modifiable.tags)) {\n if (!Array.from($scope.events.placable.tag_ids).includes(tag.id)) {\n return true;\n }\n }\n return false;\n };\n\n /**\n * Check if the currently logged user has the 'admin' role OR the 'manager' role, but is not taking reseravtion for himself\n * @returns {boolean}\n */\n $scope.isAuthorized = function () {\n if (AuthService.isAuthorized('admin')) return true;\n\n if (AuthService.isAuthorized('manager')) {\n return ($rootScope.currentUser.id !== $scope.user.id);\n }\n\n return false;\n };\n\n /**\n * This will update the payment_schedule setting when the user toggles the switch button\n * @param checked {Boolean}\n */\n $scope.togglePaymentSchedule = (checked) => {\n setTimeout(() => {\n $scope.schedule.requested_schedule = checked;\n updateCartPrice();\n $scope.$apply();\n }, 50);\n };\n\n /**\n * This will open/close the stripe payment modal\n */\n $scope.toggleStripeModal = (beforeApply) => {\n setTimeout(() => {\n $scope.stripe.showModal = !$scope.stripe.showModal;\n if (typeof beforeApply === 'function') {\n beforeApply();\n }\n $scope.$apply();\n }, 50);\n };\n\n /**\n * Invoked atfer a successful Stripe payment\n * @param result {*} may be a reservation or a subscription\n */\n $scope.afterStripeSuccess = (result) => {\n $scope.toggleStripeModal();\n afterPayment(result);\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the directive is loaded\n */\n const initialize = function () {\n // What the bound slot\n $scope.$watch('slotSelectionTime', function (newValue, oldValue) {\n if (newValue !== oldValue) {\n slotSelectionChanged();\n }\n });\n $scope.$watch('user', function (newValue, oldValue) {\n if (newValue !== oldValue) {\n resetCartState();\n updateCartPrice();\n }\n });\n $scope.$watch('planSelectionTime', function (newValue, oldValue) {\n if (newValue !== oldValue) {\n planSelectionChanged();\n }\n });\n // watch when a coupon is applied to re-compute the total price\n $scope.$watch('coupon.applied', function (newValue, oldValue) {\n if (newValue !== oldValue) {\n updateCartPrice();\n }\n });\n };\n\n /**\n * Validates that the current slot is reserved by a member with an authorized tag. Admin and managers can overpass\n * the mismatch.\n * @param slot {Object} fullCalendar event object.\n * @param callback {function}\n */\n const validateTags = function (slot, callback) {\n const interTags = _.intersection.apply(null, [slot.tag_ids, $scope.user.tag_ids]);\n if (slot.tag_ids.length === 0 || interTags.length > 0) {\n if (typeof callback === 'function') callback();\n } else {\n // ask confirmation\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/shared/_reserve_slot_tags_mismatch.html',\n size: 'md',\n controller: 'ReserveSlotTagsMismatchController',\n resolve: {\n slotTags: function () { return slot.tags; },\n userTags: function () { return $scope.user.tags; },\n userName: function () { return $scope.user.name; }\n }\n });\n modalInstance.result.then(function (res) {\n if (typeof callback === 'function') callback(res);\n });\n }\n };\n\n /**\n * Validates that no other reservations were made that conflict the current slot and alert the user about the conflict.\n * If the user is an administrator or a manager, he can overpass the conflict.\n * @param slot {Object} fullCalendar event object.\n * @param callback {function}\n */\n const validateSameTimeReservations = function (slot, callback) {\n let sameTimeReservations = [\n 'training_reservations',\n 'machine_reservations',\n 'space_reservations',\n 'events_reservations'\n ].map(function (k) {\n return _.filter($scope.user[k], function (r) {\n return slot.start.isSame(r.start_at) ||\n (slot.end.isAfter(r.start_at) && slot.end.isBefore(r.end_at)) ||\n (slot.start.isAfter(r.start_at) && slot.start.isBefore(r.end_at)) ||\n (slot.start.isBefore(r.start_at) && slot.end.isAfter(r.end_at));\n });\n });\n sameTimeReservations = _.union.apply(null, sameTimeReservations);\n if (sameTimeReservations.length > 0) {\n const modalInstance = $uibModal.open({\n animation: true,\n templateUrl: '/shared/_reserve_slot_same_time.html',\n size: 'md',\n controller: 'ReserveSlotSameTimeController',\n resolve: {\n sameTimeReservations: function () { return sameTimeReservations; },\n bookOverlappingSlotsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'book_overlapping_slots' }).$promise; }]\n }\n });\n modalInstance.result.then(function (res) {\n if (typeof callback === 'function') callback(res);\n });\n } else {\n if (typeof callback === 'function') callback();\n }\n };\n\n /**\n * Callback triggered when the selected slot changed\n */\n const slotSelectionChanged = function () {\n if ($scope.slot) {\n // if this slot is restricted for subscribers...\n if ($scope.slot.plan_ids.length > 0) {\n // ... we select all the plans matching these restrictions...\n const _plans = _.filter($scope.plans, function (p) { return _.includes($scope.slot.plan_ids, p.id); });\n // ... and we group these plans, by Group...\n $scope.slot.plansGrouped = [];\n $scope.slot.group_ids = [];\n for (const group of Array.from($scope.groups)) {\n const groupObj = { id: group.id, name: group.name, plans: [] };\n for (const plan of Array.from(_plans)) {\n if (plan.group_id === group.id) { groupObj.plans.push(plan); }\n }\n if (groupObj.plans.length > 0) {\n // ... Finally, we only keep the plans matching the group of the current user\n // OR all plans if the current user is admin or manager\n if (AuthService.isAuthorized(['admin', 'manager'])) {\n $scope.slot.plansGrouped.push(groupObj);\n } else if ($scope.user.group_id === groupObj.id) {\n $scope.slot.plansGrouped.push(groupObj);\n }\n }\n }\n $scope.slot.group_ids = $scope.slot.plansGrouped.map(function (g) { return g.id; });\n }\n\n if (!$scope.slot.is_reserved && !$scope.events.modifiable && !$scope.slot.is_completed) {\n // slot is not reserved and we are not currently modifying a slot\n // -> can be added to cart or removed if already present\n const index = _.findIndex($scope.events.reserved, (e) => e._id === $scope.slot._id);\n if (index === -1) {\n if (($scope.limitToOneSlot === 'true') && $scope.events.reserved[0]) {\n // if we limit the number of slots in the cart to 1, and there is already\n // a slot in the cart, we remove it before adding the new one\n $scope.removeSlot($scope.events.reserved[0], 0);\n }\n // slot is not in the cart, so we add it\n $scope.events.reserved.push($scope.slot);\n if (typeof $scope.onSlotAddedToCart === 'function') { $scope.onSlotAddedToCart(); }\n } else {\n // slot is in the cart, remove it\n $scope.removeSlot($scope.slot, index);\n }\n // in every cases, because a new reservation has started, we reset the cart content\n resetCartState();\n // finally, we update the prices\n return updateCartPrice();\n } else if (!$scope.slot.is_reserved && !$scope.slot.is_completed && $scope.events.modifiable) {\n // slot is not reserved but we are currently modifying a slot\n // -> we request the calender to change the rendering\n if (typeof $scope.onSlotModifyUnselect === 'function') {\n // if the callback return false, cancel the selection for the current modification\n const res = $scope.onSlotModifyUnselect();\n if (!res) return;\n }\n // -> then, we re-affect the destination slot\n if (!$scope.events.placable || ($scope.events.placable._id !== $scope.slot._id)) {\n return $scope.events.placable = $scope.slot;\n } else {\n return $scope.events.placable = null;\n }\n } else if ($scope.slot.is_reserved && $scope.events.modifiable && ($scope.slot.is_reserved._id === $scope.events.modifiable._id)) {\n // slot is reserved and currently modified\n // -> we cancel the modification\n $scope.cancelModifySlot();\n } else if ($scope.slot.is_reserved && (slotCanBeModified($scope.slot) || slotCanBeCanceled($scope.slot)) && !$scope.events.modifiable && ($scope.events.reserved.length === 0)) {\n // slot is reserved and is ok to be modified or cancelled\n // but we are not currently running a modification or having any slots in the cart\n // -> first affect the modification/cancellation rights attributes to the current slot\n resetCartState();\n $scope.slot.movable = slotCanBeModified($scope.slot);\n $scope.slot.cancelable = slotCanBeCanceled($scope.slot);\n // -> then, we open a dialog to ask to the user to choose an action\n return dialogs.confirm({\n templateUrl: '/shared/confirm_modify_slot_modal.html',\n resolve: {\n object () { return $scope.slot; }\n }\n }\n , function (type) {\n // the user has chosen an action, so we proceed\n if (type === 'move') {\n if (typeof $scope.onSlotStartToModify === 'function') { $scope.onSlotStartToModify(); }\n $scope.events.modifiable = $scope.slot;\n } else if (type === 'cancel') {\n dialogs.confirm(\n {\n resolve: {\n object () {\n return {\n title: _t('app.shared.cart.confirmation_required'),\n msg: _t('app.shared.cart.do_you_really_want_to_cancel_this_reservation_html')\n };\n }\n }\n },\n function () { // cancel confirmed\n Slot.cancel({ id: $scope.slot.slot_id }, function () { // successfully canceled\n growl.success(_t('app.shared.cart.reservation_was_cancelled_successfully'));\n if (typeof $scope.onSlotCancelSuccess === 'function') { return $scope.onSlotCancelSuccess(); }\n }\n , function () { // error while canceling\n growl.error(_t('app.shared.cart.cancellation_failed'));\n });\n }\n );\n }\n });\n }\n }\n };\n\n /**\n * Reset the parameters that may lead to a wrong price but leave the content (events added to cart)\n */\n const resetCartState = function () {\n $scope.selectedPlan = null;\n $scope.paidPlan = null;\n $scope.coupon.applied = null;\n $scope.events.moved = null;\n $scope.events.paid = [];\n $scope.events.modifiable = null;\n $scope.events.placable = null;\n $scope.schedule.requested_schedule = false;\n $scope.schedule.payment_schedule = null;\n };\n\n /**\n * Determines if the provided booked slot is able to be modified by the user.\n * @param slot {Object} fullCalendar event object\n */\n const slotCanBeModified = function (slot) {\n if (AuthService.isAuthorized(['admin', 'manager'])) { return true; }\n const slotStart = moment(slot.start);\n const now = moment();\n return (slot.can_modify && $scope.enableBookingMove && (slotStart.diff(now, 'hours') >= $scope.moveBookingDelay));\n };\n\n /**\n * Determines if the provided booked slot is able to be canceled by the user.\n * @param slot {Object} fullCalendar event object\n */\n const slotCanBeCanceled = function (slot) {\n if (AuthService.isAuthorized(['admin', 'manager'])) { return true; }\n const slotStart = moment(slot.start);\n const now = moment();\n return (slot.can_modify && $scope.enableBookingCancel && (slotStart.diff(now, 'hours') >= $scope.cancelBookingDelay));\n };\n\n /**\n * Callback triggered when the selected slot changed\n */\n const planSelectionChanged = function () {\n if (Auth.isAuthenticated()) {\n if ($scope.selectedPlan !== $scope.plan) {\n $scope.selectedPlan = $scope.plan;\n $scope.schedule.requested_schedule = $scope.plan.monthly_payment;\n } else {\n $scope.selectedPlan = null;\n }\n return updateCartPrice();\n } else {\n return $rootScope.login(null, function () {\n $scope.selectedPlan = $scope.plan;\n return updateCartPrice();\n });\n }\n };\n\n /**\n * Update the total price of the current selection/reservation\n */\n const updateCartPrice = function () {\n if (Object.keys($scope.user).length > 0) {\n const r = mkReservation($scope.user, $scope.events.reserved, $scope.selectedPlan);\n return Price.compute(mkRequestParams({ reservation: r }, $scope.coupon.applied), function (res) {\n $scope.amountTotal = res.price;\n $scope.schedule.payment_schedule = res.schedule;\n $scope.totalNoCoupon = res.price_without_coupon;\n setSlotsDetails(res.details);\n });\n } else {\n // otherwise we alert, this error musn't occur when the current user is not admin\n growl.warning(_t('app.shared.cart.please_select_a_member_first'));\n $scope.amountTotal = null;\n }\n };\n\n const setSlotsDetails = function (details) {\n angular.forEach($scope.events.reserved, function (slot) {\n angular.forEach(details.slots, function (s) {\n if (moment(s.start_at).isSame(slot.start)) {\n slot.promo = s.promo;\n slot.price = s.price;\n }\n });\n });\n };\n\n /**\n * Format the parameters expected by /api/prices/compute or /api/reservations and return the resulting object\n * @param request {{reservation: *}|{subscription: *}} as returned by mkReservation()\n * @param coupon {{code: string}} Coupon as returned from the API\n * @return {CartItems}\n */\n const mkRequestParams = function (request, coupon) {\n return Object.assign({\n coupon_code: ((coupon ? coupon.code : undefined))\n }, request);\n };\n\n /**\n * Create a hash map implementing the Reservation specs\n * @param member {Object} User as retrieved from the API: current user / selected user if current is admin\n * @param slots {Array} Array of fullCalendar events: slots selected on the calendar\n * @param [plan] {Object} Plan as retrieved from the API: plan to buy with the current reservation\n * @return {{reservable_type: string, payment_schedule: boolean, user_id: *, reservable_id: string, slots_attributes: [], plan_id: (*|undefined)}}\n */\n const mkReservation = function (member, slots, plan) {\n const reservation = {\n user_id: member.id,\n reservable_id: $scope.reservableId,\n reservable_type: $scope.reservableType,\n slots_attributes: [],\n plan_id: ((plan ? plan.id : undefined)),\n payment_schedule: $scope.schedule.requested_schedule\n };\n angular.forEach(slots, function (slot) {\n reservation.slots_attributes.push({\n start_at: slot.start,\n end_at: slot.end,\n availability_id: slot.availability_id,\n offered: slot.offered || false\n });\n });\n\n return reservation;\n };\n\n /**\n * Create a hash map implementing the Subscription specs\n * @param planId {number}\n * @param userId {number}\n * @param schedule {boolean}\n * @param method {String} 'stripe' | ''\n * @return {{subscription: {payment_schedule: boolean, user_id: number, plan_id: number}}}\n */\n const mkSubscription = function (planId, userId, schedule, method) {\n return {\n subscription: {\n plan_id: planId,\n user_id: userId,\n payment_schedule: schedule,\n payment_method: method\n }\n };\n };\n\n /**\n * Build the CartItems object, from the current reservation\n * @param reservation {*}\n * @param paymentMethod {string}\n * @return {CartItems}\n */\n const mkCartItems = function (reservation, paymentMethod) {\n let request = { reservation };\n if (reservation.slots_attributes.length === 0 && reservation.plan_id) {\n request = mkSubscription($scope.selectedPlan.id, reservation.user_id, $scope.schedule.requested_schedule, paymentMethod);\n } else {\n request.reservation.payment_method = paymentMethod;\n }\n return mkRequestParams(request, $scope.coupon.applied);\n };\n\n /**\n * Open a modal window that allows the user to process a credit card payment for his current shopping cart.\n */\n const payByStripe = function (reservation) {\n // check that the online payment is enabled\n if ($scope.settings.online_payment_module !== 'true') {\n growl.error(_t('app.shared.cart.online_payment_disabled'));\n } else {\n $scope.toggleStripeModal(() => {\n $scope.stripe.cartItems = mkCartItems(reservation, 'stripe');\n });\n }\n };\n /**\n * Open a modal window that allows the user to process a local payment for his current shopping cart (admin only).\n */\n const payOnSite = function (reservation) {\n $uibModal.open({\n templateUrl: '/shared/valid_reservation_modal.html',\n size: $scope.schedule.payment_schedule ? 'lg' : 'sm',\n resolve: {\n reservation () {\n return reservation;\n },\n price () {\n return Price.compute(mkRequestParams({ reservation }, $scope.coupon.applied)).$promise;\n },\n cartItems () {\n return mkCartItems(reservation, 'stripe');\n },\n wallet () {\n return Wallet.getWalletByUser({ user_id: reservation.user_id }).$promise;\n },\n coupon () {\n return $scope.coupon.applied;\n },\n selectedPlan () {\n return $scope.selectedPlan;\n },\n schedule () {\n return $scope.schedule;\n },\n user () {\n return $scope.user;\n },\n settings () {\n return $scope.settings;\n }\n },\n controller: ['$scope', '$uibModalInstance', '$state', 'reservation', 'price', 'Auth', 'Reservation', 'Subscription', 'wallet', 'helpers', '$filter', 'coupon', 'selectedPlan', 'schedule', 'cartItems', 'user', 'settings',\n function ($scope, $uibModalInstance, $state, reservation, price, Auth, Reservation, Subscription, wallet, helpers, $filter, coupon, selectedPlan, schedule, cartItems, user, settings) {\n // user wallet amount\n $scope.wallet = wallet;\n\n // Global price (total of all items)\n $scope.price = price.price;\n\n // Price to pay (wallet deducted)\n $scope.amount = helpers.getAmountToPay(price.price, wallet.amount);\n\n // Reservation (simple & cartItems format)\n $scope.reservation = reservation;\n $scope.cartItems = cartItems;\n\n // Subscription\n $scope.plan = selectedPlan;\n\n // Used in wallet info template to interpolate some translations\n $scope.numberFilter = $filter('number');\n\n // Shows the schedule info in the modal\n $scope.schedule = schedule.payment_schedule;\n\n // how should we collect payments for the payment schedule\n $scope.method = {\n payment_method: 'stripe'\n };\n\n // \"valid\" Button label\n $scope.validButtonName = '';\n\n // stripe modal state\n // this is used to collect card data when a payment-schedule was selected, and paid with a card\n $scope.isOpenStripeModal = false;\n\n // the customer\n $scope.user = user;\n\n /**\n * Callback to process the local payment, triggered on button click\n */\n $scope.ok = function () {\n if ($scope.schedule && $scope.method.payment_method === 'stripe') {\n // check that the online payment is enabled\n if (settings.online_payment_module !== 'true') {\n return growl.error(_t('app.shared.cart.online_payment_disabled'));\n } else {\n return $scope.toggleStripeModal();\n }\n }\n $scope.attempting = true;\n // save subscription (if there's only a subscription selected)\n if ($scope.reservation.slots_attributes.length === 0 && selectedPlan) {\n const sub = mkSubscription(selectedPlan.id, $scope.reservation.user_id, schedule.requested_schedule, $scope.method.payment_method);\n\n return Subscription.save(mkRequestParams(sub, coupon),\n function (subscription) {\n $uibModalInstance.close(subscription);\n $scope.attempting = true;\n }, function (response) {\n $scope.alerts = [];\n $scope.alerts.push({ msg: _t('app.shared.cart.a_problem_occurred_during_the_payment_process_please_try_again_later'), type: 'danger' });\n $scope.attempting = false;\n });\n }\n // otherwise, save the reservation (may include a subscription)\n const rsrv = Object.assign({}, $scope.reservation, { payment_method: $scope.method.payment_method });\n Reservation.save(mkRequestParams({ reservation: rsrv }, coupon), function (reservation) {\n $uibModalInstance.close(reservation);\n $scope.attempting = true;\n }, function (response) {\n $scope.alerts = [];\n $scope.alerts.push({ msg: _t('app.shared.cart.a_problem_occurred_during_the_payment_process_please_try_again_later'), type: 'danger' });\n $scope.attempting = false;\n });\n };\n /**\n * Callback to close the modal without processing the payment\n */\n $scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };\n\n /**\n * Asynchronously updates the status of the stripe modal\n */\n $scope.toggleStripeModal = function () {\n setTimeout(() => {\n $scope.isOpenStripeModal = !$scope.isOpenStripeModal;\n $scope.$apply();\n }, 50);\n };\n\n /**\n * After creating a payment schedule by card, from an administrator.\n * @param result {*} Reservation or Subscription\n */\n $scope.afterCreatePaymentSchedule = function (result) {\n $scope.toggleStripeModal();\n $uibModalInstance.close(result);\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Kind of constructor: these actions will be realized first when the directive is loaded\n */\n const initialize = function () {\n $scope.$watch('method.payment_method', function (newValue) {\n $scope.validButtonName = computeValidButtonName();\n $scope.cartItems = mkCartItems($scope.reservation, newValue);\n });\n };\n\n /**\n * Compute the Label of the confirmation button\n */\n const computeValidButtonName = function () {\n let method = '';\n if ($scope.schedule) {\n if (AuthService.isAuthorized(['admin', 'manager']) && $rootScope.currentUser.id !== reservation.user_id) {\n method = $scope.method.payment_method;\n } else {\n method = 'stripe';\n }\n }\n if ($scope.amount > 0) {\n return _t('app.shared.cart.confirm_payment_of_html', { METHOD: method, AMOUNT: $filter('currency')($scope.amount) });\n } else {\n if ((price.price > 0) && ($scope.wallet.amount === 0)) {\n return _t('app.shared.cart.confirm_payment_of_html', { METHOD: method, AMOUNT: $filter('currency')(price.price) });\n } else {\n return _t('app.shared.buttons.confirm');\n }\n }\n };\n\n // # !!! MUST BE CALLED AT THE END of the controller\n initialize();\n }\n ]\n }).result.finally(null).then(function (reservation) { afterPayment(reservation); });\n };\n\n /**\n * Actions to run after the payment was successful\n * @param paymentResult {*} may be a reservation or a subscription\n */\n const afterPayment = function (paymentResult) {\n // we set the cart content as 'paid' to display a summary of the transaction\n $scope.events.paid = $scope.events.reserved;\n $scope.amountPaid = $scope.amountTotal;\n // we call the external callback if present\n if (typeof $scope.afterPayment === 'function') { $scope.afterPayment(paymentResult); }\n // we reset the coupon, and the cart content, and we unselect the slot\n $scope.coupon.applied = undefined;\n if ($scope.slot) {\n // reservation (+ subscription)\n $scope.slot = undefined;\n $scope.events.reserved = [];\n } else {\n // subscription only\n $scope.events = {};\n }\n $scope.paidPlan = $scope.selectedPlan;\n $scope.selectedPlan = undefined;\n $scope.schedule.requested_schedule = false;\n $scope.schedule.payment_schedule = undefined;\n };\n\n /**\n * Actions to pay slots\n */\n const paySlots = function () {\n const reservation = mkReservation($scope.user, $scope.events.reserved, $scope.selectedPlan);\n\n return Wallet.getWalletByUser({ user_id: $scope.user.id }, function (wallet) {\n const amountToPay = helpers.getAmountToPay($scope.amountTotal, wallet.amount);\n if ((AuthService.isAuthorized(['member']) && (amountToPay > 0 || (amountToPay === 0 && hasOtherDeadlines()))) ||\n (AuthService.isAuthorized('manager') && $scope.user.id === $rootScope.currentUser.id && amountToPay > 0)) {\n return payByStripe(reservation);\n } else {\n if (AuthService.isAuthorized(['admin']) ||\n (AuthService.isAuthorized('manager') && $scope.user.id !== $rootScope.currentUser.id) ||\n (amountToPay === 0 && !hasOtherDeadlines())) {\n return payOnSite(reservation);\n }\n }\n });\n };\n\n /**\n * Check if the later deadlines of the payment schedule exists and are not equal to zero\n * @return {boolean}\n */\n const hasOtherDeadlines = function () {\n if (!$scope.schedule.payment_schedule) return false;\n if ($scope.schedule.payment_schedule.items.length < 2) return false;\n return $scope.schedule.payment_schedule.items[1].amount !== 0;\n };\n\n // !!! MUST BE CALLED AT THE END of the directive\n return initialize();\n }\n });\n }\n]);\n\n/**\n * Controller of the modal showing the reservations the same date at the same time\n */\nApplication.Controllers.controller('ReserveSlotSameTimeController', ['$scope', '$uibModalInstance', 'AuthService', 'sameTimeReservations', 'bookOverlappingSlotsPromise',\n function ($scope, $uibModalInstance, AuthService, sameTimeReservations, bookOverlappingSlotsPromise) {\n $scope.sameTimeReservations = sameTimeReservations;\n $scope.bookSlotAtSameTime = (bookOverlappingSlotsPromise.setting.value === 'true');\n $scope.isAuthorized = AuthService.isAuthorized;\n /**\n * Confirmation callback\n */\n $scope.ok = function () {\n $uibModalInstance.close({});\n };\n /**\n * Cancellation callback\n */\n $scope.cancel = function () {\n $uibModalInstance.dismiss('cancel');\n };\n }\n]);\n\n/**\n * Controller of the modal showing the slot tags\n */\nApplication.Controllers.controller('ReserveSlotTagsMismatchController', ['$scope', '$uibModalInstance', 'AuthService', 'slotTags', 'userTags', 'userName',\n function ($scope, $uibModalInstance, AuthService, slotTags, userTags, userName) {\n $scope.slotTags = slotTags;\n $scope.userTags = userTags;\n $scope.userName = userName;\n $scope.isAuthorized = AuthService.isAuthorized;\n /**\n * Confirmation callback\n */\n $scope.ok = function () {\n $uibModalInstance.close({});\n };\n /**\n * Cancellation callback\n */\n $scope.cancel = function () {\n $uibModalInstance.dismiss('cancel');\n };\n }\n]);\n\n/**\n * Controller used to alert admin reserve slot without plan\n */\nApplication.Controllers.controller('ReserveSlotWithoutPlanController', ['$scope', '$uibModalInstance', 'slot', 'slotNotValidError', 'growl', '_t',\n function ($scope, $uibModalInstance, slot, slotNotValidError, growl, _t) {\n $scope.slot = slot;\n $scope.slotNotValidError = slotNotValidError;\n /**\n * Confirmation callback\n */\n $scope.ok = function () {\n $uibModalInstance.close({});\n };\n /**\n * Cancellation callback\n */\n $scope.cancel = function () {\n $uibModalInstance.dismiss('cancel');\n };\n }\n]);\n","Application.Directives.directive('compile', ['$compile', function ($compile) {\n return function (scope, element, attrs) {\n scope.$watch(\n function (scope) {\n // watch the 'compile' expression for changes\n return scope.$eval(attrs.compile);\n },\n function (value) {\n // when the 'compile' expression changes\n // assign it into the current DOM\n element.html(value);\n\n // compile the new DOM and link it to the current\n // scope.\n // NOTE: we only compile .childNodes so that\n // we don't get into infinite loop compiling ourselves\n $compile(element.contents())(scope);\n }\n );\n };\n}]);\n","/* eslint-disable\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nApplication.Directives.directive('confirmationNeeded', [() =>\n ({\n priority: 1,\n terminal: true,\n link (scope, element, attrs) {\n const msg = attrs.confirmationNeeded || 'Are you sure?';\n const clickAction = attrs.ngClick;\n return element.bind('click', function () {\n if (attrs.confirmationNeededIf != null) {\n const confirmNeededIf = scope.$eval(attrs.confirmationNeededIf);\n if (confirmNeededIf === true) {\n if (window.confirm(msg)) {\n return scope.$eval(clickAction);\n }\n } else {\n return scope.$eval(clickAction);\n }\n } else {\n if (window.confirm(msg)) {\n return scope.$eval(clickAction);\n }\n }\n });\n }\n })\n\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nApplication.Directives.directive('coupon', [ '$rootScope', 'Coupon', '_t', function ($rootScope, Coupon, _t) {\n return ({\n restrict: 'E',\n scope: {\n show: '=',\n coupon: '=',\n total: '=',\n userId: '@'\n },\n templateUrl: '/shared/_coupon.html',\n link ($scope, element, attributes) {\n // Whether code input is shown or not (ie. the link 'I have a coupon' is shown)\n $scope.code =\n { input: false };\n\n // Available status are: 'pending', 'valid', 'invalid'\n $scope.status = 'pending';\n\n // Binding for the code inputed (see the attached template)\n $scope.couponCode = null;\n\n // Code validation messages\n $scope.messages = [];\n\n // Re-compute if the code can be applied when the total of the cart changes\n $scope.$watch('total', function (newValue, oldValue) {\n if (newValue && (newValue !== oldValue) && $scope.couponCode) {\n return $scope.validateCode();\n }\n });\n\n /**\n * Callback to validate the code\n */\n $scope.validateCode = function () {\n $scope.messages = [];\n if ($scope.couponCode === '') {\n $scope.status = 'pending';\n $scope.coupon = null;\n } else {\n Coupon.validate({ code: $scope.couponCode, user_id: $scope.userId, amount: $scope.total }, function (res) {\n $scope.status = 'valid';\n $scope.coupon = res;\n if (res.type === 'percent_off') {\n $scope.messages.push({ type: 'success', message: _t('app.shared.coupon_input.the_coupon_has_been_applied_you_get_PERCENT_discount', { PERCENT: res.percent_off }) });\n } else {\n $scope.messages.push({ type: 'success', message: _t('app.shared.coupon_input.the_coupon_has_been_applied_you_get_AMOUNT_CURRENCY', { AMOUNT: res.amount_off, CURRENCY: $rootScope.currencySymbol }) });\n }\n if (res.validity_per_user === 'once') {\n $scope.messages.push({ type: 'warning', message: _t('app.shared.coupon_input.coupon_validity_once') });\n }\n }\n , function (err) {\n $scope.status = 'invalid';\n $scope.coupon = null;\n return $scope.messages.push({ type: 'danger', message: _t(`app.shared.coupon_input.unable_to_apply_the_coupon_because_${err.data.status}`) });\n });\n }\n };\n\n /**\n * Callback to remove the message at provided index from the displayed list\n */\n $scope.closeMessage = function (index) { $scope.messages.splice(index, 1); };\n }\n });\n}]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\nApplication.Directives.directive('fileread', [ () =>\n ({\n scope: {\n fileread: '='\n },\n\n link (scope, element, attributes) {\n return element.bind('change', changeEvent =>\n scope.$apply(() => scope.fileread = changeEvent.target.files[0])\n );\n }\n })\n\n]);\n\n// This `bsHolder` angular directive is a workaround for\n// an incompatability between angular and the holder.js\n// image placeholder library.\n//\n// To use, simply define `bs-holder` on any element\nApplication.Directives.directive('bsHolder', [ () =>\n ({\n link (scope, element, attrs) {\n Holder.addTheme('icon', { background: 'white', foreground: '#e9e9e9', size: 80, font: 'FontAwesome' })\n .addTheme('icon-xs', { background: 'white', foreground: '#e0e0e0', size: 20, font: 'FontAwesome' })\n .addTheme('icon-black-xs', { background: 'black', foreground: 'white', size: 20, font: 'FontAwesome' })\n .addTheme('avatar', { background: '#eeeeee', foreground: '#555555', size: 16, font: 'FontAwesome' })\n .run(element[0]);\n }\n })\n\n]);\n\nApplication.Directives.directive('match', [ () =>\n ({\n require: 'ngModel',\n restrict: 'A',\n scope: {\n match: '='\n },\n link (scope, elem, attrs, ctrl) {\n return scope.$watch(() => (ctrl.$pristine && angular.isUndefined(ctrl.$modelValue)) || (scope.match === ctrl.$modelValue)\n , currentValue => ctrl.$setValidity('match', currentValue));\n }\n })\n\n]);\n\nApplication.Directives.directive('publishProject', [ () =>\n ({\n restrict: 'A',\n link (scope, elem, attrs, ctrl) {\n return elem.bind('click', function ($event) {\n if ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n }\n\n if (elem.attr('disabled')) { return; }\n const input = angular.element('');\n const form = angular.element('form');\n form.append(input);\n form.triggerHandler('submit');\n return form[0].submit();\n });\n }\n })\n\n]);\n\nApplication.Directives.directive('disableAnimation', ['$animate', ($animate) =>\n ({\n restrict: 'A',\n link (scope, elem, attrs) {\n return attrs.$observe('disableAnimation', value => $animate.enabled(elem, !value));\n }\n })\n]);\n\n/**\n * Isolate a form's scope from its parent : no nested validation\n * @see https://stackoverflow.com/a/37481846/1039377\n */\nApplication.Directives.directive('isolateForm', [ () =>\n ({\n restrict: 'A',\n require: '?form',\n link (scope, elm, attrs, ctrl) {\n if (!ctrl) { return; }\n\n const parentForm = ctrl.$$parentForm; // Note this uses private API\n if (!parentForm) {\n return;\n }\n\n // Remove this form from parent controller\n parentForm.$removeControl(ctrl);\n }\n\n })\n\n]);\n","/* eslint-disable\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nApplication.Directives.directive('fabUserAvatar', [ function () {\n return ({\n restrict: 'E',\n scope: {\n userAvatar: '=ngModel',\n avatarClass: '@'\n },\n templateUrl: '/shared/_user_avatar.html'\n });\n}]);\n","Application.Directives.directive('events', [ 'Event',\n function (Event) {\n return ({\n restrict: 'E',\n templateUrl: '/home/events.html',\n link ($scope, element, attributes) {\n // The closest upcoming events\n $scope.upcomingEvents = null;\n\n /**\n * Test if the provided event run on a single day or not\n * @param event {Object} single event from the $scope.upcomingEvents array\n * @returns {boolean} false if the event runs on more that 1 day\n */\n $scope.isOneDayEvent = function(event) {\n return moment(event.start_date).isSame(event.end_date, 'day');\n }\n\n // constructor\n const initialize = function () {\n Event.upcoming({ limit: 3 }, function (data) {\n $scope.upcomingEvents = data;\n })\n };\n\n // !!! MUST BE CALLED AT THE END of the directive\n return initialize();\n }\n });\n }\n]);\n","Application.Directives.directive('news', [ 'Setting',\n function (Setting) {\n return ({\n restrict: 'E',\n templateUrl: '/home/news.html',\n link ($scope, element, attributes) {\n // The admin blogpost\n $scope.homeBlogpost = null;\n\n // constructor\n const initialize = function () {\n Setting.get({ name: 'home_blogpost' }, function (data) {\n $scope.homeBlogpost = data.setting.value;\n })\n };\n\n // !!! MUST BE CALLED AT THE END of the directive\n return initialize();\n }\n });\n }\n]);\n","Application.Directives.directive('projects', [ 'Project',\n function (Project) {\n return ({\n restrict: 'E',\n templateUrl: '/home/projects.html',\n link ($scope, element, attributes) {\n // The last projects published/documented on the platform\n $scope.lastProjects = null;\n\n // The default slide shown in the carousel\n $scope.activeSlide = 0;\n\n // constructor\n const initialize = function () {\n Project.lastPublished(function (data) {\n $scope.lastProjects = data;\n })\n };\n\n // !!! MUST BE CALLED AT THE END of the directive\n return initialize();\n }\n });\n }\n]);\n","/* global twitterFetcher */\n\n/**\n * This directive will show the last tweet.\n * Usage: \n */\nApplication.Directives.directive('twitter', ['Setting',\n function (Setting) {\n return ({\n restrict: 'E',\n templateUrl: '/home/twitter.html',\n link ($scope, element, attributes) {\n // Twitter username\n $scope.twitterName = null;\n\n // constructor\n const initialize = function () {\n Setting.get({ name: 'twitter_name' }, function (data) {\n $scope.twitterName = data.setting.value;\n if ($scope.twitterName) {\n const configProfile = {\n 'profile': { 'screenName': $scope.twitterName },\n 'domId': 'twitter',\n 'maxTweets': 1,\n 'enableLinks': true,\n 'showUser': false,\n 'showTime': true,\n 'showImages': false,\n 'showRetweet': true,\n 'showInteraction': false,\n 'lang': Fablab.locale\n };\n twitterFetcher.fetch(configProfile);\n }\n })\n };\n\n // !!! MUST BE CALLED AT THE END of the directive\n return initialize();\n }\n });\n }\n]);\n","Application.Directives.directive('members', [ 'Member',\n function (Member) {\n return ({\n restrict: 'E',\n templateUrl: '/home/members.html',\n link ($scope, element, attributes) {\n // The last registered members who confirmed their addresses\n $scope.lastMembers = null;\n\n // constructor\n const initialize = function () {\n Member.lastSubscribed({ limit: 4 }, function (data) {\n $scope.lastMembers = data;\n })\n };\n\n // !!! MUST BE CALLED AT THE END of the directive\n return initialize();\n }\n });\n }\n]);\n","Application.Directives.directive('postRender', [ '$timeout',\n function ($timeout) {\n return ({\n restrict: 'A',\n terminal: false,\n transclude: false,\n link: function (scope, element, attrs) {\n $timeout(scope[attrs.postRender], 0);\n }\n });\n }\n]);\n","'use strict';\n\n/**\n * This directive will allow to select a member.\n * Please surround it with a ng-if directive to prevent it from being used by a non-admin user.\n * The resulting member will be set into the parent $scope (=> $scope.ctrl.member).\n * The directive takes an optional parameter \"subscription\" as a \"boolean string\" that will filter the user\n * which have a valid running subscription or not.\n * Usage: \n */\nApplication.Directives.directive('selectMember', [ 'Diacritics', 'Member', function (Diacritics, Member) {\n return ({\n restrict: 'E',\n templateUrl: '/shared/_member_select.html',\n link (scope, element, attributes) {\n return scope.autoCompleteName = function (nameLookup) {\n if (!nameLookup) {\n return;\n }\n scope.isLoadingMembers = true;\n const asciiName = Diacritics.remove(nameLookup);\n\n const q = { query: asciiName };\n if (attributes.subscription) {\n q['subscription'] = attributes.subscription;\n }\n\n Member.search(q, function (users) {\n scope.matchingMembers = users;\n scope.isLoadingMembers = false;\n }\n , function (error) { console.error(error); });\n };\n }\n\n });\n}]);\n","Application.Directives.directive('booleanSetting', ['Setting', 'growl', '_t',\n function (Setting, growl, _t) {\n return ({\n restrict: 'E',\n scope: {\n name: '@',\n label: '@',\n settings: '=',\n classes: '@',\n onBeforeSave: '='\n },\n templateUrl: '/admin/settings/boolean.html',\n link ($scope, element, attributes) {\n // The setting\n $scope.setting = {\n name: $scope.name,\n value: ($scope.settings[$scope.name] === 'true')\n };\n\n // ID of the html input\n $scope.id = `setting-${$scope.setting.name}`;\n\n /**\n * This will update the value when the user toggles the switch button\n * @param checked {Boolean}\n */\n $scope.toggleSetting = (checked) => {\n setTimeout(() => {\n $scope.setting.value = checked;\n $scope.$apply();\n }, 50);\n };\n\n /**\n * This will force the component to update, and the child react component to re-render\n */\n $scope.refreshComponent = () => {\n $scope.$apply();\n };\n\n /**\n * Callback to save the setting value to the database\n * @param setting {{value:*, name:string}} note that the value will be stringified\n */\n $scope.save = function (setting) {\n if (typeof $scope.onBeforeSave === 'function') {\n const res = $scope.onBeforeSave(setting);\n if (res && _.isFunction(res.then)) {\n // res is a promise, wait for it before proceed\n res.then(function (success) {\n if (success) saveValue(setting);\n else resetValue();\n }, function () {\n resetValue();\n });\n } else {\n if (res) saveValue(setting);\n else resetValue();\n }\n } else {\n saveValue(setting);\n }\n };\n\n /* PRIVATE SCOPE */\n\n /**\n * Save the setting's new value in DB\n * @param setting\n */\n const saveValue = function (setting) {\n const value = setting.value.toString();\n\n Setting.update(\n { name: setting.name },\n { value },\n function () {\n growl.success(_t('app.admin.settings.customization_of_SETTING_successfully_saved', { SETTING: _t(`app.admin.settings.${setting.name}`) }));\n $scope.settings[$scope.name] = value;\n },\n function (error) {\n if (error.status === 304) return;\n\n if (error.status === 423) {\n growl.error(_t('app.admin.settings.error_SETTING_locked', { SETTING: _t(`app.admin.settings.${setting.name}`) }));\n return;\n }\n\n growl.error(_t('app.admin.settings.an_error_occurred_saving_the_setting'));\n console.log(error);\n }\n );\n };\n\n /**\n * Reset the value of the setting to its original state (when the component loads)\n */\n const resetValue = function () {\n $scope.setting.value = $scope.settings[$scope.name] === 'true';\n };\n }\n });\n }\n]);\n","Application.Directives.directive('numberSetting', ['Setting', 'growl', '_t',\n function (Setting, growl, _t) {\n return ({\n restrict: 'E',\n scope: {\n name: '@',\n label: '@',\n settings: '=',\n classes: '@',\n faIcon: '@',\n helperText: '@',\n min: '@',\n required: '<'\n },\n templateUrl: '/admin/settings/number.html',\n link ($scope, element, attributes) {\n // The setting\n $scope.setting = {\n name: $scope.name,\n value: parseInt($scope.settings[$scope.name], 10)\n };\n\n /**\n * Callback to save the setting value to the database\n * @param setting {{value:*, name:string}} note that the value will be stringified\n */\n $scope.save = function (setting) {\n let value;\n if (typeof setting.value === 'number') {\n value = setting.value.toString();\n } else {\n ({ value } = setting);\n }\n\n Setting.update(\n { name: setting.name },\n { value },\n function () {\n growl.success(_t('app.admin.settings.customization_of_SETTING_successfully_saved', { SETTING: _t(`app.admin.settings.${setting.name}`) }));\n $scope.settings[$scope.name] = value;\n },\n function (error) {\n if (error.status === 304) return;\n\n if (error.status === 423) {\n growl.error(_t('app.admin.settings.error_SETTING_locked', { SETTING: _t(`app.admin.settings.${setting.name}`) }));\n return;\n }\n\n growl.error(_t('app.admin.settings.an_error_occurred_saving_the_setting'));\n console.log(error);\n }\n );\n };\n }\n });\n }\n]);\n","Application.Directives.directive('selectMultipleSetting', ['Setting', 'growl', '_t', '$uibModal',\n function (Setting, growl, _t, $uibModal) {\n return ({\n restrict: 'E',\n scope: {\n name: '@',\n label: '@',\n settings: '=',\n classes: '@',\n required: '<',\n titleNew: '@',\n descriptionNew: '@',\n beforeAdd: '='\n },\n templateUrl: '/admin/settings/select-multiple.html',\n link ($scope, element, attributes) {\n // The setting\n $scope.setting = {\n name: $scope.name,\n value: $scope.settings[$scope.name]\n };\n\n // the options\n $scope.options = $scope.settings[$scope.name].split(' ');\n\n // the selected options\n $scope.selection = [];\n\n /**\n * Remove the items in the selection from the options and update setting.value\n */\n $scope.removeItem = function () {\n const options = $scope.options.filter(function (opt) {\n return $scope.selection.indexOf(opt) < 0;\n });\n $scope.options = options;\n $scope.setting.value = options.join(' ');\n growl.success(_t('app.admin.settings.COUNT_items_removed', { COUNT: $scope.selection.length }));\n $scope.selection = [];\n };\n\n /**\n * Open a modal dialog asking for the value of a new item to add\n */\n $scope.addItem = function () {\n $uibModal.open({\n templateUrl: '/admin/settings/newSelectOption.html',\n resolve: {\n titleNew: function () { return $scope.titleNew; },\n descriptionNew: function () { return $scope.descriptionNew; }\n },\n controller: ['$scope', '$uibModalInstance', 'titleNew', 'descriptionNew',\n function ($scope, $uibModalInstance, titleNew, descriptionNew) {\n $scope.value = undefined;\n $scope.titleNew = titleNew;\n $scope.descriptionNew = descriptionNew;\n $scope.ok = function () {\n $uibModalInstance.close($scope.value);\n };\n $scope.dismiss = function () {\n $uibModalInstance.dismiss('cancel');\n };\n }]\n }).result.finally(null).then(function (val) {\n const options = Array.from($scope.options);\n if (typeof $scope.beforeAdd === 'function') { val = $scope.beforeAdd(val); }\n options.push(val);\n $scope.options = options;\n $scope.setting.value = options.join(' ');\n growl.success(_t('app.admin.settings.item_added'));\n });\n };\n\n /**\n * Callback to save the setting value to the database\n * @param setting {{value:*, name:string}} note that the value will be stringified\n */\n $scope.save = function (setting) {\n const { value } = setting;\n\n Setting.update(\n { name: setting.name },\n { value },\n function () {\n growl.success(_t('app.admin.settings.customization_of_SETTING_successfully_saved', { SETTING: _t(`app.admin.settings.${setting.name}`) }));\n $scope.settings[$scope.name] = value;\n },\n function (error) {\n if (error.status === 304) return;\n\n if (error.status === 423) {\n growl.error(_t('app.admin.settings.error_SETTING_locked', { SETTING: _t(`app.admin.settings.${setting.name}`) }));\n return;\n }\n\n growl.error(_t('app.admin.settings.an_error_occurred_saving_the_setting'));\n console.log(error);\n }\n );\n };\n }\n });\n }\n]);\n","Application.Directives.directive('selectSetting', ['Setting', 'growl', '_t',\n function (Setting, growl, _t) {\n return ({\n restrict: 'E',\n scope: {\n name: '@',\n label: '@',\n settings: '=',\n classes: '@',\n required: '<',\n option1: '<',\n option2: '<',\n option3: '<',\n option4: '<',\n option5: '<'\n },\n templateUrl: '/admin/settings/select.html',\n link ($scope, element, attributes) {\n // The setting\n $scope.setting = {\n name: $scope.name,\n value: $scope.settings[$scope.name]\n };\n\n /**\n * Callback to save the setting value to the database\n * @param setting {{value:*, name:string}} note that the value will be stringified\n */\n $scope.save = function (setting) {\n let { value } = setting;\n\n Setting.update(\n { name: setting.name },\n { value },\n function () {\n growl.success(_t('app.admin.settings.customization_of_SETTING_successfully_saved', { SETTING: _t(`app.admin.settings.${setting.name}`) }));\n $scope.settings[$scope.name] = value;\n },\n function (error) {\n if (error.status === 304) return;\n\n if (error.status === 423) {\n growl.error(_t('app.admin.settings.error_SETTING_locked', { SETTING: _t(`app.admin.settings.${setting.name}`) }));\n return;\n }\n\n growl.error(_t('app.admin.settings.an_error_occurred_saving_the_setting'));\n console.log(error);\n }\n );\n };\n }\n });\n }\n]);\n","Application.Directives.directive('textSetting', ['Setting', 'growl', '_t',\n function (Setting, growl, _t) {\n return ({\n restrict: 'E',\n scope: {\n name: '@',\n label: '@',\n settings: '=',\n classes: '@',\n faIcon: '@',\n placeholder: '@',\n required: '<',\n type: '@',\n maxLength: '@',\n minLength: '@',\n readOnly: '<'\n },\n templateUrl: '/admin/settings/text.html',\n link ($scope, element, attributes) {\n // if type is not specified, use text as default\n if (typeof $scope.type === 'undefined') {\n $scope.type = 'text';\n }\n // The setting\n $scope.setting = {\n name: $scope.name,\n value: $scope.settings[$scope.name]\n };\n\n $scope.$watch(`settings.${$scope.name}`, function (newValue, oldValue, scope) {\n if (newValue !== oldValue) {\n $scope.setting.value = newValue;\n }\n });\n\n /**\n * Callback to save the setting value to the database\n * @param setting {{value:*, name:string}} note that the value will be stringified\n */\n $scope.save = function (setting) {\n let { value } = setting;\n\n Setting.update(\n { name: setting.name },\n { value },\n function () {\n growl.success(_t('app.admin.settings.customization_of_SETTING_successfully_saved', { SETTING: _t(`app.admin.settings.${setting.name}`) }));\n $scope.settings[$scope.name] = value;\n },\n function (error) {\n if (error.status === 304) return;\n\n if (error.status === 423) {\n growl.error(_t('app.admin.settings.error_SETTING_locked', { SETTING: _t(`app.admin.settings.${setting.name}`) }));\n return;\n }\n\n growl.error(_t('app.admin.settings.an_error_occurred_saving_the_setting'));\n console.log(error);\n }\n );\n };\n }\n });\n }\n]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nApplication.Directives.directive('socialLink', [ function () {\n return ({\n restrict: 'E',\n scope: {\n network: '@?',\n user: '='\n },\n templateUrl: '/shared/_social_link.html',\n link (scope, element, attributes) {\n if (scope.network === 'dailymotion') {\n scope.image = \"social/dailymotion.png\";\n return scope.altText = 'd';\n } else if (scope.network === 'echosciences') {\n scope.image = \"social/echosciences.png\";\n return scope.altText = 'E)';\n } else {\n if (scope.network === 'website') {\n return scope.faClass = 'fa-globe';\n } else {\n return scope.faClass = `fa-${scope.network.replace('_', '-')}`;\n }\n }\n }\n });\n}]);\n","/* global Stripe */\n\n/**\n * This directive allows to extend a form with the Stripe payment input and error handling area.\n * Strong-customer authentication is supported.\n * --\n * https://stripe.com/docs/payments/payment-intents/web-manual\n */\nApplication.Directives.directive('stripeForm', ['Payment', 'growl', '_t',\n function (Payment, growl, _t) {\n return ({\n restrict: 'A',\n scope: {\n cartItems: '=',\n onPaymentSuccess: '=',\n stripeKey: '@'\n },\n link: function ($scope, element, attributes) {\n const stripe = Stripe($scope.stripeKey);\n const elements = stripe.elements();\n\n const style = {\n base: {\n color: '#32325d',\n fontFamily: '\"Helvetica Neue\", Helvetica, sans-serif',\n fontSmoothing: 'antialiased',\n fontSize: '16px',\n '::placeholder': {\n color: '#aab7c4'\n }\n },\n invalid: {\n color: '#fa755a',\n iconColor: '#fa755a'\n }\n };\n\n const card = elements.create('card', { style, hidePostalCode: true });\n\n card.addEventListener('change', function ({ error }) {\n const displayError = document.getElementById('card-errors');\n if (error) {\n displayError.textContent = error.message;\n } else {\n displayError.textContent = '';\n }\n });\n\n // Add an instance of the card Element into the `card-element`
.\n const form = angular.element(element);\n const cardElement = form.find('#card-element');\n card.mount(cardElement[0]);\n\n form.bind('submit', function () {\n const button = form.find('button');\n button.prop('disabled', true);\n\n stripe.createPaymentMethod('card', card).then(function ({ paymentMethod, error }) {\n if (error) {\n growl.error(error.message);\n button.prop('disabled', false);\n } else {\n // Send paymentMethod.id to your server (see Step 2)\n Payment.confirm({ payment_method_id: paymentMethod.id, cart_items: $scope.cartItems }, function (response) {\n // Handle server response (see Step 3)\n handleServerResponse(response, button);\n }, function (error) { handleServerResponse({ error }, button); });\n }\n });\n });\n\n function handleServerResponse (response, confirmButton) {\n if (response.error) {\n if (response.error.statusText) {\n growl.error(response.error.statusText);\n } else {\n growl.error(`${_t('app.shared.messages.payment_card_error')} ${response.error}`);\n }\n confirmButton.prop('disabled', false);\n } else if (response.requires_action) {\n // Use Stripe.js to handle required card action\n stripe.handleCardAction(\n response.payment_intent_client_secret\n ).then(function (result) {\n if (result.error) {\n growl.error(result.error.message);\n confirmButton.prop('disabled', false);\n } else {\n // The card action has been handled\n // The PaymentIntent can be confirmed again on the server\n Payment.confirm({ payment_intent_id: result.paymentIntent.id, cart_items: $scope.cartItems }, function (confirmResult) {\n handleServerResponse(confirmResult, confirmButton);\n }, function (error) { handleServerResponse({ error }, confirmButton); });\n }\n });\n } else {\n $scope.onPaymentSuccess(response);\n }\n }\n }\n });\n }]);\n","/* eslint-disable\n no-return-assign,\n no-undef,\n no-useless-escape,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\nApplication.Directives.directive('url', [ function () {\n const URL_REGEXP = /^(https?:\\/\\/)([\\da-z\\.-]+)\\.([-a-z0-9\\.]{2,30})([\\/\\w \\.-]*)*\\/?$/;\n return {\n require: 'ngModel',\n link (scope, element, attributes, ctrl) {\n return ctrl.$validators.url = function (modelValue, viewValue) {\n if (ctrl.$isEmpty(modelValue)) {\n return true;\n }\n if (URL_REGEXP.test(viewValue)) {\n return true;\n }\n\n // otherwise, this is invalid\n return false;\n };\n }\n };\n}\n]);\n\nApplication.Directives.directive('endpoint', [ function () {\n const ENDPOINT_REGEXP = /^\\/?([-._~:?#\\[\\]@!$&'()*+,;=%\\w]+\\/?)*$/;\n return {\n require: 'ngModel',\n link (scope, element, attributes, ctrl) {\n return ctrl.$validators.endpoint = function (modelValue, viewValue) {\n if (ctrl.$isEmpty(modelValue)) {\n return true;\n }\n if (ENDPOINT_REGEXP.test(viewValue)) {\n return true;\n }\n\n // otherwise, this is invalid\n return false;\n };\n }\n };\n}\n]);\n","/* eslint-disable\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n'use strict';\n\nApplication.Filters.filter('array', [function () {\n return function (arrayLength) {\n if (arrayLength) {\n arrayLength = Math.ceil(arrayLength);\n const arr = new Array(arrayLength);\n\n for (let i = 0, end = arrayLength, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n arr[i] = i;\n }\n\n return arr;\n }\n };\n}]);\n\n// filter for projects and trainings\nApplication.Filters.filter('machineFilter', [function () {\n return function (elements, selectedMachine) {\n if (!angular.isUndefined(elements) && !angular.isUndefined(selectedMachine) && (elements != null) && (selectedMachine != null)) {\n const filteredElements = [];\n angular.forEach(elements, function (element) {\n if (element.machine_ids.indexOf(selectedMachine) !== -1) {\n return filteredElements.push(element);\n }\n });\n return filteredElements;\n } else {\n return elements;\n }\n };\n}]);\n\nApplication.Filters.filter('projectMemberFilter', ['Auth', function (Auth) {\n return function (projects, selectedMember) {\n if (!angular.isUndefined(projects) && angular.isDefined(selectedMember) && (projects != null) && (selectedMember != null) && (selectedMember !== '')) {\n const filteredProject = [];\n // Mes projets\n if (selectedMember === '0') {\n angular.forEach(projects, function (project) {\n if (project.author_id === Auth._currentUser.id) {\n return filteredProject.push(project);\n }\n });\n // les projets auxquels je collabore\n } else {\n angular.forEach(projects, function (project) {\n if (project.user_ids.indexOf(Auth._currentUser.id) !== -1) {\n return filteredProject.push(project);\n }\n });\n }\n return filteredProject;\n } else {\n return projects;\n }\n };\n}]);\n\nApplication.Filters.filter('themeFilter', [function () {\n return function (projects, selectedTheme) {\n if (!angular.isUndefined(projects) && !angular.isUndefined(selectedTheme) && (projects != null) && (selectedTheme != null)) {\n const filteredProjects = [];\n angular.forEach(projects, function (project) {\n if (project.theme_ids.indexOf(selectedTheme) !== -1) {\n return filteredProjects.push(project);\n }\n });\n return filteredProjects;\n } else {\n return projects;\n }\n };\n}]);\n\nApplication.Filters.filter('componentFilter', [function () {\n return function (projects, selectedComponent) {\n if (!angular.isUndefined(projects) && !angular.isUndefined(selectedComponent) && (projects != null) && (selectedComponent != null)) {\n const filteredProjects = [];\n angular.forEach(projects, function (project) {\n if (project.component_ids.indexOf(selectedComponent) !== -1) {\n return filteredProjects.push(project);\n }\n });\n return filteredProjects;\n } else {\n return projects;\n }\n };\n}]);\n\nApplication.Filters.filter('projectsByAuthor', [function () {\n return function (projects, authorId) {\n if (!angular.isUndefined(projects) && angular.isDefined(authorId) && (projects != null) && (authorId != null) && (authorId !== '')) {\n const filteredProject = [];\n angular.forEach(projects, function (project) {\n if (project.author_id === authorId) {\n return filteredProject.push(project);\n }\n });\n return filteredProject;\n } else {\n return projects;\n }\n };\n}]);\n\nApplication.Filters.filter('projectsCollabored', [function () {\n return function (projects, memberId) {\n if (!angular.isUndefined(projects) && angular.isDefined(memberId) && (projects != null) && (memberId != null) && (memberId !== '')) {\n const filteredProject = [];\n angular.forEach(projects, function (project) {\n if (project.user_ids.indexOf(memberId) !== -1) {\n return filteredProject.push(project);\n }\n });\n return filteredProject;\n } else {\n return projects;\n }\n };\n}]);\n\n// depend on humanize.js lib in /vendor\nApplication.Filters.filter('humanize', [function () {\n return (element, param) => Humanize.truncate(element, param, null);\n}]);\n\n/**\n * This filter will convert ASCII carriage-return character to the HTML break-line tag\n */\nApplication.Filters.filter('breakFilter', [function () {\n return function (text) {\n if (text != null) {\n return text.replace(/\\n+/g, '
');\n }\n };\n}]);\n\n/**\n * This filter will take a HTML text as input and will return it without the html tags\n */\nApplication.Filters.filter('simpleText', [function () {\n return function (text) {\n if (text != null) {\n text = text.replace(//g, '\\n');\n return text.replace(/<\\/?\\w+[^>]*>/g, '');\n } else {\n return '';\n }\n };\n}]);\n\nApplication.Filters.filter('toTrusted', ['$sce', function ($sce) {\n return text => $sce.trustAsHtml(text);\n}]);\n\nApplication.Filters.filter('planIntervalFilter', [function () {\n return (interval, intervalCount) => moment.duration(intervalCount, interval).humanize();\n}]);\n\nApplication.Filters.filter('humanReadablePlanName', ['$filter', function ($filter) {\n return function (plan, groups, short) {\n if (plan != null) {\n let result = plan.base_name;\n if (groups != null) {\n for (const group of Array.from(groups)) {\n if (group.id === plan.group_id) {\n if (short != null) {\n result += ` - ${group.slug}`;\n } else {\n result += ` - ${group.name}`;\n }\n }\n }\n }\n result += ` - ${$filter('planIntervalFilter')(plan.interval, plan.interval_count)}`;\n return result;\n }\n };\n}]);\n\nApplication.Filters.filter('trainingReservationsFilter', [function () {\n return function (elements, selectedScope) {\n if (!angular.isUndefined(elements) && !angular.isUndefined(selectedScope) && (elements != null) && (selectedScope != null)) {\n const filteredElements = [];\n angular.forEach(elements, function (element) {\n switch (selectedScope) {\n case 'future':\n if (new Date(element.start_at) > new Date()) {\n return filteredElements.push(element);\n }\n break;\n case 'passed':\n if ((new Date(element.start_at) <= new Date()) && !element.is_valid) {\n return filteredElements.push(element);\n }\n break;\n case 'valided':\n if ((new Date(element.start_at) <= new Date()) && element.is_valid) {\n return filteredElements.push(element);\n }\n break;\n default:\n return [];\n }\n });\n return filteredElements;\n } else {\n return elements;\n }\n };\n}]);\n\nApplication.Filters.filter('eventsReservationsFilter', [function () {\n return function (elements, selectedScope) {\n if (!angular.isUndefined(elements) && !angular.isUndefined(selectedScope) && (elements != null) && (selectedScope != null) && (selectedScope !== '')) {\n const filteredElements = [];\n angular.forEach(elements, function (element) {\n if (angular.isUndefined(element.start_at)) { element.start_at = element.availability.start_at; }\n if (angular.isUndefined(element.end_at)) { element.end_at = element.availability.end_at; }\n switch (selectedScope) {\n case 'future':\n if (new Date(element.end_at) >= new Date()) {\n return filteredElements.push(element);\n }\n break;\n case 'future_asc':\n if (new Date(element.end_at) >= new Date()) {\n return filteredElements.push(element);\n }\n break;\n case 'passed':\n if (new Date(element.end_at) <= new Date()) {\n return filteredElements.push(element);\n }\n break;\n default:\n return [];\n }\n });\n switch (selectedScope) {\n case 'future_asc':\n return filteredElements.reverse();\n default:\n return filteredElements;\n }\n } else {\n return elements;\n }\n };\n}]);\n\nApplication.Filters.filter('groupFilter', [function () {\n return function (elements, member) {\n if (!angular.isUndefined(elements) && !angular.isUndefined(member) && (elements != null) && (member != null)) {\n const filteredElements = [];\n angular.forEach(elements, function (element) {\n if (member.group_id === element.id) {\n return filteredElements.push(element);\n }\n });\n return filteredElements;\n } else {\n return elements;\n }\n };\n}]);\n\nApplication.Filters.filter('groupByFilter', [function () {\n return _.memoize((elements, field) => _.groupBy(elements, field));\n}]);\n\nApplication.Filters.filter('capitalize', [() =>\n text => `${text.charAt(0).toUpperCase()}${text.slice(1).toLowerCase()}`\n\n]);\n\nApplication.Filters.filter('reverse', [function () {\n return function (items) {\n if (!angular.isArray(items)) {\n return items;\n }\n\n return items.slice().reverse();\n };\n}]);\n\nApplication.Filters.filter('toArray', [function () {\n return function (obj) {\n if (!(obj instanceof Object)) { return obj; }\n return _.map(obj, function (val, key) {\n if (angular.isObject(val)) {\n return Object.defineProperty(val, '$key', { __proto__: null, value: key });\n }\n });\n };\n}]);\n\nApplication.Filters.filter('toIsoDate', [function () {\n return function (date) {\n if (!(date instanceof Date) && !moment.isMoment(date)) { return date; }\n return moment(date).format('YYYY-MM-DD');\n };\n}]);\n\nApplication.Filters.filter('booleanFormat', ['_t', function (_t) {\n return function (boolean) {\n if (((typeof boolean === 'boolean') && boolean) || ((typeof boolean === 'string') && (boolean === 'true'))) {\n return _t('app.shared.buttons.yes');\n } else {\n return _t('app.shared.buttons.no');\n }\n };\n}]);\n\nApplication.Filters.filter('maxCount', ['_t', function (_t) {\n return function (max) {\n if ((typeof max === 'undefined') || (max === null) || ((typeof max === 'number') && (max === 0))) {\n return _t('app.admin.pricing.unlimited');\n } else {\n return max;\n }\n };\n}]);\n\nApplication.Filters.filter('filterDisabled', [function () {\n return function (list, filter) {\n if (angular.isArray(list)) {\n return list.filter(function (e) {\n switch (filter) {\n case 'disabled': return e.disabled;\n case 'enabled': return !e.disabled;\n default: return true;\n }\n });\n } else {\n return list;\n }\n };\n}]);\n","module.exports = __webpack_public_path__ + \"media/images/fabmanager-logo-0dc020701a1d12b85b0371b90f0867b2.png\";","// Module\nvar code = \"

{{ 'app.admin.admins_new.add_an_administrator' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/admins/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.shared.authentication.data_mapping' }} : {{field.local_field}}

{{ 'app.shared.authentication.expected_data_type' }} : {{datatype}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/authentications/_data_mapping.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.shared.authentication.provider_name_is_required' }}
{{ 'app.shared.authentication.authentication_type_is_required' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/authentications/_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.shared.oauth2.common_url_is_required' }} {{ 'app.shared.oauth2.provided_url_is_not_a_valid_url' }}
{{ 'app.shared.oauth2.oauth2_authorization_endpoint_is_required' }} {{ 'app.shared.oauth2.provided_endpoint_is_not_valid' }}
{{ 'app.shared.oauth2.oauth2_token_acquisition_endpoint_is_required' }} {{ 'app.shared.oauth2.provided_endpoint_is_not_valid' }}
{{ 'app.shared.oauth2.profile_edition_url_is_required' }} {{ 'app.shared.oauth2.provided_url_is_not_a_valid_url' }}
{{ 'app.shared.oauth2.oauth2_client_identifier_is_required' }} {{ 'obtain_it_when_registering_with_your_provider' }}
{{ 'app.shared.oauth2.oauth2_client_secret_is_required' }} {{ 'obtain_it_when_registering_with_your_provider' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/authentications/_oauth2.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.shared.oauth2.define_the_fields_mapping' }}

{{ 'app.shared.oauth2.model' }} {{ 'app.shared.oauth2.field' }} {{ 'app.shared.oauth2.api_endpoint_url' }} {{ 'app.shared.oauth2.api_type' }} {{ 'app.shared.oauth2.api_fields' }}
{{m.local_model}} {{m.local_field}} {{m.api_endpoint}} {{m.api_data_type}} {{m.api_field}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/authentications/_oauth2_mapping.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.authentication_edit.provider' | translate }} {{provider.name}}

{{ 'app.shared.buttons.cancel' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/authentications/edit.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.authentication_new.add_a_new_authentication_provider' }}

{{ 'app.shared.buttons.cancel' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/authentications/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.calendar.calendar_management' }}

{{ 'app.admin.calendar.legend' }}

{{ 'app.admin.calendar.trainings' }}
{{ 'app.admin.calendar.machines' }}
{{ 'app.admin.calendar.spaces' }} {{ 'app.admin.calendar.events' }}

{{ 'app.admin.calendar.info' }}

{{ 'app.admin.calendar.slot_duration' }}
0\\\"> {{ 'app.admin.calendar.tags' }}
  • {{tag.name}}

{{ 'app.admin.calendar.ongoing_reservations' }}

    0\\\">
  • {{r.user.name}} - {{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }} - {{r.reservable.name}}
{{ 'app.admin.calendar.without_reservation' }}
{{ 'app.admin.calendar.reservations_locked' }}
0\\\">

{{ 'app.admin.calendar.machines' }}

  • -1\\\"> {{m.name}} 1\\\">
0\\\">

{{ 'app.admin.calendar.plans' }}

  • {{::g.name}}
    • {{::plan.name}}

{{ 'app.admin.calendar.actions' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/calendar/calendar.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.admin.calendar.confirmation_required' }}

{{ 'app.admin.calendar.do_you_really_want_to_delete_this_slot' }}

{{ 'app.admin.calendar.delete_recurring_slot' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/calendar/deleteRecurrent.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.calendar.DATE_slot' | translate:{DATE:(start | amDateFormat: 'LL')} }} {{start | amDateFormat:'LT'}} - {{end | amDateFormat:'LT'}}

{{ 'app.admin.calendar.select_some_machines' | translate }}

{{ 'app.admin.calendar.divide_this_availability' }}

{{ 'app.admin.calendar.slots' }}

{{ 'app.admin.calendar.slots_of' }}

{{ 'app.admin.calendar.minutes' }}

{{ 'app.admin.calendar.adjust_the_opening_hours' }}

{{ 'app.admin.calendar.to_time' }}

{{ 'app.admin.calendar.restrict_options' }}

{{ 'app.admin.calendar.restrict_with_labels' }}

{{ 'app.admin.calendar.restrict_for_subscriptions' }}

{{ 'app.admin.calendar.select_some_plans' | translate }}

{{::group.name}}

{{ 'app.admin.calendar.recurrence' }}

{{ 'app.admin.calendar.summary' }}

{{ 'app.admin.calendar.about_to_create' | translate:{NUMBER:occurrences.length,TYPE:availability.available_type} }}
  • {{slot.start_at | amDateFormat:'L LT'}} - {{slot.end_at | amDateFormat:'LT'}}
{{ 'app.admin.calendar.divided_in_slots' }}
{{ 'app.admin.calendar.reservable' }}
{{ 'app.admin.calendar.labels' }}
{{ 'app.admin.calendar.plans' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/calendar/eventModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.icalendar.icalendar_import' }}

{{ 'app.admin.icalendar.intro' }}
0\\\">
{{ 'app.admin.icalendar.name' }} {{ 'app.admin.icalendar.url' }} {{ 'app.admin.icalendar.display' }}
{{calendar.name}} {{calendar.url}} {{ calendar.text_hidden ? '' : 'app.admin.icalendar.example' }}

{{ 'app.admin.icalendar.new_import' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/calendar/icalendar.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.shared.coupon.name_is_required' }}
{{ 'app.shared.coupon.code_is_required' }} {{ 'app.shared.coupon.code_must_be_composed_of_capital_letters_digits_and_or_dashes' }}
{{ 'app.shared.coupon.percent_off_is_required' }} {{ 'app.shared.coupon.percentage_must_be_between_0_and_100' }}
{{currencySymbol}}
{{ 'app.shared.coupon.percent_off_is_required' }} {{ 'app.shared.coupon.percentage_must_be_between_0_and_100' }}
{{ 'app.shared.coupon.validity_per_user_is_required' }}

{{ 'app.shared.coupon.warn_validity_once' }}

{{ 'app.shared.coupon.warn_validity_forever' }}

{{ errors['valid_until'].join(' ; ') }} {{ 'app.shared.coupon.leave_empty_for_no_limit' | translate }}
{{ 'app.shared.coupon.max_usages_must_be_equal_or_greater_than_0' }} {{ 'app.shared.coupon.leave_empty_for_no_limit' | translate }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/coupons/_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.coupons_edit.coupon' | translate }} {{ coupon.name }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/coupons/edit.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.coupons_new.add_a_coupon' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/coupons/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.events.categories' }}

{{ 'app.admin.events.at_least_one_category_is_required' }}

{{ 'app.admin.events.name' }}
{{ category.name }}

{{ 'app.admin.events.themes' }}

{{ 'app.admin.events.name' }}
{{ theme.name }}

{{ 'app.admin.events.age_ranges' }}

{{ 'app.admin.events.name' }}
{{ range.name }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/events/filters.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.events.title' }} {{ 'app.admin.events.dates' }} {{ 'app.admin.events.booking' }}
{{ event.title }} {{ 'app.admin.events.on_DATE' | translate:{DATE:(event.start_date | amDateFormat:'LL')} }} {{ 'app.admin.events.from_TIME' | translate:{TIME:(event.start_date | amDateFormat:'LT')} }} {{ 'app.admin.events.to_time' }} {{event.end_date | amDateFormat:'LT'}} {{'app.admin.events.from_DATE' | translate:{DATE:(event.start_date | amDateFormat:'LL')} }} {{'app.admin.events.to_date' | translate}} {{event.end_date | amDateFormat:'LL'}}
{{ 'app.admin.events.from_TIME' | translate:{TIME:(event.start_date | amDateFormat:'LT')} }} {{ 'app.admin.events.to_time' }} {{event.end_date | amDateFormat:'LT'}}
0\\\">{{ event.nb_total_places - event.nb_free_places }} / {{ event.nb_total_places }} {{ 'app.admin.events.cancelled' }} {{ 'app.admin.events.without_reservation' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/events/monitoring.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.admin.events.price_category' }}

{{ 'app.admin.events.category_name_is_required' }}
{{ 'app.admin.events.conditions_are_required' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/events/price_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.events.prices_categories' }}

{{ 'app.admin.events.name' }} {{ 'app.admin.events.usages_count' }}
{{ category.name }} {{ category.events }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/events/prices.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.event_reservations.the_reservations' | translate }} {{event.title}}

0\\\">
{{ 'app.admin.event_reservations.user' }} {{ 'app.admin.event_reservations.payment_date' }} {{ 'app.admin.event_reservations.reserved_tickets' }}
{{ reservation.user_full_name }} {{ reservation.created_at | amDateFormat:'LL LTS' }} 0\\\">{{ 'app.admin.event_reservations.full_price_' | translate }} {{reservation.nb_reserve_places}}
{{ticket.event_price_category.price_category.name}} : {{ticket.booked}}
{{ 'app.admin.event_reservations.canceled' }}

{{ 'app.admin.event_reservations.no_reservations_for_now' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/events/reservations.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
  • {{ 'app.admin.invoices.closed_at' }} : {{period.closed_at | amDateFormat:'L'}}
  • {{ 'app.admin.invoices.closed_by' }} : {{period.user_name}}
  • {{ 'app.admin.invoices.period_total' }} : {{period.period_total | currency}}
  • {{ 'app.admin.invoices.perpetual_total' }} : {{period.perpetual_total | currency}}
  • {{ 'app.admin.invoices.integrity' }} :
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/_period.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.invoices.export_accounting_data' }}

{{ 'app.admin.invoices.export_to' }}

{{ 'app.admin.invoices.format' }}
{{ exportTarget.settings.format }}
{{ 'app.admin.invoices.encoding' }}
{{ exportTarget.settings.encoding }}
{{ 'app.admin.invoices.separator' }}
{{ exportTarget.settings.separator }}
{{ 'app.admin.invoices.dateFormat' }}
{{ 'app.admin.invoices.labelMaxLength' }}
{{ exportTarget.settings.labelMaxLength }}
{{ 'app.admin.invoices.decimalSeparator' }}
{{ exportTarget.settings.decimalSeparator }}
{{ 'app.admin.invoices.exportInvoicesAtZero' }}
{{ exportTarget.settings.exportInvoicesAtZero ? 'app.shared.buttons.yes' : 'app.shared.buttons.no' }}
{{ 'app.admin.invoices.columns' }}
{{ 'app.admin.invoices.exportColumns.' + column }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/accountingExportModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.invoices.create_a_refund_on_this_invoice' }}

{{ 'app.admin.invoices.creation_date_is_required' }}
1\\\" class=\\\"form-group\\\">
{{ 'app.admin.invoices.description' }} {{ 'app.admin.invoices.price' }}
{{item.amount | currency}}

{{ 'app.admin.invoices.will_appear_on_the_refund_invoice' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/avoirModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.invoices.close_accounting_period' }}

{{ 'app.admin.invoices.start_date_is_required' }} {{ errors.start_at[0] }}
{{ 'app.admin.invoices.end_date_is_required' }} {{ errors.end_at[0] }}
{{ $parent.invoiceErrorRE.exec(key)[1] }} : {{ value[0] }}

{{ 'app.admin.invoices.previous_closings' }}

0\\\">
{{ 'app.admin.invoices.start_date' }} {{ 'app.admin.invoices.end_date' }}
{{period.start_at | amDateFormat:'L'}} {{period.end_at | amDateFormat:'L'}}
{{ 'app.admin.invoices.no_periods'}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/closePeriodModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/codes.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.invoices.filter_invoices' | translate }}

{{ 'app.admin.invoices.invoice_num_' }}
{{ 'app.admin.invoices.customer_' }}
{{ \\\"app.admin.invoices.date_\\\" | translate }}
0\\\">
{{ 'app.admin.invoices.invoice_num' | translate }} {{ 'app.admin.invoices.date' | translate }} {{ 'app.admin.invoices.price' | translate }} {{ 'app.admin.invoices.customer' | translate }}
{{ invoice.reference }} {{ invoice.date | amDateFormat:'L LTS' }} {{ invoice.date | amDateFormat:'L' }} {{ invoice.total | currency}} {{ invoice.name }} {{ invoice.name }}

{{ 'app.admin.invoices.no_invoices_for_now' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/list.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.invoices.payment.payment_settings' }}

{{ 'app.admin.invoices.payment.online_payment' }}

{{ 'app.admin.invoices.payment.stripe_keys' }}

{{ 'app.admin.invoices.payment.currency' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/payment.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.invoices.warning_invoices_disabled' }}
{{ 'app.admin.invoices.change_logo' | translate }}
{{ 'app.admin.invoices.john_smith' }}
{{ 'app.admin.invoices.john_smith_at_example_com' }}
{{ 'app.admin.invoices.invoice_reference_' | translate }} {{mkReference()}}
{{ 'app.admin.invoices.code_' | translate }} {{invoice.code.model}}
{{ 'app.admin.invoices.code_disabled' }}
{{ 'app.admin.invoices.order_num' | translate }} {{mkNumber()}}
{{ 'app.admin.invoices.invoice_issued_on_DATE_at_TIME' | translate:{DATE:(today | amDateFormat:'L'), TIME:(today | amDateFormat:'LT')} }}
{{ 'app.admin.invoices.object_reservation_of_john_smith_on_DATE_at_TIME' | translate:{DATE:(inOneWeek | amDateFormat:'L'), TIME:(inOneWeek | amDateFormat:'LT')} }}
{{ 'app.admin.invoices.order_summary' | translate }}
{{ 'app.admin.invoices.details' }} {{ 'app.admin.invoices.amount' }}
{{ 'app.admin.invoices.machine_booking-3D_printer' | translate }} {{inOneWeek | amDateFormat:'LLL'}} - {{inOneWeekAndOneHour | amDateFormat:'LT'}} {{30.0 | currency}}
{{ 'app.admin.invoices.total_amount' }} {{ 'app.admin.invoices.total_including_all_taxes' }} {{30.0 | currency}}
{{ 'app.admin.invoices.VAT_disabled' }}
{{ 'app.admin.invoices.including_VAT' | translate }} {{invoice.VAT.rate}} % {{30-(30/(invoice.VAT.rate/100+1)) | currency}}
{{ 'app.admin.invoices.including_total_excluding_taxes' }} {{30/(invoice.VAT.rate/100+1) | currency}}
{{ 'app.admin.invoices.including_amount_payed_on_ordering' }} {{30.0 | currency}}

{{ 'app.admin.invoices.settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT' }}

{{ 'app.admin.invoices.filename' }}

{{file.prefix}}-{{file.nextId}}_{{file.date}}.pdf
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/settings.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.invoices.code' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/settings/editCode.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.invoices.order_number' }}

{{ 'app.admin.invoices.elements' }}

  • {{ 'app.admin.invoices.year' | translate }}
  • {{ 'app.admin.invoices.month' | translate }}
  • {{ 'app.admin.invoices.day' | translate }}
  • {{ 'app.admin.invoices.order_num' | translate }}

{{ 'app.admin.invoices.model' }}

{{ 'app.admin.invoices.documentation' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/settings/editNumber.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.invoices.filename' }}

{{ 'app.admin.invoices.prefix_info' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/settings/editPrefix.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.invoices.invoice_reference' }}

Éléments

  • {{ 'app.admin.invoices.year' | translate }}
  • {{ 'app.admin.invoices.month' | translate }}
  • {{ 'app.admin.invoices.day' | translate }}
  • {{ 'app.admin.invoices.num_of_invoice' | translate }}
  • {{ 'app.admin.invoices.online_sales' | translate }}
  • {{ 'app.admin.invoices.refund' | translate }}
  • {{ 'app.admin.invoices.payment_schedule' | translate }}

{{ 'app.admin.invoices.model' }}

{{ 'app.admin.invoices.documentation' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/settings/editReference.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.invoices.VAT' }}

%

{{ 'app.admin.invoices.VAT_history' }}

{{ 'app.admin.invoices.VAT_rate' }} {{ 'app.admin.invoices.changed_at' }} {{ 'app.admin.invoices.changed_by' }}
{{'app.admin.invoices.VAT_disabled'}} {{'app.admin.invoices.VAT_enabled'}} {{value.rate}} {{value.date | amDateFormat:'L LT'}} {{value.user.name}}{{ 'app.admin.invoices.deleted_user' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/settings/editVAT.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.invoices.payment.stripe_keys' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/invoices/settings/stripeKeys.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.manager_new.add_a_manager' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/managers/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.shared.user_admin.group_is_required' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.members.surname' | translate }} {{ 'app.admin.members.first_name' | translate }} {{ 'app.admin.members.email' | translate }} {{ 'app.admin.members.phone' | translate }}
{{ admin.profile_attributes.last_name }} {{ admin.profile_attributes.first_name }} {{ admin.email }} {{ admin.profile_attributes.phone }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/administrators.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.admin.members_edit.change_role' }}

{{ 'app.admin.members_edit.warning_role_change' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/change_role_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.shared.user_admin.user' | translate }} {{ user.name }}

{{ 'app.shared.user_admin.incomplete_profile' }}
\\\"role{{ 'app.admin.members_edit.change_role' }}
{{ 'app.shared.user_admin.warning_incomplete_user_profile_probably_imported_from_sso' }}

{{ subscription.plan | humanReadablePlanName }}

{{ 'app.admin.members_edit.duration' | translate }} {{ subscription.plan.interval | planIntervalFilter: subscription.plan.interval_count }}

{{ 'app.admin.members_edit.expires_at' | translate }} {{ subscription.expired_at | amDateFormat: 'L' }}

{{ 'app.admin.members_edit.price_' | translate }} {{ subscription.plan.amount | currency}}

{{ 'app.admin.members_edit.cannot_extend_own_subscription' }}

{{ 'app.admin.members_edit.user_has_no_current_subscription' }}

{{ 'app.admin.members_edit.next_trainings' | translate }}

    0\\\">
  • {{r.reservable.name}} - {{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}
{{ 'app.admin.members_edit.no_trainings' }}

{{ 'app.admin.members_edit.passed_trainings' | translate }}

    0\\\">
  • {{r.reservable.name}} - {{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}
{{ 'app.admin.members_edit.no_trainings' }}

{{ 'app.admin.members_edit.validated_trainings' | translate }}

    0\\\">
  • {{t.name}}
{{ 'app.admin.members_edit.no_trainings' }}

{{ 'app.admin.members_edit.next_events' | translate }}

    0\\\">
  • {{r.reservable.title}} - {{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }} 0\\\">
    {{ 'app.admin.members_edit.NUMBER_full_price_tickets_reserved' }}

    {{ 'app.admin.members_edit.NUMBER_NAME_tickets_reserved' }}
{{ 'app.admin.members_edit.no_upcoming_events' }}

{{ 'app.admin.members_edit.passed_events' | translate }}

    0\\\">
  • {{r.reservable.title}} - {{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}
{{ 'app.admin.members_edit.no_passed_events' }}
0\\\">
{{ 'app.admin.members_edit.invoice_num' }} {{ 'app.admin.members_edit.date' }} {{ 'app.admin.members_edit.price' }}
{{ invoice.reference }} {{ invoice.date | amDateFormat:'L LTS' }} {{ invoice.date | amDateFormat:'L' }} {{ invoice.total | currency }}

{{ 'app.admin.members_edit.no_invoices_for_now' }}

{{ 'app.admin.members_edit.cannot_credit_own_wallet' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/edit.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.members_import.import_members' }}

{{ 'app.admin.members_import.info' }}

{{ 'app.admin.members_import.groups' }}

{{ 'app.admin.members_import.group_name' }} {{ 'app.admin.members_import.group_identifier' }}
{{ group.name }} {{ group.slug }}

{{ 'app.admin.members_import.trainings' }}

{{ 'app.admin.members_import.training_name' }} {{ 'app.admin.members_import.training_identifier' }}
{{ training.name }} {{ training.id }}

{{ 'app.admin.members_import.tags' }}

{{ 'app.admin.members_import.tag_name' }} {{ 'app.admin.members_import.tag_identifier' }}
{{ tag.name }} {{ tag.id }}

{{ 'app.admin.members_import.required_fields' }}

{{ 'app.admin.members_import.about_example' }}

{{file.attachment}}
{{ 'app.admin.members_import.select_file' }} {{ 'app.shared.buttons.change' }}
{{ 'app.admin.members_import.update_field' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/import.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.members_import_result.import_results' }}

{{ 'app.admin.members_import_result.import_details' | translate:{DATE:(import.created_at | amDateFormat:'L'), USER:import.user.full_name, ID:import.id} }}

{{ 'app.admin.members_import_result.pending' }}

{{ 'app.admin.members_import_result.results' }}

{{key}}
{{value}}
{{ 'app.admin.members_import_result.status_' + resultRow.status | translate:{ID:resultRow.user} }} {{ 'app.admin.members_import_result.success' }} {{ 'app.admin.members_import_result.failed' }}
{{ 'app.admin.members_import_result.error_details' }}{{resultRow}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/import_result.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.members.managers_info' }}

{{ 'app.admin.members.surname' | translate }} {{ 'app.admin.members.first_name' | translate }} {{ 'app.admin.members.email' | translate }} {{ 'app.admin.members.phone' | translate }}
{{ manager.last_name }} {{ manager.first_name }} {{ manager.email }} {{ manager.phone }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/managers.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.members.surname' | translate }} {{ 'app.admin.members.first_name' | translate }} {{ 'app.admin.members.email' | translate }} {{ 'app.admin.members.phone' | translate }} {{ 'app.admin.members.user_type' | translate }} {{ 'app.admin.members.subscription' | translate }}
{{ m.profile.last_name }} {{ m.profile.first_name }} {{ m.email }} {{ m.profile.phone }} {{ m.group.name }} {{ m.subscribed_plan | humanReadablePlanName }}
{{ 'app.shared.user_admin.incomplete_profile' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/members.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.members_new.add_a_member' }}

{{ 'app.shared.buttons.cancel' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.members.partners_info' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/partners.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \" \";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/members/users.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.open_api_clients.open_api_clients' }}

{{ 'app.admin.open_api_clients.name' | translate }} {{ 'app.admin.open_api_clients.calls_count' | translate }} {{ 'app.admin.open_api_clients.token' | translate }} {{ 'app.admin.open_api_clients.created_at' | translate }}
{{ client.name }} {{ client.calls_count }} {{ client.token }} {{ client.created_at | amDateFormat: 'LL' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/open_api_clients/index.html.erb';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.shared.plan.general_information' }}

{{ 'app.shared.plan.name_is_required' }} {{ 'app.shared.plan.name_length_must_be_less_than_24_characters' }}
{{ 'app.shared.plan.type_is_required' }}
{{ 'app.shared.plan.group_is_required' }}
{{ 'app.shared.plan.period_is_required' }}
{{ 'app.shared.plan.number_of_periods_is_required' }}
{{currencySymbol}}
{{ 'app.shared.plan.price_is_required' }} {{ 'app.shared.plan.edit_amount_info' | translate }}
{{ 'app.shared.plan.on_the_subscriptions_page_the_most_prominent_subscriptions_will_be_placed_at_the_top_of_the_list' | translate }} {{ 'app.shared.plan.an_evelated_number_means_a_higher_prominence' | translate }}
{{ (plan.is_rolling ? 'app.shared.buttons.yes' : 'app.shared.buttons.no') | translate }} {{ 'app.shared.plan.a_rolling_subscription_will_begin_the_day_of_the_first_training' | translate }} {{ 'app.shared.plan.otherwise_it_will_begin_as_soon_as_it_is_bought' | translate }}
{{ (plan.monthly_payment ? 'app.shared.buttons.yes' : 'app.shared.buttons.no') | translate }} {{ 'app.shared.plan.monthly_payment_info' }}
{{file.attachment || plan.plan_file_attributes.attachment_identifier}}
{{ 'app.shared.plan.attach_an_information_sheet' }} {{ 'app.shared.buttons.change' }}
{{ 'app.shared.plan.as_part_of_a_partner_subscription_some_notifications_may_be_sent_to_this_user' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/plans/_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.plans.edit.subscription_plan' | translate }} {{ plan.base_name }}

{{ 'app.shared.plan.disable_plan_will_not_unsubscribe_users' }}

{{ 'app.admin.plans.edit.prices' }}

{{ 'app.admin.plans.edit.machines' }}

{{ 'app.admin.plans.edit.machine' }} {{ 'app.admin.plans.edit.hourly_rate' }}
{{ getMachine(price.priceable_id).name }} (id {{ price.priceable_id }}) *
{{currencySymbol}}

{{ 'app.admin.plans.edit.spaces' }}

{{ 'app.admin.plans.edit.space' }} {{ 'app.admin.plans.edit.hourly_rate' }}
{{ getSpace(price.priceable_id).name }} *
{{currencySymbol}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/plans/edit.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.plans.new.add_a_subscription_plan' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/plans/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.pricing.list_of_the_coupons' }}

{{ 'app.admin.pricing.name' }} {{ 'app.admin.pricing.discount' }} {{ 'app.admin.pricing.nb_of_usages' }} {{ 'app.admin.pricing.status' }}
{{coupon.name}} {{coupon.percent_off}} % {{coupon.amount_off}} {{currencySymbol}} {{coupon.usages}} {{'app.admin.pricing.'+coupon.status}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/pricing/coupons.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.pricing.trainings' }}

{{ 'app.admin.pricing.subscription' }} {{ 'app.admin.pricing.credits' }} {{ 'app.admin.pricing.related_trainings' }}
{{ plan | humanReadablePlanName: groups }} {{ plan.training_credit_nb }} {{ showTrainings(trainingIds) }}

{{ 'app.admin.pricing.machines' }}

{{ 'app.admin.pricing.machine' }} {{ 'app.admin.pricing.hours' | translate:{DURATION:slotDuration} }} {{ 'app.admin.pricing.related_subscriptions' }}
{{ showCreditableName(mc) }} {{ mc.hours }} {{ getPlanFromId(mc.plan_id) | humanReadablePlanName: groups: 'short' }}

{{ 'app.admin.pricing.spaces' }}

{{ 'app.admin.pricing.space' }} {{ 'app.admin.pricing.hours' | translate:{DURATION:slotDuration} }} {{ 'app.admin.pricing.related_subscriptions' }}
{{ showCreditableName(sc) }} {{ sc.hours }} {{ getPlanFromId(sc.plan_id) | humanReadablePlanName: groups: 'short' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/pricing/credits.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.pricing.you_can_override' }}

{{ 'app.admin.pricing.machines' }} {{group.name}}
{{ machine.name }} {{ findPriceBy(machinesPrices, machine.id, group.id).amount | currency}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/pricing/machine_hours.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.pricing.send_a_coupon' }}

{{ 'app.admin.pricing.coupon' }}

{{'app.admin.pricing.code'}} {{coupon.code}}
{{'app.admin.pricing.discount'}} {{coupon.percent_off}} %{{coupon.amount_off}} {{currencySymbol}}
{{'app.admin.pricing.validity_per_user'}} {{'app.admin.pricing.'+coupon.validity_per_user}}
{{'app.admin.pricing.valid_until'}} {{coupon.valid_until | amDateFormat:'L'}}
{{'app.admin.pricing.usages'}} {{coupon.usages}} / {{coupon.max_usages | maxCount}}
{{'app.admin.pricing.enabled'}} {{coupon.active | booleanFormat}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/pricing/sendCoupon.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.pricing.you_can_override' }}

{{ 'app.admin.pricing.spaces' }} {{group.name}}
{{ space.name }} {{ findPriceBy(spacesPrices, space.id, group.id).amount | currency}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/pricing/spaces.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.pricing.list_of_the_subscription_plans' }}

{{ 'app.admin.pricing.type' | translate }} {{ 'app.admin.pricing.name' | translate }} {{ 'app.admin.pricing.duration' | translate }} {{ 'app.admin.pricing.group' | translate }} {{ 'app.admin.pricing.prominence' | translate }} {{ 'app.admin.pricing.price' | translate }}
{{getPlanType(plan.type)}} {{plan.base_name}} {{ plan.interval | planIntervalFilter:plan.interval_count }} {{group.name}} {{plan.ui_weight}} {{plan.amount | currency}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/pricing/subscriptions.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.pricing.trainings' }} {{group.name}}
{{ training.name }} {{ findTrainingsPricing(trainingsPricings, training.id, group.id).amount | currency}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/pricing/trainings.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.projects.name' }} {{ 'app.admin.projects.description' }}
{{ licence.name }}
{{ licence.description }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/projects/licences.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.projects.name' }}
{{ component.name }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/projects/materials.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.projects.settings.comments' }}

{{ 'app.admin.projects.settings.disqus' }}

{{ 'app.admin.projects.settings.disqus_info' }}

{{ 'app.admin.projects.settings.cad_files' }}

{{ 'app.admin.projects.settings.validation' }}

{{ 'app.admin.projects.settings.validation_info' }}

{{file.attachment}}
{{ 'app.admin.projects.settings.set_a_file' }} {{ 'app.shared.buttons.change' }}
{{ 'app.admin.projects.settings.projects_sharing' }}

{{ 'app.admin.projects.settings.open_lab_projects' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/projects/settings.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.projects.name' }}
{{ theme.name }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/projects/themes.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.settings.link' }}
{{ 'app.admin.settings.content' }}

{{ 'app.admin.settings.shift_enter_to_force_carriage_return' | translate }}
{{ 'app.admin.settings.drag_and_drop_to_insert_images' | translate }}
{{ 'app.admin.settings.shift_enter_to_force_carriage_return' | translate }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/about.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.settings.fab_analytics' }}

{{ 'app.admin.settings.privacy.analytics.intro_analytics_html' }}

{{ 'app.admin.settings.privacy.analytics.version' }}{{ data.version }}
{{ 'app.admin.settings.privacy.analytics.members' }}{{ data.members }}
{{ 'app.admin.settings.privacy.analytics.admins' }}{{ data.admins }}
{{ 'app.admin.settings.privacy.analytics.availabilities' }}{{ data.availabilities }}
{{ 'app.admin.settings.privacy.analytics.reservations' }}{{ data.reservations }}
{{ 'app.admin.settings.privacy.analytics.plans' }}{{ data.plans }}
{{ 'app.admin.settings.privacy.analytics.spaces' }}{{ data.spaces }}
{{ 'app.admin.settings.privacy.analytics.online_payment' }}{{ data.online_payment }}
{{ 'app.admin.settings.privacy.analytics.invoices' }}{{ data.invoices }}
{{ 'app.admin.settings.privacy.analytics.openlab' }}{{ data.openlab }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/analyticsModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/boolean.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.settings.general.title' }}

{{ 'app.admin.settings.general.title_concordance' }}



{{ 'app.admin.settings.customize_information_messages' }}

{{ 'app.admin.settings.message_of_the_machine_booking_page' }}

{{ 'app.admin.settings.warning_message_of_the_training_booking_page'}}

{{ 'app.admin.settings.information_message_of_the_training_reservation_page'}}

{{ 'app.admin.settings.message_of_the_subscriptions_page' }}

{{ 'app.admin.settings.message_of_the_events_page' }}

{{ 'app.admin.settings.message_of_the_spaces_page' }}

{{ 'app.admin.settings.legal_documents'}}
{{ 'app.admin.settings.if_these_documents_are_not_filled_no_consent_about_them_will_be_asked_to_the_user' }}
{{cgvFile.custom_asset_file_attributes.attachment}}
{{ 'app.shared.buttons.browse' }} {{ 'app.shared.buttons.change' }}
{{cguFile.custom_asset_file_attributes.attachment}}
{{ 'app.shared.buttons.browse' }} {{ 'app.shared.buttons.change' }}
{{ 'app.admin.settings.customize_the_graphics' }}
{{ 'app.admin.settings.for_an_optimal_rendering_the_logo_image_must_be_at_the_PNG_format_with_a_transparent_background_and_with_an_aspect_ratio_3.5_times_wider_than_the_height' }}
{{ 'app.admin.settings.concerning_the_favicon_it_must_be_at_ICO_format_with_a_size_of_16x16_pixels' }}

{{ 'app.admin.settings.remember_to_refresh_the_page_for_the_changes_to_take_effect' }}

{{ 'app.admin.settings.logo_white_background' }}

\\\"{{customLogo.custom_asset_file_attributes.attachment}}\\\"
{{ 'app.admin.settings.change_the_logo' | translate }}

{{ 'app.admin.settings.logo_black_background' }}

{{ 'app.admin.settings.favicon' }}

\\\"{{customFavicon.custom_asset_file_attributes.attachment}}\\\"
{{ 'app.admin.settings.change_the_favicon' | translate }}

{{ 'app.admin.settings.main_colour' }}

{{ 'app.admin.settings.secondary_colour' }}

{{ 'app.admin.settings.background_picture_of_the_profile_banner' }}

\\\"{{profileImage.custom_asset_file_attributes.attachment}}\\\"
{{ 'app.admin.settings.change_the_profile_banner' | translate }}
{{ 'app.admin.settings.general.elements_ordering' }}

{{ 'app.admin.settings.general.machines_order' }}

{{ 'app.admin.settings.general.help' }}

{{ 'app.admin.settings.general.feature_tour' }}

{{ 'app.admin.settings.general.notifications' }}

{{ 'app.admin.settings.general.email' }}

{{ 'app.admin.settings.general.email_info' }}

{{ 'app.admin.settings.account_creation' }}

{{ 'app.admin.settings.phone' }}

{{ 'app.admin.settings.phone_required_info' }}

{{ 'app.admin.settings.address' }}

{{ 'app.admin.settings.address_required_info_html' }}

{{ 'app.admin.settings.captcha' }}

{{ 'app.admin.settings.account_confirmation' }}

{{ 'app.admin.settings.confirmation_required_info' }}

{{ 'app.admin.settings.modules' }}

{{ 'app.admin.settings.remember_to_refresh_the_page_for_the_changes_to_take_effect' }}

{{ 'app.admin.settings.spaces' }}

{{ 'app.admin.settings.plans' }}

{{ 'app.admin.settings.trainings' }}

{{ 'app.admin.settings.invoicing' }}

{{ 'app.admin.settings.general.wallet' }}

{{ 'app.admin.settings.general.statistics' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/general.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.settings.customize_home_page' }}

{{ 'app.admin.settings.news_of_the_home_page' }}

{{ 'app.admin.settings.leave_it_empty_to_not_bring_up_any_news_on_the_home_page' | translate }}
{{ 'app.admin.settings.advanced' }}

{{ 'app.admin.settings.customize_home_page_css' }}

{{ 'app.admin.settings.home_css_notice_html' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/home_page.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ titleNew }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/newSelectOption.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ helperText | translate }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/number.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.settings.privacy.privacy_policy' }}
{{ 'app.admin.settings.drag_and_drop_to_insert_images' | translate }}
{{ 'app.admin.settings.shift_enter_to_force_carriage_return' | translate }}
{{ 'app.admin.settings.privacy.analytics.title' }}

{{ 'app.admin.settings.privacy.about_analytics' }} {{ 'app.admin.settings.privacy.read_more' }}

{{ 'app.admin.settings.privacy.statistics' }}

{{ 'app.admin.settings.remember_to_refresh_the_page_for_the_changes_to_take_effect' }}

{{ 'app.admin.settings.privacy.google_analytics' }}

{{ 'app.admin.settings.privacy.facebook' }}

{{ 'app.admin.settings.privacy.twitter' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/privacy.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.admin.settings.reservations_parameters' }}

{{ 'app.admin.settings.confine_the_booking_agenda' }}

{{ 'app.admin.settings.opening_time' }}

{{ 'app.admin.settings.closing_time' }}

{{ 'app.admin.settings.max_visibility' }}

{{ 'app.admin.settings.ability_for_the_users_to_move_their_reservations' }}

{{ 'app.admin.settings.ability_for_the_users_to_cancel_their_reservations' }}

{{ 'app.admin.settings.book_overlapping_slots_info' }}

{{ 'app.admin.settings.default_slot_duration' }}

{{ 'app.admin.settings.default_slot_duration_info' }}

{{ 'app.admin.settings.reservations_reminders' }}

{{ 'app.admin.settings.notification_sending_before_the_reservation_occurs' }}

{{ 'app.admin.settings.display' }}

{{ 'app.admin.settings.display_machine_reservation_user_name' }}

{{ 'app.admin.settings.events_in_the_calendar' }}

{{ 'app.admin.settings.events_in_calendar_info' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/reservations.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.settings.privacy.save_or_publish' }}

{{ 'app.admin.settings.privacy.save_or_publish_body' }}

{{ 'app.admin.settings.privacy.publish_will_notify' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/save_policy.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/select.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/select-multiple.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/settings/text.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

{{ 'app.admin.statistics.export_statistics_to_excel' }}

  • {{ 'app.admin.statistics.start' }}
  • {{ 'app.admin.statistics.end' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/statistics/export.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.stats_graphs.statistics' }}

  • {{ 'app.admin.stats_graphs.start' }}
  • {{ 'app.admin.stats_graphs.end' }}

{{ 'app.admin.stats_graphs.top_list_of' | translate}} {{stat.label}}

{{type.label}}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/statistics/graphs.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.members_edit.new_subscription' }}

{{ 'app.admin.members_edit.you_are_about_to_purchase_a_subscription_to_NAME' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/subscriptions/create_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.members_edit.expiration_date' }}

{{ 'app.admin.members_edit.you_intentionally_decide_to_extend_the_user_s_subscription_by_offering_him_free_days' }}

{{ 'app.admin.members_edit.credits_will_remain_unchanged' }}

{{ 'app.admin.members_edit.you_intentionally_decide_to_extend_the_user_s_subscription_by_charging_him_again_for_his_current_subscription' }}

{{ 'app.admin.members_edit.credits_will_be_reset' }}

{{ 'app.admin.members_edit.payment_scheduled' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/subscriptions/expired_at_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{alert.msg}}
{{ 'app.shared.trainings.name_is_required' }}
\\\"\\\"/
{{ 'app.shared.trainings.add_an_illustration' | translate }} {{ 'app.shared.buttons.change' }} {{ 'app.shared.buttons.delete' }}
{{ 'app.shared.trainings.description_is_required' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/trainings/_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ training.name }}

{{ 'app.shared.buttons.cancel' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/trainings/edit.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.trainings.edition_of_the_description_tooltip' }}

{{ 'app.admin.trainings.description_is_limited_to_255_characters' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/trainings/modal_edit.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.trainings_new.add_a_new_training' }}

{{ 'app.admin.trainings_new.beware_when_creating_a_training_its_reservation_prices_are_initialized_to_zero' | translate }} {{ 'app.admin.trainings_new.dont_forget_to_change_them_before_creating_slots_for_this_training' | translate }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/trainings/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.admin.trainings.training_validation' }}

{{ 'app.admin.trainings.training_of_the_DATE_TIME_html' }}
{{ 'app.admin.trainings.you_can_validate_the_training_of_the_following_members' }}

    0\\\">
  • {{ 'app.admin.trainings.deleted_user' }}

{{ 'app.admin.trainings.no_reservation' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/admin/trainings/validTrainingModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.public.calendar.calendar' }}

{{ 'app.public.calendar.filter_calendar' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/calendar/calendar.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.public.calendar.trainings' }}

{{::t.name}}

{{ 'app.public.calendar.machines' }}

{{::m.name}}

{{ 'app.public.calendar.spaces' }}

{{::s.name}}

{{ 'app.public.calendar.events' }}

{{ 'app.public.calendar.show_unavailables' }}

{{ 'app.public.calendar.externals' }}

{{::e.name}}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/calendar/filter.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.public.calendar.filter_calendar' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/calendar/filterAside.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

{{ 'app.logged.dashboard.events.your_next_events' | translate }}

    0\\\">
  • {{r.reservable.title}} - {{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}
    {{ 'app.logged.dashboard.events.NUMBER_normal_places_reserved' }}
    {{ 'app.logged.dashboard.events.NUMBER_of_NAME_places_reserved' }}
{{ 'app.logged.dashboard.events.no_events_to_come' }}

{{ 'app.logged.dashboard.events.your_previous_events' | translate }}

    0\\\">
  • {{r.reservable.title}} - {{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}
{{ 'app.logged.dashboard.events.no_passed_events' }}
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/dashboard/events.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
0\\\">
{{ 'app.logged.dashboard.invoices.reference_number' }} {{ 'app.logged.dashboard.invoices.date' }} {{ 'app.logged.dashboard.invoices.price' }}
{{ invoice.reference }} {{ invoice.date | amDateFormat:'L LTS' }} {{ invoice.date | amDateFormat:'L' }} {{ invoice.total | currency}}

{{ 'app.logged.dashboard.invoices.no_invoices_for_now' }}

\";\n// Exports\nvar _module_exports = code;;\nvar path = '/dashboard/invoices.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/dashboard/nav.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/dashboard/payment_schedules.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
\";\n// Exports\nvar _module_exports = code;;\nvar path = '/dashboard/profile.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
{{ 'app.logged.dashboard.projects.you_dont_have_any_projects' }}

{{project.name}}

{{project.author_id == currentUser.id ? 'app.logged.dashboard.projects.author' : 'app.logged.dashboard.projects.collaborator' | translate}} {{ 'app.logged.dashboard.projects.rough_draft' }}

{{ 'app.logged.dashboard.projects.description' }}

{{ 'app.logged.dashboard.projects.machines_and_materials' }}

{{ 'app.logged.dashboard.projects.machines' | translate }} :

  • {{m.name}}

{{ 'app.logged.dashboard.projects.materials' | translate }} :

  • {{c.name}}

{{ 'app.logged.dashboard.projects.collaborators' }}

  • {{collaborator.full_name}} {{collaborator.username}}
  • \";\n// Exports\nvar _module_exports = code;;\nvar path = '/dashboard/projects.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    test
    {{user.name}}
    {{user.email}}
    {{ 'app.logged.dashboard.settings.last_activity_on_' | translate:{DATE:(user.last_sign_in_at | amDateFormat: 'LL')} }}

    {{ 'app.logged.dashboard.settings.group' }}

    {{getUserGroup().name}}

    {{ 'app.logged.dashboard.settings.subscription' }}

    {{ user.subscribed_plan | humanReadablePlanName }}
    {{ 'app.logged.dashboard.settings.your_subscription_expires_on_' | translate }} {{user.subscription.expired_at | amDateFormat: 'LL'}}
    {{ 'app.logged.dashboard.settings.no_subscriptions' | translate }}
    {{ 'app.logged.dashboard.settings.i_want_to_subscribe' }}

    {{ 'app.logged.dashboard.settings.trainings' }}

      0 || user.trainings.length > 0\\\">
    • {{r.reservable.name}} - {{ 'app.logged.dashboard.settings.to_come' | translate }}
    • {{t.name}} - {{ 'app.logged.dashboard.settings.approved' | translate }}
    {{ 'app.logged.dashboard.settings.no_trainings' }}

    {{ 'app.logged.dashboard.settings.projects' }}

      0\\\">
    • {{p.name}}
    {{ 'app.logged.dashboard.settings.no_projects' }}

    {{ 'app.logged.dashboard.settings.labels' }}

    0\\\" ng-repeat=\\\"t in user.tags\\\"> {{t.name}}
    {{ 'app.logged.dashboard.settings.no_labels' }}

    {{ 'app.logged.dashboard.settings.cookies' }}

    {{ 'app.logged.dashboard.settings.cookies_accepted' }}
    {{ 'app.logged.dashboard.settings.cookies_declined' }}
    {{ 'app.logged.dashboard.settings.cookies_unset' }}

    {{ 'app.logged.dashboard.settings.edit_my_profile' }}

    {{activeProvider.name}}

    {{ 'app.logged.dashboard.settings.change_my_data' | translate }}

    {{ 'app.logged.dashboard.settings.once_your_data_are_up_to_date_' | translate }} {{ 'app.logged.dashboard.settings._click_on_the_synchronization_button_opposite_' }} {{ 'app.logged.dashboard.settings.or' | translate}} {{ 'app.logged.dashboard.settings._disconnect_then_reconnect_' }} {{ 'app.logged.dashboard.settings._for_your_changes_to_take_effect' | translate }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/dashboard/settings.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.logged.dashboard.trainings.your_training_credits' | translate }}

    {{ 'app.logged.dashboard.trainings.subscribe_for_credits' }} {{ 'app.logged.dashboard.trainings.register_for_free' }}
    • {{getTrainingName(c.training_id)}}

    {{ 'app.logged.dashboard.trainings.your_next_trainings' | translate }}

      0\\\">
    • {{r.reservable.name}} - {{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}
    {{ 'app.logged.dashboard.trainings.no_trainings' }}

    {{ 'app.logged.dashboard.trainings.your_previous_trainings' | translate }}

      0\\\">
    • {{r.reservable.name}} - {{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}
    {{ 'app.logged.dashboard.trainings.no_trainings' }}

    {{ 'app.logged.dashboard.trainings.your_approved_trainings' | translate }}

      0\\\">
    • {{t.name}}
    {{ 'app.logged.dashboard.trainings.no_trainings' }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/dashboard/trainings.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/dashboard/wallet.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    {{alert.msg}}
    {{ 'app.shared.event.title_is_required' }}
    \\\"\\\"/
    {{ 'app.shared.event.choose_a_picture' | translate }} {{ 'app.shared.buttons.change' }}
    {{ 'app.shared.event.description_is_required' }}
    {{file.attachment}}
    {{ 'app.shared.buttons.browse' }} {{ 'app.shared.buttons.change' }}
    {{ 'app.shared.event.add_a_new_file' | translate }}

    {{ 'app.shared.event.event_type' }} *

    0\\\">

    {{ 'app.shared.event.event_theme' }}

    0\\\">

    {{ 'app.shared.event.age_range' }}

    {{ 'app.shared.event.dates_and_opening_hours' }}

    {{ 'app.shared.event._and_ends_on' | translate }}

    {{ 'app.shared.event.prices_and_availabilities' }}

    {{currencySymbol}}
    {{ 'app.shared.event.0_equal_free' }}
    {{currencySymbol}}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/events/_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.admin.events_edit.edit_the_event' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/events/edit.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

    {{ 'app.admin.events_edit.confirmation_required' }}

    {{ 'app.admin.events_edit.edit_recurring_event' }}

    {{ 'app.admin.events_edit.date_wont_change' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/events/editRecurrent.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.admin.events_new.add_an_event' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/events/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ event.title }} {{event.category.name}}

    {{event.event_files_attributes.length}}

    {{ 'app.public.events_show.downloadable_documents' }}

    {{ 'app.public.events_show.information_and_booking' }}

    {{event.category.name}}
    0\\\"> {{event.event_themes[0].name}}
    {{event.age_range.name}}
    {{ 'app.public.events_show.dates' | translate }}
    {{ 'app.public.events_show.beginning' | translate }} {{event.start_date | amDateFormat:'L'}}
    {{ 'app.public.events_show.ending' | translate }} {{event.end_date | amDateFormat:'L'}}
    {{ 'app.public.events_show.opening_hours' | translate }}
    {{ 'app.public.events_show.all_day' }}
    {{ 'app.public.events_show.from_time' | translate }} {{event.start_date | amDateFormat:'LT'}} {{ 'app.public.events_show.to_time' | translate }} {{event.end_date | amDateFormat:'LT'}}
    {{ 'app.public.events_show.full_price_' | translate }} {{ event.amount | currency}}
    {{price.category.name}} : {{price.amount | currency}}
    0\\\">{{ 'app.public.events_show.tickets_still_availables' | translate }} {{event.nb_free_places}}
    0 && event.nb_free_places <= 0\\\">{{ 'app.public.events_show.sold_out' }}
    {{ 'app.public.events_show.cancelled' }}
    {{ 'app.public.events_show.without_reservation' }}
    {{ 'app.public.events_show.ticket' | translate:{NUMBER:reserve.nbReservePlaces} }}
    {{ 'app.public.events_show.ticket' | translate:{NUMBER:reserve.tickets[price.id]} }}
    {{ 'app.public.events_show.thank_you_your_payment_has_been_successfully_registered' | translate }}
    {{ 'app.public.events_show.you_can_find_your_reservation_s_details_on_your_' | translate }} {{ 'app.public.events_show.dashboard' }}
    {{ 'app.public.events_show.you_booked_DATE' | translate:{DATE:(reservation.created_at | amDateFormat:'L LT')} }}
    0\\\">{{ 'app.public.events_show.full_price_' | translate }} {{reservation.nb_reserve_places}} {{ 'app.public.events_show.ticket' | translate:{NUMBER:reservation.nb_reserve_places} }}
    {{ticket.event_price_category.price_category.name}} : {{ticket.booked}} {{ 'app.public.events_show.ticket' | translate:{NUMBER:ticket.booked} }}
    0 && reservationCanModify(reservation)\\\"> {{ 'app.shared.buttons.change' }}
    {{ 'app.public.events_show.canceled_reservation_SEATS' | translate:{SEATS:reservation.total_booked_seats} }}
    {{ 'app.public.events_show.event_is_over' }} 0\\\" translate>{{ 'app.public.events_show.thanks_for_coming' }} {{ 'app.public.events_show.view_event_list' }}
    0 && ctrl.member\\\" coupon=\\\"coupon.applied\\\" total=\\\"reserve.totalNoCoupon\\\" user-id=\\\"{{ctrl.member.id}}\\\">
    0\\\">

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/events/show.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/home.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.public.home.fablab_s_next_events' | translate }} {{ 'app.public.home.every_events' | translate }}

    {{event.title}}

    {{event.category.name}}


    {{ 'app.public.home.from_date_to_date' | translate:{START:(event.start_date | amDateFormat:'L'), END:(event.end_date | amDateFormat:'L')} }}
    {{ 'app.public.home.on_the_date' | translate:{DATE:(event.start_date | amDateFormat:'L')} }}
    {{ 'app.public.home.all_day' }} {{ 'app.public.home.from_time_to_time' | translate:{START:(event.start_date | amDateFormat:'LT'), END:(event.end_date | amDateFormat:'LT')} }}
    0\\\">{{ 'app.public.home.still_available' | translate }} {{event.nb_free_places}} {{ 'app.public.home.without_reservation' }} 0 && event.nb_free_places <= 0\\\" translate>{{ 'app.public.home.event_full' }}
    {{ 'app.public.home.free_admission' }} 0\\\">{{ 'app.public.home.full_price' | translate }} {{event.amount | currency}}
    {{ 'app.shared.buttons.consult' }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/home/events.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.public.home.latest_registered_members' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/home/members.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/home/news.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.public.home.latest_documented_projects' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/home/projects.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.public.home.latest_tweets' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/home/twitter.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    {{alert.msg}}
    {{ 'app.shared.machine.name_is_required' }}
    \\\"\\\"/
    {{ 'app.shared.machine.add_an_illustration' | translate }} {{ 'app.shared.buttons.change' }} {{ 'app.shared.buttons.delete' }}
    {{ 'app.shared.machine.description_is_required' }}
    {{ 'app.shared.machine.technical_specifications_are_required' }}
    {{file.attachment}}
    {{ 'app.shared.machine.attach_a_file' }} {{ 'app.shared.buttons.change' }}
    {{ 'app.shared.machine.add_an_attachment' | translate }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/machines/_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ machine.name }}

    {{ 'app.shared.buttons.cancel' }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/machines/edit.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.admin.machines_new.declare_a_new_machine' }}

    {{ 'app.admin.machines_new.watch_out_when_creating_a_new_machine_its_prices_are_initialized_at_0_for_all_subscriptions' | translate}} {{ 'app.admin.machines_new.consider_changing_them_before_creating_any_reservation_slot' | translate }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/machines/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.logged.machines_reserve.machine_planning' | translate }} : {{machine.name}}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/machines/reserve.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{machine.name}}\\\"

    {{ 'app.public.machines_show.technical_specifications' }}

    {{machine.machine_files_attributes.length}}

    {{ 'app.public.machines_show.files_to_download' }}

    {{ 'app.public.machines_show.projects_using_the_machine' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/machines/show.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \" \";\n// Exports\nvar _module_exports = code;;\nvar path = '/members/show.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \" \";\n// Exports\nvar _module_exports = code;;\nvar path = '/plans/_plan.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.logged.profile_completion.do_you_already_have_an_account' }}

    {{ 'app.logged.profile_completion.do_not_fill_the_form_beside_but_specify_here_the_code_you_ve_received_by_email_to_recover_your_access' }}

    {{ 'app.logged.profile_completion.just_specify_code_here_to_recover_access' }}

    {{ 'app.logged.profile_completion.i_did_not_receive_the_code' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/profile/_token.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Imports\nvar ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___ = require(\"../../../../node_modules/html-loader/dist/runtime/getUrl.js\");\nvar ___HTML_LOADER_IMPORT_0___ = require(\"../../images/arrow-left.png\");\n// Module\nvar ___HTML_LOADER_REPLACEMENT_0___ = ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___(___HTML_LOADER_IMPORT_0___);\nvar code = \"

    {{ 'app.logged.profile_completion.confirm_your_new_account' }}

    {{ 'app.logged.profile_completion.you_ve_just_created_a_new_account_on_the_fablab_by_logging_from' | translate:{ GENDER: nameGenre, NAME: fablabName } }}
    {{activeProvider.name}} ({{ssoEmail()}})

    {{ 'app.logged.profile_completion.we_need_some_more_details' }}.

    {{ 'app.logged.profile_completion.your_email_is_already_used_by_another_account_on_the_platform' }}

    {{ 'app.logged.profile_completion.or' }}

    {{ 'app.logged.profile_completion.new_on_this_platform' }}

    {{ 'app.logged.profile_completion.please_fill_the_following_form'}}.

    {{ 'app.logged.profile_completion.some_data_may_have_already_been_provided_by_provider_and_cannot_be_modified' | translate:{NAME:activeProvider.name} }}.
    {{ 'app.logged.profile_completion.then_click_on_' | translate }} {{ 'app.shared.buttons.confirm_changes' }} {{ 'app.logged.profile_completion._to_start_using_the_application' | translate }}.

    {{ 'app.logged.profile_completion.user_s_profile_is_required' }}
    {{ 'app.logged.profile_completion.i_ve_read_and_i_accept_' | translate }} {{ 'app.logged.profile_completion._the_fablab_policy' }}

    {{ 'app.logged.profile_completion.new_on_this_platform' }}

    {{ 'app.logged.profile_completion.your_email_' | translate }} ({{ssoEmail()}}) {{ 'app.logged.profile_completion._is_currently_associated_with_another_account_on_this_platform' | translate }} {{ 'app.logged.profile_completion.please_click_to_change_email_associated_with_your_PROVIDER_account' | translate:{PROVDER: activeProvider.name} }}

    {{ 'app.logged.profile_completion.change_my_data' | translate }}

    {{ 'app.logged.profile_completion.once_your_data_are_up_to_date_' | translate }} {{ 'app.logged.profile_completion._click_on_the_synchronization_button_opposite_' }} {{ 'app.logged.profile_completion.or' | translate}} {{ 'app.logged.profile_completion._disconnect_then_reconnect_' }} {{ 'app.logged.profile_completion._for_your_changes_to_take_effect' | translate }}

    {{ 'app.logged.profile_completion.or' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/profile/complete.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

    {{ 'app.logged.profile_completion.send_code_again' }}

    {{'app.logged.profile_completion.email_is_required'}} {{'app.logged.profile_completion.email_format_is_incorrect'}}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/profile/resend_code_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    {{alert.msg}}
    {{ 'app.shared.project.name_is_required' }}
    \\\"\\\"/
    {{ 'app.shared.project.add_an_illustration' | translate }} {{ 'app.shared.buttons.change' }} {{ 'app.shared.buttons.delete' }}
    {{file.attachment}}
    {{ 'app.shared.buttons.browse' }} {{ 'app.shared.buttons.change' }}
    {{ 'app.shared.project.add_a_new_file' | translate }}
    {{ 'app.shared.project.description_is_required' }}
    \\\"{{image.attachment}}\\\"/
    {{ 'app.shared.buttons.browse' | translate }} {{ 'app.shared.buttons.change' }} {{ 'app.shared.buttons.delete' }}
    {{ 'app.shared.project.add_a_new_step' }}

    {{ 'app.shared.project.employed_materials' }}

    {{ 'app.shared.project.employed_machines' }}

    {{ 'app.shared.project.collaborators' }}

    {{ 'app.shared.project.creative_commons_licences' }}

    {{ 'app.shared.project.themes' }}

    {{ 'app.shared.project.tags' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/projects/_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.logged.projects_edit.edit_the_project' | translate }} {{ 'app.logged.projects_edit.rough_draft' }}

    {{ 'app.logged.projects_edit.publish' }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/projects/edit.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.logged.projects_new.add_a_new_project' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/projects/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ project.name }} {{ 'app.public.projects_show.rough_draft' }}

    \\\"{{project.name}}\\\"

    {{ 'app.public.projects_show.project_description' }}

    {{ 'app.public.projects_show.step_N' | translate:{INDEX:step.step_nb} }} : {{step.title}}

    \\\"{{image.attachment}}\\\"
    1 || step.project_step_images_attributes.length == 0}\\\">

    {{ 'app.public.projects_show.posted_on_' | translate }} {{project.created_at | amDateFormat: 'LL'}}
    {{project.project_caos_attributes.length}}

    {{ 'app.public.projects_show.CAD_file_to_download' }}

    {{project.machines.length}}

    {{ 'app.public.projects_show.machines_and_materials' }}

    • {{component.name}}
    0\\\">
    {{project.project_users.length}}

    {{ 'app.public.projects_show.collaborators' }}

    • {{collaborator.full_name}} {{collaborator.username}}

    {{ 'app.public.projects_show.licence' }}

    {{ project.licence.name }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/projects/show.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    {{ 'app.admin.admins_new.pseudonym_is_required' }}
    {{ 'app.admin.admins_new.surname_is_required' }}
    {{ 'app.admin.admins_new.first_name_is_required' }}
    {{ 'app.admin.admins_new.email_is_required' }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_admin_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Imports\nvar ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___ = require(\"../../../../node_modules/html-loader/dist/runtime/getUrl.js\");\nvar ___HTML_LOADER_IMPORT_0___ = require(\"../../images/arrow-left.png\");\n// Module\nvar ___HTML_LOADER_REPLACEMENT_0___ = ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___(___HTML_LOADER_IMPORT_0___);\nvar code = \"

    {{ 'app.shared.cart.summary' }}

    {{ 'app.shared.cart.select_one_or_more_slots_in_the_calendar' | translate:{SINGLE:limitToOneSlot} }} {{ 'app.shared.cart.select_a_plan' }}

    0\\\">
    {{ 'app.shared.cart.you_ve_just_selected_the_slot' }}
    {{ 'app.shared.cart.datetime_to_time' | translate:{START_DATETIME:(slot.start | amDateFormat:'LLLL'), END_TIME:(slot.end | amDateFormat:'LT') } }}
    {{ 'app.shared.cart.cost_of_TYPE' | translate:{TYPE:reservableType} }} {{slot.price | currency}}
    0\\\">
    0\\\">
    {{ 'app.shared.cart.slot_restrict_plans' }}
    {{::group.name}}
    • {{::plan.name}}
    {{ 'app.shared.cart.slot_restrict_plans_of_others_groups' }}
    0 && slot.plansGrouped.length === 0\\\">

    {{ 'app.shared.cart.to_benefit_from_attractive_prices' }}

    {{ 'app.shared.cart.or' }}

    {{ 'app.shared.cart.you_ve_just_selected_a_subscription_html' }}
    {{selectedPlan | humanReadablePlanName }}
    {{ 'app.shared.cart.cost_of_the_subscription' | translate }} {{selectedPlan.amount | currency}}
    {{ 'app.shared.cart.you_ve_just_selected_a_subscription_html' }}
    {{ selectedPlan | humanReadablePlanName }}
    {{ 'app.shared.cart.subscription_price' | translate }} {{selectedPlan.amount | currency}}
    0\\\"> {{ 'app.shared.cart.you_have_settled_the_following_TYPE' | translate:{TYPE:reservableType} }} {{reservableName}}:
    {{ 'app.shared.cart.datetime_to_time' | translate:{START_DATETIME:(paidSlot.start | amDateFormat:'LLLL'), END_TIME:(paidSlot.end | amDateFormat:'LT') } }}
    {{ 'app.shared.cart.cost_of_TYPE' | translate:{TYPE:reservableType} }} {{paidSlot.price | currency}}
    {{ 'app.shared.cart.you_have_settled_a_' | translate }}
    {{ 'app.shared.cart._subscription' }} :
    {{selectedPlan | humanReadablePlanName }}
    {{ 'app.shared.cart.cost_of_the_subscription' | translate }} {{selectedPlan.amount | currency}}
    {{ 'app.shared.cart.total_' | translate }} {{amountPaid | currency}}
    {{ 'app.shared.cart.thank_you_your_payment_has_been_successfully_registered' | translate }}
    {{ 'app.shared.cart.your_invoice_will_be_available_soon_from_your_' | translate }} {{ 'app.shared.cart.dashboard' }}

    {{ 'app.shared.cart.summary' }}

    {{ 'app.shared.cart.i_want_to_change_the_following_reservation' }}
    {{ 'app.shared.cart.datetime_to_time' | translate:{START_DATETIME:(events.modifiable.start | amDateFormat:'LLLL'), END_TIME:(events.modifiable.end | amDateFormat:'LT') } }}

    {{ 'app.shared.cart.select_a_new_slot_in_the_calendar' | translate }}

    {{ 'app.shared.cart.datetime_to_time' | translate:{START_DATETIME:(events.placable.start | amDateFormat:'LLLL'), END_TIME:(events.placable.end | amDateFormat:'LT') } }}
    0 || events.placable.tags.length > 0)\\\" ng-class=\\\"{'panel panel-danger bg-red': tagMissmatch()}\\\">
    {{ 'app.shared.cart.tags_of_the_original_slot' | translate }}
    {{tag.name}} {{ 'app.shared.cart.none' }}

    {{ 'app.shared.cart.tags_of_the_destination_slot' | translate }}
    {{tag.name}} {{ 'app.shared.cart.none' }}
    {{ 'app.shared.cart.your_booking_slot_was_successfully_moved_from_' }}
    {{ 'app.shared.cart.datetime_to_time' | translate:{START_DATETIME:(events.moved.oldSlot.start | amDateFormat:'LLLL'), END_TIME:(events.moved.oldSlot.end | amDateFormat:'LT') } }}

    {{ 'app.shared.cart.to_date' }}

    {{ 'app.shared.cart.datetime_to_time' | translate:{START_DATETIME:(events.moved.newSlot.start | amDateFormat:'LLLL'), END_TIME:(events.moved.newSlot.end | amDateFormat:'LT') } }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_cart.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    {{ 'app.shared.coupon_input.i_have_a_coupon' }}
    {{msg.message}}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_coupon.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    {{ 'app.admin.manager_new.pseudonym_is_required' }}
    {{ 'app.admin.manager_new.surname_is_required' }}
    {{ 'app.admin.manager_new.first_name_is_required' }}
    {{ 'app.admin.manager_new.email_is_required' }}
    {{ 'app.shared.user_admin.group_is_required' }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_manager_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Imports\nvar ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___ = require(\"../../../../node_modules/html-loader/dist/runtime/getUrl.js\");\nvar ___HTML_LOADER_IMPORT_0___ = require(\"../../images/no_avatar.png\");\nvar ___HTML_LOADER_IMPORT_1___ = require(\"../../images/social/dailymotion.png\");\nvar ___HTML_LOADER_IMPORT_2___ = require(\"../../images/social/echosciences.png\");\n// Module\nvar ___HTML_LOADER_REPLACEMENT_0___ = ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___(___HTML_LOADER_IMPORT_0___);\nvar ___HTML_LOADER_REPLACEMENT_1___ = ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___(___HTML_LOADER_IMPORT_1___);\nvar ___HTML_LOADER_REPLACEMENT_2___ = ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___(___HTML_LOADER_IMPORT_2___);\nvar code = \"{{alert.msg}}
    {{ 'app.shared.user.add_an_avatar' }} {{ 'app.shared.buttons.change' }}
    {{ 'app.shared.user.gender_is_required' }}
    {{ 'app.shared.user.pseudonym_is_required' }}
    {{ 'app.shared.user.surname_is_required' }}
    {{ 'app.shared.user.first_name_is_required' }}
    {{ 'app.shared.user.email_address_is_required' }}
    {{ 'app.shared.user.password_is_required' }} {{ 'app.shared.user.password_is_too_short' }}
    {{ 'app.shared.user.confirmation_of_password_is_required' }} {{ 'app.shared.user.confirmation_of_password_is_too_short' }} {{ 'app.shared.user.confirmation_mismatch_with_password' }}
    {{ 'app.shared.user.organization_name_is_required' }}
    {{ 'app.shared.user.organization_address_is_required' }}
    {{ 'app.shared.user.date_of_birth_is_required' }}
    {{ 'app.shared.user.phone_number_is_required' }}
    \\\"d\\\"
    \\\"d\\\"
    \\\"d\\\"
    \\\"E\\\"
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_member_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.shared.member_select.select_a_member' }}

    {{member}}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_member_select.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.shared.plan.new_partner' }}

    {{ 'app.shared.plan.first_name_is_required' }}
    {{ 'app.shared.plan.surname_is_required' }}
    {{ 'app.shared.plan.email_address_is_required' }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_partner_new_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

    {{ 'app.shared.cart.tags_mismatch' }}

    {{ 'app.shared.cart.confirm_book_slot_tags_mismatch' }}

    {{ 'app.shared.cart.unable_to_book_slot_tags_mismatch' }}

    {{ 'app.shared.cart.slot_tags' }}

      0\\\">
    • {{t.name}}
    0\\\" translate>{{ 'app.shared.cart.no_tags' }}

    {{ 'app.shared.cart.user_tags' }}

    • 0\\\"> {{t.name}}
    0\\\" translate>{{ 'app.shared.cart.no_tags' }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_reserve_slot_tags_mismatch.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

    {{ 'app.shared.cart.selected_plan_dont_match_slot' }}

    {{ 'app.shared.cart.user_plan_dont_match_slot' }}

    {{ 'app.shared.cart.no_plan_match_slot' }}

    {{ 'app.shared.cart.datetime_to_time' | translate:{START_DATETIME:(slot.start | amDateFormat:'LLLL'), END_TIME:(slot.end | amDateFormat:'LT') } }}
    0\\\">
    {{ 'app.shared.cart.slot_restrict_plans' }}
    {{::group.name}}
    • {{::plan.name}}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_reserve_slot_without_plan.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \" \\\"{{altText}}\\\" \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_social_link.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Imports\nvar ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___ = require(\"../../../../node_modules/html-loader/dist/runtime/getUrl.js\");\nvar ___HTML_LOADER_IMPORT_0___ = require(\"../../images/no_avatar.png\");\n// Module\nvar ___HTML_LOADER_REPLACEMENT_0___ = ___HTML_LOADER_GET_SOURCE_FROM_IMPORT___(___HTML_LOADER_IMPORT_0___);\nvar code = \" \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/_user_avatar.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \" \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/about.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

    {{object.title}}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/confirm_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

    {{ 'app.shared.confirm_modify_slot_modal.change_the_slot' }}

    {{ 'app.shared.confirm_modify_slot_modal.do_you_want_to_change_your_booking_slot_initially_planned_at' }}

    {{ 'app.shared.confirm_modify_slot_modal.do_you_want_to_change_NAME_s_booking_slot_initially_planned_at' }}

    {{object.start | amDateFormat: 'LL'}} : {{object.start | amDateFormat:'LT'}} - {{object.end | amDateFormat:'LT'}}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/confirm_modify_slot_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.public.common.cookies.about_cookies' }} {{ 'app.public.common.cookies.learn_more' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/cookies.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \" \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/header.html.erb';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

    {{ 'app.shared.help.title' }}

    {{ 'app.shared.help.what_to_do' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/help_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/leftnav.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.public.privacy.title' }}

    {{ 'app.public.privacy.last_update' }} {{ privacyBody.last_update | amDateFormat:'LL' }}

    {{ 'app.public.privacy.dpo' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/privacy.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    4\\\">
    {{user.username}}
    {{user.name}} {{ 'app.shared.public_profile.private_profile' | translate }}
    {{ 'app.shared.public_profile.last_activity_html' }}
    {{ 'app.shared.public_profile.email_address' }}
    {{user.email}}
    {{ 'app.shared.public_profile.interests' }}
    {{user.profile.interest}}
    {{ 'app.shared.public_profile.CAD_softwares_mastered' }}
    {{user.profile.software_mastered}}

    {{ 'app.shared.public_profile.trainings' }}

      0 || user.trainings.length > 0\\\">
    • {{r.reservable.name}} - {{ 'app.shared.public_profile.to_come' }}
    • {{t.name}} - {{ 'app.shared.public_profile.approved' }}
    {{ 'app.shared.public_profile.no_trainings' }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/publicProfile.html.erb';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

    {{ 'app.public.projects_show.report_an_abuse' }}

    {{ 'app.public.projects_show.your_first_name_is_required' }}
    {{ 'app.public.projects_show.your_surname_is_required' }}
    {{ 'app.public.projects_show.your_email_address_is_required' }}
    {{ 'app.public.projects_show.message_is_required' }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/signalAbuseModal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/shared/tour-step-template.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"{{alert.msg}}
    {{ 'app.shared.space.name_is_required' }}
    \\\"\\\"/
    {{ 'app.shared.space.add_an_illustration' | translate }} {{ 'app.shared.buttons.change' }} {{ 'app.shared.buttons.delete' }}
    {{ 'app.shared.space.default_places_is_required' }}
    {{file.attachment}}
    {{ 'app.shared.space.attach_a_file' }} {{ 'app.shared.buttons.change' }}
    {{ 'app.shared.space.add_an_attachment' | translate }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/spaces/_form.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.admin.space_edit.edit_the_space_NAME' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/spaces/edit.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.admin.space_new.add_a_new_space' }}

    {{ 'app.admin.space_new.watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions' | translate}} {{ 'app.admin.space_new.consider_changing_its_prices_before_creating_any_reservation_slot' | translate }}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/spaces/new.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.logged.space_reserve.planning_of_space_NAME' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/spaces/reserve.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{space.name}}\\\"

    {{ 'app.public.space_show.characteristics' }}

    {{space.space_files_attributes.length}}

    {{ 'app.public.space_show.files_to_download' }}

    {{ 'app.public.space_show.projects_using_the_space' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/spaces/show.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{ 'app.logged.trainings_reserve.trainings_planning' }}

    {{ 'app.logged.trainings_reserve.planning_of' }} {{training.name}}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/trainings/reserve.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \" \";\n// Exports\nvar _module_exports = code;;\nvar path = '/trainings/show.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    \\\"{{logo.custom_asset_file_attributes.attachment}}\\\"

    {{ 'app.shared.wallet.credit_title' }}

    {{ 'app.shared.wallet.warning_uneditable_credit' }}
    {{currencySymbol}} {{'app.shared.wallet.amount_is_required'}} {{ 'app.shared.wallet.amount_minimum_1' | translate }} {{currencySymbol}}.
    {{currencySymbol}} {{'app.shared.wallet.amount_confirm_is_required'}} {{ 'app.shared.wallet.amount_confirm_does_not_match' | translate }}

    {{ 'app.shared.wallet.creation_date_is_required' }}

    {{ 'app.shared.wallet.will_appear_on_the_refund_invoice' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/wallet/credit_modal.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"

    {{'app.shared.wallet.your_wallet_amount'}}

    {{'app.shared.wallet.wallet_amount'}}

    {{wallet.amount | currency}}
    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/wallet/show.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","// Module\nvar code = \"
    0\\\">
    {{ 'app.shared.wallet.date' }} {{ 'app.shared.wallet.operation' }} {{ 'app.shared.wallet.operator' }} {{ 'app.shared.wallet.amount' }}
    {{ ::t.created_at | amDateFormat:'L' }} {{ 'app.shared.wallet.credit' }} {{ 'app.shared.wallet.debit' }} {{::t.invoice.reference}} {{::t.payment_schedule.reference}} {{ ::t.user.full_name }} + - {{ ::t.amount | currency }}

    {{ 'app.shared.wallet.no_transactions_for_now' }}

    \";\n// Exports\nvar _module_exports = code;;\nvar path = '/wallet/transactions.html';\nvar angular = require('angular');\nangular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);\nmodule.exports = path;","import apiClient from './api-client';\nimport { AxiosResponse } from 'axios';\nimport wrapPromise, { IWrapPromise } from '../lib/wrap-promise';\nimport { Wallet } from '../models/wallet';\n\nexport default class WalletAPI {\n static async getByUser (user_id: number): Promise {\n const res: AxiosResponse = await apiClient.get(`/api/wallet/by_user/${user_id}`);\n return res?.data;\n }\n}\n\n","import apiClient from './api-client';\nimport { AxiosResponse } from 'axios';\nimport { CartItems } from '../models/payment';\nimport { ComputePriceResult } from '../models/price';\n\nexport default class PriceAPI {\n static async compute (cartItems: CartItems): Promise {\n const res: AxiosResponse = await apiClient.post(`/api/prices/compute`, cartItems);\n return res?.data;\n }\n}\n\n","import 'core-js/stable';\nimport 'regenerator-runtime/runtime';\n\nimport 'jquery';\nimport {} from 'jquery-ujs';\nimport 'bootstrap-sass';\nimport '../src/javascript/lib/polyfill';\nimport 'angular';\n\nimport 'angular-i18n/angular-locale_fr-fr.js';\n\nimport 'angular-cookies';\nimport 'angular-resource';\nimport 'angular-sanitize';\nimport 'angular-touch';\nimport '@uirouter/angularjs';\nimport 'angular-ui-bootstrap';\nimport 'ui-select';\nimport 'moment';\n\nimport 'moment/locale/fr.js';\n\nimport 'moment-timezone';\nimport 'angular-ui-calendar';\nimport 'fullcalendar';\n\nimport 'fullcalendar/dist/locale/fr.js';\n\nimport 'angular-moment';\nimport 'ngUpload';\nimport 'jasny-bootstrap/js/fileinput';\nimport 'holderjs';\nimport 'AngularDevise';\nimport '../src/javascript/lib/devise-modal';\nimport 'angular-growl-v2';\nimport 'angular-xeditable';\nimport 'checklist-model/checklist-model';\nimport 'angular-unsavedchanges/lib/unsavedChanges';\nimport 'angular-loading-bar/src/loading-bar';\nimport 'angular-scroll/angular-scroll';\nimport 'angular-google-analytics/dist/angular-google-analytics';\nimport '../src/javascript/lib/dirDisqus';\nimport '../src/javascript/lib/humanize';\nimport 'underscore/underscore';\nimport 'elasticsearch-browser/elasticsearch.angular';\nimport 'd3/d3';\nimport 'nvd3/build/nv.d3.js';\nimport 'twitter-fetcher';\nimport 'medium-editor/dist/js/medium-editor';\nimport 'angular-medium-editor/dist/angular-medium-editor';\nimport 'bootstrap-switch/dist/js/bootstrap-switch';\nimport 'angular-bootstrap-switch/dist/angular-bootstrap-switch';\nimport 'angular-base64-upload/dist/angular-base64-upload.min';\nimport 'summernote';\n\nimport 'summernote/lang/summernote-fr-FR.js';\n\nimport 'angular-summernote/dist/angular-summernote';\nimport '../src/javascript/lib/summernote-ext-nugget';\nimport '@claviska/jquery-minicolors/jquery.minicolors.js';\nimport 'angular-minicolors/angular-minicolors.js';\nimport 'angular-translate/dist/angular-translate';\nimport 'angular-translate-loader-partial/angular-translate-loader-partial';\nimport 'messageformat/messageformat';\nimport 'angular-translate-interpolation-messageformat/angular-translate-interpolation-messageformat';\nimport 'ng-fittext/dist/ng-FitText.min';\nimport 'angular-aside/dist/js/angular-aside';\nimport 'ng-caps-lock/ng-caps-lock';\nimport 'angular-recaptcha';\nimport 'codemirror/lib/codemirror';\nimport 'codemirror/addon/edit/matchbrackets';\nimport 'codemirror/mode/css/css';\nimport 'codemirror/mode/sass/sass';\nimport 'angular-ui-codemirror/src/ui-codemirror';\nimport 'angular-hotkeys/build/hotkeys';\nimport 'hone/dist/hone';\nimport 'tether/dist/js/tether';\nimport 'angular-bind-html-compile/angular-bind-html-compile';\nimport 'angular-ui-tour/app/angular-ui-tour';\nimport '@fortawesome/fontawesome-free';\nimport '@fortawesome/fontawesome-free/js/v4-shims';\n\nrequire('../src/javascript/app.js');\nrequire('../src/javascript/router.js');\nrequire('../src/javascript/plugins.js.erb');\n\nfunction importAll (r) { r.keys().forEach(r); }\n\nimportAll(require.context('../src/javascript/components/', true, /.*/));\nimportAll(require.context('../src/javascript/controllers/', true, /.*/));\nimportAll(require.context('../src/javascript/services/', true, /.*/));\nimportAll(require.context('../src/javascript/directives/', true, /.*/));\nimportAll(require.context('../src/javascript/filters/', true, /.*/));\nimportAll(require.context('../src/javascript/typings/', true, /.*/));\n\nimportAll(require.context('../images', true));\nimportAll(require.context('../templates', true));\n","if (typeof Object.assign !== 'function') {\n // Must be writable: true, enumerable: false, configurable: true\n Object.defineProperty(Object, 'assign', {\n value: function assign (target, varArgs) { // .length of function is 2\n 'use strict';\n if (target == null) { // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var to = Object(target);\n\n for (var index = 1; index < arguments.length; index++) {\n var nextSource = arguments[index];\n\n if (nextSource != null) { // Skip over if undefined or null\n for (var nextKey in nextSource) {\n // Avoid bugs when hasOwnProperty is shadowed\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n },\n writable: true,\n configurable: true\n });\n}\n\nNumber.isInteger = Number.isInteger || function (value) {\n return typeof value === 'number' &&\n isFinite(value) &&\n Math.floor(value) === value;\n};\n","var map = {\n\t\"./af\": 261,\n\t\"./af.js\": 261,\n\t\"./ar\": 262,\n\t\"./ar-dz\": 263,\n\t\"./ar-dz.js\": 263,\n\t\"./ar-kw\": 264,\n\t\"./ar-kw.js\": 264,\n\t\"./ar-ly\": 265,\n\t\"./ar-ly.js\": 265,\n\t\"./ar-ma\": 266,\n\t\"./ar-ma.js\": 266,\n\t\"./ar-sa\": 267,\n\t\"./ar-sa.js\": 267,\n\t\"./ar-tn\": 268,\n\t\"./ar-tn.js\": 268,\n\t\"./ar.js\": 262,\n\t\"./az\": 269,\n\t\"./az.js\": 269,\n\t\"./be\": 270,\n\t\"./be.js\": 270,\n\t\"./bg\": 271,\n\t\"./bg.js\": 271,\n\t\"./bm\": 272,\n\t\"./bm.js\": 272,\n\t\"./bn\": 273,\n\t\"./bn.js\": 273,\n\t\"./bo\": 274,\n\t\"./bo.js\": 274,\n\t\"./br\": 275,\n\t\"./br.js\": 275,\n\t\"./bs\": 276,\n\t\"./bs.js\": 276,\n\t\"./ca\": 277,\n\t\"./ca.js\": 277,\n\t\"./cs\": 278,\n\t\"./cs.js\": 278,\n\t\"./cv\": 279,\n\t\"./cv.js\": 279,\n\t\"./cy\": 280,\n\t\"./cy.js\": 280,\n\t\"./da\": 281,\n\t\"./da.js\": 281,\n\t\"./de\": 282,\n\t\"./de-at\": 283,\n\t\"./de-at.js\": 283,\n\t\"./de-ch\": 284,\n\t\"./de-ch.js\": 284,\n\t\"./de.js\": 282,\n\t\"./dv\": 285,\n\t\"./dv.js\": 285,\n\t\"./el\": 286,\n\t\"./el.js\": 286,\n\t\"./en-au\": 287,\n\t\"./en-au.js\": 287,\n\t\"./en-ca\": 288,\n\t\"./en-ca.js\": 288,\n\t\"./en-gb\": 289,\n\t\"./en-gb.js\": 289,\n\t\"./en-ie\": 290,\n\t\"./en-ie.js\": 290,\n\t\"./en-il\": 291,\n\t\"./en-il.js\": 291,\n\t\"./en-nz\": 292,\n\t\"./en-nz.js\": 292,\n\t\"./eo\": 293,\n\t\"./eo.js\": 293,\n\t\"./es\": 294,\n\t\"./es-do\": 295,\n\t\"./es-do.js\": 295,\n\t\"./es-us\": 296,\n\t\"./es-us.js\": 296,\n\t\"./es.js\": 294,\n\t\"./et\": 297,\n\t\"./et.js\": 297,\n\t\"./eu\": 298,\n\t\"./eu.js\": 298,\n\t\"./fa\": 299,\n\t\"./fa.js\": 299,\n\t\"./fi\": 300,\n\t\"./fi.js\": 300,\n\t\"./fo\": 301,\n\t\"./fo.js\": 301,\n\t\"./fr\": 187,\n\t\"./fr-ca\": 302,\n\t\"./fr-ca.js\": 302,\n\t\"./fr-ch\": 303,\n\t\"./fr-ch.js\": 303,\n\t\"./fr.js\": 187,\n\t\"./fy\": 304,\n\t\"./fy.js\": 304,\n\t\"./gd\": 305,\n\t\"./gd.js\": 305,\n\t\"./gl\": 306,\n\t\"./gl.js\": 306,\n\t\"./gom-latn\": 307,\n\t\"./gom-latn.js\": 307,\n\t\"./gu\": 308,\n\t\"./gu.js\": 308,\n\t\"./he\": 309,\n\t\"./he.js\": 309,\n\t\"./hi\": 310,\n\t\"./hi.js\": 310,\n\t\"./hr\": 311,\n\t\"./hr.js\": 311,\n\t\"./hu\": 312,\n\t\"./hu.js\": 312,\n\t\"./hy-am\": 313,\n\t\"./hy-am.js\": 313,\n\t\"./id\": 314,\n\t\"./id.js\": 314,\n\t\"./is\": 315,\n\t\"./is.js\": 315,\n\t\"./it\": 316,\n\t\"./it.js\": 316,\n\t\"./ja\": 317,\n\t\"./ja.js\": 317,\n\t\"./jv\": 318,\n\t\"./jv.js\": 318,\n\t\"./ka\": 319,\n\t\"./ka.js\": 319,\n\t\"./kk\": 320,\n\t\"./kk.js\": 320,\n\t\"./km\": 321,\n\t\"./km.js\": 321,\n\t\"./kn\": 322,\n\t\"./kn.js\": 322,\n\t\"./ko\": 323,\n\t\"./ko.js\": 323,\n\t\"./ky\": 324,\n\t\"./ky.js\": 324,\n\t\"./lb\": 325,\n\t\"./lb.js\": 325,\n\t\"./lo\": 326,\n\t\"./lo.js\": 326,\n\t\"./lt\": 327,\n\t\"./lt.js\": 327,\n\t\"./lv\": 328,\n\t\"./lv.js\": 328,\n\t\"./me\": 329,\n\t\"./me.js\": 329,\n\t\"./mi\": 330,\n\t\"./mi.js\": 330,\n\t\"./mk\": 331,\n\t\"./mk.js\": 331,\n\t\"./ml\": 332,\n\t\"./ml.js\": 332,\n\t\"./mn\": 333,\n\t\"./mn.js\": 333,\n\t\"./mr\": 334,\n\t\"./mr.js\": 334,\n\t\"./ms\": 335,\n\t\"./ms-my\": 336,\n\t\"./ms-my.js\": 336,\n\t\"./ms.js\": 335,\n\t\"./mt\": 337,\n\t\"./mt.js\": 337,\n\t\"./my\": 338,\n\t\"./my.js\": 338,\n\t\"./nb\": 339,\n\t\"./nb.js\": 339,\n\t\"./ne\": 340,\n\t\"./ne.js\": 340,\n\t\"./nl\": 341,\n\t\"./nl-be\": 342,\n\t\"./nl-be.js\": 342,\n\t\"./nl.js\": 341,\n\t\"./nn\": 343,\n\t\"./nn.js\": 343,\n\t\"./pa-in\": 344,\n\t\"./pa-in.js\": 344,\n\t\"./pl\": 345,\n\t\"./pl.js\": 345,\n\t\"./pt\": 346,\n\t\"./pt-br\": 347,\n\t\"./pt-br.js\": 347,\n\t\"./pt.js\": 346,\n\t\"./ro\": 348,\n\t\"./ro.js\": 348,\n\t\"./ru\": 349,\n\t\"./ru.js\": 349,\n\t\"./sd\": 350,\n\t\"./sd.js\": 350,\n\t\"./se\": 351,\n\t\"./se.js\": 351,\n\t\"./si\": 352,\n\t\"./si.js\": 352,\n\t\"./sk\": 353,\n\t\"./sk.js\": 353,\n\t\"./sl\": 354,\n\t\"./sl.js\": 354,\n\t\"./sq\": 355,\n\t\"./sq.js\": 355,\n\t\"./sr\": 356,\n\t\"./sr-cyrl\": 357,\n\t\"./sr-cyrl.js\": 357,\n\t\"./sr.js\": 356,\n\t\"./ss\": 358,\n\t\"./ss.js\": 358,\n\t\"./sv\": 359,\n\t\"./sv.js\": 359,\n\t\"./sw\": 360,\n\t\"./sw.js\": 360,\n\t\"./ta\": 361,\n\t\"./ta.js\": 361,\n\t\"./te\": 362,\n\t\"./te.js\": 362,\n\t\"./tet\": 363,\n\t\"./tet.js\": 363,\n\t\"./tg\": 364,\n\t\"./tg.js\": 364,\n\t\"./th\": 365,\n\t\"./th.js\": 365,\n\t\"./tl-ph\": 366,\n\t\"./tl-ph.js\": 366,\n\t\"./tlh\": 367,\n\t\"./tlh.js\": 367,\n\t\"./tr\": 368,\n\t\"./tr.js\": 368,\n\t\"./tzl\": 369,\n\t\"./tzl.js\": 369,\n\t\"./tzm\": 370,\n\t\"./tzm-latn\": 371,\n\t\"./tzm-latn.js\": 371,\n\t\"./tzm.js\": 370,\n\t\"./ug-cn\": 372,\n\t\"./ug-cn.js\": 372,\n\t\"./uk\": 373,\n\t\"./uk.js\": 373,\n\t\"./ur\": 374,\n\t\"./ur.js\": 374,\n\t\"./uz\": 375,\n\t\"./uz-latn\": 376,\n\t\"./uz-latn.js\": 376,\n\t\"./uz.js\": 375,\n\t\"./vi\": 377,\n\t\"./vi.js\": 377,\n\t\"./x-pseudo\": 378,\n\t\"./x-pseudo.js\": 378,\n\t\"./yo\": 379,\n\t\"./yo.js\": 379,\n\t\"./zh-cn\": 380,\n\t\"./zh-cn.js\": 380,\n\t\"./zh-hk\": 381,\n\t\"./zh-hk.js\": 381,\n\t\"./zh-tw\": 382,\n\t\"./zh-tw.js\": 382\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1060;","var map = {\n\t\"./af\": 384,\n\t\"./af.js\": 384,\n\t\"./ar\": 385,\n\t\"./ar-dz\": 386,\n\t\"./ar-dz.js\": 386,\n\t\"./ar-kw\": 387,\n\t\"./ar-kw.js\": 387,\n\t\"./ar-ly\": 388,\n\t\"./ar-ly.js\": 388,\n\t\"./ar-ma\": 389,\n\t\"./ar-ma.js\": 389,\n\t\"./ar-sa\": 390,\n\t\"./ar-sa.js\": 390,\n\t\"./ar-tn\": 391,\n\t\"./ar-tn.js\": 391,\n\t\"./ar.js\": 385,\n\t\"./az\": 392,\n\t\"./az.js\": 392,\n\t\"./be\": 393,\n\t\"./be.js\": 393,\n\t\"./bg\": 394,\n\t\"./bg.js\": 394,\n\t\"./bm\": 395,\n\t\"./bm.js\": 395,\n\t\"./bn\": 396,\n\t\"./bn.js\": 396,\n\t\"./bo\": 397,\n\t\"./bo.js\": 397,\n\t\"./br\": 398,\n\t\"./br.js\": 398,\n\t\"./bs\": 399,\n\t\"./bs.js\": 399,\n\t\"./ca\": 400,\n\t\"./ca.js\": 400,\n\t\"./cs\": 401,\n\t\"./cs.js\": 401,\n\t\"./cv\": 402,\n\t\"./cv.js\": 402,\n\t\"./cy\": 403,\n\t\"./cy.js\": 403,\n\t\"./da\": 404,\n\t\"./da.js\": 404,\n\t\"./de\": 405,\n\t\"./de-at\": 406,\n\t\"./de-at.js\": 406,\n\t\"./de-ch\": 407,\n\t\"./de-ch.js\": 407,\n\t\"./de.js\": 405,\n\t\"./dv\": 408,\n\t\"./dv.js\": 408,\n\t\"./el\": 409,\n\t\"./el.js\": 409,\n\t\"./en-SG\": 410,\n\t\"./en-SG.js\": 410,\n\t\"./en-au\": 411,\n\t\"./en-au.js\": 411,\n\t\"./en-ca\": 412,\n\t\"./en-ca.js\": 412,\n\t\"./en-gb\": 413,\n\t\"./en-gb.js\": 413,\n\t\"./en-ie\": 414,\n\t\"./en-ie.js\": 414,\n\t\"./en-il\": 415,\n\t\"./en-il.js\": 415,\n\t\"./en-nz\": 416,\n\t\"./en-nz.js\": 416,\n\t\"./eo\": 417,\n\t\"./eo.js\": 417,\n\t\"./es\": 418,\n\t\"./es-do\": 419,\n\t\"./es-do.js\": 419,\n\t\"./es-us\": 420,\n\t\"./es-us.js\": 420,\n\t\"./es.js\": 418,\n\t\"./et\": 421,\n\t\"./et.js\": 421,\n\t\"./eu\": 422,\n\t\"./eu.js\": 422,\n\t\"./fa\": 423,\n\t\"./fa.js\": 423,\n\t\"./fi\": 424,\n\t\"./fi.js\": 424,\n\t\"./fo\": 425,\n\t\"./fo.js\": 425,\n\t\"./fr\": 426,\n\t\"./fr-ca\": 427,\n\t\"./fr-ca.js\": 427,\n\t\"./fr-ch\": 428,\n\t\"./fr-ch.js\": 428,\n\t\"./fr.js\": 426,\n\t\"./fy\": 429,\n\t\"./fy.js\": 429,\n\t\"./ga\": 430,\n\t\"./ga.js\": 430,\n\t\"./gd\": 431,\n\t\"./gd.js\": 431,\n\t\"./gl\": 432,\n\t\"./gl.js\": 432,\n\t\"./gom-latn\": 433,\n\t\"./gom-latn.js\": 433,\n\t\"./gu\": 434,\n\t\"./gu.js\": 434,\n\t\"./he\": 435,\n\t\"./he.js\": 435,\n\t\"./hi\": 436,\n\t\"./hi.js\": 436,\n\t\"./hr\": 437,\n\t\"./hr.js\": 437,\n\t\"./hu\": 438,\n\t\"./hu.js\": 438,\n\t\"./hy-am\": 439,\n\t\"./hy-am.js\": 439,\n\t\"./id\": 440,\n\t\"./id.js\": 440,\n\t\"./is\": 441,\n\t\"./is.js\": 441,\n\t\"./it\": 442,\n\t\"./it-ch\": 443,\n\t\"./it-ch.js\": 443,\n\t\"./it.js\": 442,\n\t\"./ja\": 444,\n\t\"./ja.js\": 444,\n\t\"./jv\": 445,\n\t\"./jv.js\": 445,\n\t\"./ka\": 446,\n\t\"./ka.js\": 446,\n\t\"./kk\": 447,\n\t\"./kk.js\": 447,\n\t\"./km\": 448,\n\t\"./km.js\": 448,\n\t\"./kn\": 449,\n\t\"./kn.js\": 449,\n\t\"./ko\": 450,\n\t\"./ko.js\": 450,\n\t\"./ku\": 451,\n\t\"./ku.js\": 451,\n\t\"./ky\": 452,\n\t\"./ky.js\": 452,\n\t\"./lb\": 453,\n\t\"./lb.js\": 453,\n\t\"./lo\": 454,\n\t\"./lo.js\": 454,\n\t\"./lt\": 455,\n\t\"./lt.js\": 455,\n\t\"./lv\": 456,\n\t\"./lv.js\": 456,\n\t\"./me\": 457,\n\t\"./me.js\": 457,\n\t\"./mi\": 458,\n\t\"./mi.js\": 458,\n\t\"./mk\": 459,\n\t\"./mk.js\": 459,\n\t\"./ml\": 460,\n\t\"./ml.js\": 460,\n\t\"./mn\": 461,\n\t\"./mn.js\": 461,\n\t\"./mr\": 462,\n\t\"./mr.js\": 462,\n\t\"./ms\": 463,\n\t\"./ms-my\": 464,\n\t\"./ms-my.js\": 464,\n\t\"./ms.js\": 463,\n\t\"./mt\": 465,\n\t\"./mt.js\": 465,\n\t\"./my\": 466,\n\t\"./my.js\": 466,\n\t\"./nb\": 467,\n\t\"./nb.js\": 467,\n\t\"./ne\": 468,\n\t\"./ne.js\": 468,\n\t\"./nl\": 469,\n\t\"./nl-be\": 470,\n\t\"./nl-be.js\": 470,\n\t\"./nl.js\": 469,\n\t\"./nn\": 471,\n\t\"./nn.js\": 471,\n\t\"./pa-in\": 472,\n\t\"./pa-in.js\": 472,\n\t\"./pl\": 473,\n\t\"./pl.js\": 473,\n\t\"./pt\": 474,\n\t\"./pt-br\": 475,\n\t\"./pt-br.js\": 475,\n\t\"./pt.js\": 474,\n\t\"./ro\": 476,\n\t\"./ro.js\": 476,\n\t\"./ru\": 477,\n\t\"./ru.js\": 477,\n\t\"./sd\": 478,\n\t\"./sd.js\": 478,\n\t\"./se\": 479,\n\t\"./se.js\": 479,\n\t\"./si\": 480,\n\t\"./si.js\": 480,\n\t\"./sk\": 481,\n\t\"./sk.js\": 481,\n\t\"./sl\": 482,\n\t\"./sl.js\": 482,\n\t\"./sq\": 483,\n\t\"./sq.js\": 483,\n\t\"./sr\": 484,\n\t\"./sr-cyrl\": 485,\n\t\"./sr-cyrl.js\": 485,\n\t\"./sr.js\": 484,\n\t\"./ss\": 486,\n\t\"./ss.js\": 486,\n\t\"./sv\": 487,\n\t\"./sv.js\": 487,\n\t\"./sw\": 488,\n\t\"./sw.js\": 488,\n\t\"./ta\": 489,\n\t\"./ta.js\": 489,\n\t\"./te\": 490,\n\t\"./te.js\": 490,\n\t\"./tet\": 491,\n\t\"./tet.js\": 491,\n\t\"./tg\": 492,\n\t\"./tg.js\": 492,\n\t\"./th\": 493,\n\t\"./th.js\": 493,\n\t\"./tl-ph\": 494,\n\t\"./tl-ph.js\": 494,\n\t\"./tlh\": 495,\n\t\"./tlh.js\": 495,\n\t\"./tr\": 496,\n\t\"./tr.js\": 496,\n\t\"./tzl\": 497,\n\t\"./tzl.js\": 497,\n\t\"./tzm\": 498,\n\t\"./tzm-latn\": 499,\n\t\"./tzm-latn.js\": 499,\n\t\"./tzm.js\": 498,\n\t\"./ug-cn\": 500,\n\t\"./ug-cn.js\": 500,\n\t\"./uk\": 501,\n\t\"./uk.js\": 501,\n\t\"./ur\": 502,\n\t\"./ur.js\": 502,\n\t\"./uz\": 503,\n\t\"./uz-latn\": 504,\n\t\"./uz-latn.js\": 504,\n\t\"./uz.js\": 503,\n\t\"./vi\": 505,\n\t\"./vi.js\": 505,\n\t\"./x-pseudo\": 506,\n\t\"./x-pseudo.js\": 506,\n\t\"./yo\": 507,\n\t\"./yo.js\": 507,\n\t\"./zh-cn\": 508,\n\t\"./zh-cn.js\": 508,\n\t\"./zh-hk\": 509,\n\t\"./zh-hk.js\": 509,\n\t\"./zh-tw\": 510,\n\t\"./zh-tw.js\": 510\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1062;","'use strict';\n// TODO remove unused?\n(function (angular) {\n const deviseModal = angular.module('DeviseModal', [\n 'Devise',\n 'ui.bootstrap'\n ]);\n deviseModal.run([\n '$uibModal',\n '$http',\n 'Auth',\n '$rootScope',\n function ($uibModal, $http, Auth, $rootScope) {\n var promise = null;\n function reset () {\n promise = null;\n }\n function partial (fn, arg) {\n return function () {\n return fn.call(this, arg);\n };\n }\n $rootScope.$on('devise:unauthorized', function (event, response, deferred) {\n function retryRequestAfterLogin () {\n return promise.then(function () {\n return $http(response.config);\n }).then(deferred.resolve, partial(deferred.reject, response));\n }\n if (!promise) {\n promise = $uibModal.open({\n templateUrl: '/shared/deviseModal.html',\n controller: ['$scope', '$uibModalInstance', function ($scope, $uibModalInstance) {\n const user = $scope.user = {};\n $scope.login = function () {\n $uibModalInstance.close(user);\n };\n $scope.dismiss = function () {\n $uibModalInstance.dismiss('cancel');\n };\n }]\n }).result.finally(reset).then(Auth.login);\n }\n retryRequestAfterLogin();\n });\n }\n ]);\n deviseModal.run([\n '$templateCache',\n function ($templateCache) {\n 'use strict';\n $templateCache.put('deviseModal.html', '
    ');\n }\n ]);\n}(angular));\n","/**\n * A directive to embed a Disqus comments widget on your AngularJS page.\n *\n * For documentation, see the README.md file in this directory\n *\n * Created by Michael on 22/01/14.\n * Copyright Michael Bromley 2014\n * Available under the MIT license.\n */\nangular.module('angularUtils.directives.dirDisqus', [])\n\n .directive('dirDisqus', ['$window', function($window) {\n return {\n restrict: 'E',\n scope: {\n disqus_shortname: '@disqusShortname',\n disqus_identifier: '@disqusIdentifier',\n disqus_title: '@disqusTitle',\n disqus_url: '@disqusUrl',\n disqus_category_id: '@disqusCategoryId',\n disqus_disable_mobile: '@disqusDisableMobile',\n readyToBind: \"@\"\n },\n template: '
    comments powered by Disqus',\n link: function(scope) {\n\n // ensure that the disqus_identifier and disqus_url are both set, otherwise we will run in to identifier conflicts when using URLs with \"#\" in them\n // see http://help.disqus.com/customer/portal/articles/662547-why-are-the-same-comments-showing-up-on-multiple-pages-\n if (typeof scope.disqus_identifier === 'undefined' || typeof scope.disqus_url === 'undefined') {\n throw \"Please ensure that the `disqus-identifier` and `disqus-url` attributes are both set.\";\n }\n\n scope.$watch(\"readyToBind\", function(isReady) {\n\n // If the directive has been called without the 'ready-to-bind' attribute, we\n // set the default to \"true\" so that Disqus will be loaded straight away.\n if ( !angular.isDefined( isReady ) ) {\n isReady = \"true\";\n }\n if (scope.$eval(isReady)) {\n // put the config variables into separate global vars so that the Disqus script can see them\n $window.disqus_shortname = scope.disqus_shortname;\n $window.disqus_identifier = scope.disqus_identifier;\n $window.disqus_title = scope.disqus_title;\n $window.disqus_url = scope.disqus_url;\n $window.disqus_category_id = scope.disqus_category_id;\n $window.disqus_disable_mobile = scope.disqus_disable_mobile;\n\n // get the remote Disqus script and insert it into the DOM, but only if it not already loaded (as that will cause warnings)\n if (!$window.DISQUS) {\n var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n dsq.src = '//' + scope.disqus_shortname + '.disqus.com/embed.js';\n (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n } else {\n $window.DISQUS.reset({\n reload: true,\n config: function () {\n this.page.identifier = scope.disqus_identifier;\n this.page.url = scope.disqus_url;\n this.page.title = scope.disqus_title;\n }\n });\n }\n }\n });\n }\n };\n }]);","// Inspired by: https://github.com/pHAlkaline/summernote-plugins/tree/master/plugins/nugget\n\n(function (factory) {\n /* global define */\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['jquery'], factory);\n } else if (typeof module === 'object' && module.exports) {\n // Node/CommonJS\n module.exports = factory(require('jquery'));\n } else {\n // Browser globals\n factory(window.jQuery);\n }\n}(function ($) {\n\n\n $.extend($.summernote.options, {\n nugget: {\n list: []\n }\n\n });\n $.extend(true, $.summernote, {\n // add localization texts\n lang: {\n 'en-US': {\n nugget: {\n Nugget: 'Nugget',\n Insert_nugget: 'Insert Nugget'\n\n }\n },\n 'en-GB': {\n nugget: {\n Nugget: 'Nugget',\n Insert_nugget: 'Insert Nugget'\n\n }\n },\n 'pt-PT': {\n nugget: {\n Nugget: 'Pepita',\n Insert_nugget: 'Inserir pepita'\n\n }\n },\n 'it-IT': {\n nugget: {\n Nugget: 'Pepite',\n Insert_nugget: 'Pepite Inserto'\n\n }\n }\n }\n });\n // Extends plugins for adding nuggets.\n // - plugin is external module for customizing.\n $.extend($.summernote.plugins, {\n /**\n * @param {Object} context - context object has status of editor.\n */\n 'nugget': function (context) {\n // ui has renders to build ui elements.\n // - you can create a button with `ui.button`\n const ui = $.summernote.ui;\n const options = context.options.nugget;\n const context_options = context.options;\n const lang = context_options.langInfo;\n const defaultOptions = {\n label: lang.nugget.Nugget,\n tooltip: lang.nugget.Insert_nugget\n };\n\n // Assign default values if not supplied\n for (const propertyName in defaultOptions) {\n if (options.hasOwnProperty(propertyName) === false) {\n options[propertyName] = defaultOptions[propertyName];\n }\n }\n\n // add hello button\n context.memo('button.nugget', function () {\n // create button\n\n const button = ui.buttonGroup([\n ui.button({\n className: 'dropdown-toggle',\n contents: '' + options.label + ' ',\n tooltip: options.tooltip,\n data: {\n toggle: 'dropdown'\n }\n }),\n ui.dropdown({\n className: 'dropdown-nugget',\n contents: options.list.map((i) => {\n const li = document.createElement('li');\n const a = document.createElement('a');\n a.innerHTML = i.trim();\n a.setAttribute('href', '#');\n li.appendChild(a);\n return li.outerHTML;\n }),\n click: function (event) {\n event.preventDefault();\n\n const $button = $(event.target);\n const value = $button[0].outerHTML;\n const node = document.createElement('div');\n node.innerHTML = value.trim();\n context.invoke('editor.insertNode', node.firstChild);\n\n }\n })\n ]);\n\n // create jQuery object from button instance.\n return button.render();\n });\n }\n\n });\n\n}));\n","/* eslint-disable\n no-return-assign,\n no-undef,\n*/\n// TODO: This file was created by bulk-decaffeinate.\n// Fix any style issues and re-enable lint.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nangular.module('application.router', ['ui.router'])\n .config(['$stateProvider', '$urlRouterProvider', '$locationProvider', function ($stateProvider, $urlRouterProvider, $locationProvider) {\n $locationProvider.hashPrefix('!');\n $urlRouterProvider.otherwise('/');\n\n // abstract root parents states\n // these states controls the access rights to the various routes inherited from them\n $stateProvider\n .state('app', {\n abstract: true,\n views: {\n header: {\n templateUrl: '/shared/header.html.erb'\n },\n leftnav: {\n templateUrl: '/shared/leftnav.html',\n controller: 'MainNavController'\n },\n cookies: {\n templateUrl: '/shared/cookies.html',\n controller: 'CookiesController'\n },\n main: {}\n },\n resolve: {\n logoFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'logo-file' }).$promise; }],\n logoBlackFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'logo-black-file' }).$promise; }],\n sharedTranslations: ['Translations', function (Translations) { return Translations.query(['app.shared', 'app.public.common']).$promise; }],\n modulesPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['spaces_module', 'plans_module', 'invoicing_module', 'wallet_module', 'statistics_module', 'trainings_module']\" }).$promise; }]\n },\n onEnter: ['$rootScope', 'logoFile', 'logoBlackFile', 'modulesPromise', 'CSRF', function ($rootScope, logoFile, logoBlackFile, modulesPromise, CSRF) {\n // Retrieve Anti-CSRF tokens from cookies\n CSRF.setMetaTags();\n // Application logo\n $rootScope.logo = logoFile.custom_asset;\n $rootScope.logoBlack = logoBlackFile.custom_asset;\n $rootScope.modules = {\n spaces: (modulesPromise.spaces_module === 'true'),\n plans: (modulesPromise.plans_module === 'true'),\n trainings: (modulesPromise.trainings_module === 'true'),\n invoicing: (modulesPromise.invoicing_module === 'true'),\n wallet: (modulesPromise.wallet_module === 'true'),\n statistics: (modulesPromise.statistics_module === 'true')\n };\n }]\n })\n .state('app.public', {\n abstract: true,\n resolve: {\n publicTranslations: ['Translations', function (Translations) { return Translations.query(['app.public']).$promise; }]\n }\n })\n .state('app.logged', {\n abstract: true,\n data: {\n authorizedRoles: ['member', 'admin', 'manager']\n },\n resolve: {\n currentUser: ['Auth', function (Auth) { return Auth.currentUser(); }],\n loggedTranslations: ['Translations', function (Translations) { return Translations.query(['app.logged']).$promise; }]\n },\n onEnter: ['$state', '$timeout', 'currentUser', '$rootScope', function ($state, $timeout, currentUser, $rootScope) {\n $rootScope.currentUser = currentUser;\n }]\n })\n .state('app.admin', {\n abstract: true,\n data: {\n authorizedRoles: ['admin', 'manager']\n },\n resolve: {\n currentUser: ['Auth', function (Auth) { return Auth.currentUser(); }],\n adminTranslations: ['Translations', function (Translations) { return Translations.query(['app.admin']).$promise; }]\n },\n onEnter: ['$state', '$timeout', 'currentUser', '$rootScope', function ($state, $timeout, currentUser, $rootScope) {\n $rootScope.currentUser = currentUser;\n }]\n })\n\n // main pages\n .state('app.public.about', {\n url: '/about',\n views: {\n 'content@': {\n templateUrl: '/shared/about.html',\n controller: 'AboutController'\n }\n }\n })\n .state('app.public.home', {\n url: '/?reset_password_token',\n views: {\n 'main@': {\n templateUrl: '/home.html',\n controller: 'HomeController'\n }\n },\n resolve: {\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['home_content', 'home_blogpost', 'spaces_module', 'feature_tour_display']\" }).$promise; }]\n }\n })\n .state('app.public.privacy', {\n url: '/privacy-policy',\n views: {\n 'content@': {\n templateUrl: '/shared/privacy.html',\n controller: 'PrivacyController'\n }\n }\n })\n\n // profile completion (SSO import passage point)\n .state('app.logged.profileCompletion', {\n url: '/profile_completion',\n views: {\n 'main@': {\n templateUrl: '/profile/complete.html',\n controller: 'CompleteProfileController'\n }\n },\n resolve: {\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['fablab_name', 'name_genre', 'phone_required', 'address_required']\" }).$promise; }],\n activeProviderPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.active().$promise; }],\n groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],\n cguFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgu-file' }).$promise; }],\n memberPromise: ['Member', 'currentUser', function (Member, currentUser) { return Member.get({ id: currentUser.id }).$promise; }]\n }\n })\n\n // dashboard\n .state('app.logged.dashboard', {\n abstract: true,\n url: '/dashboard',\n resolve: {\n memberPromise: ['Member', 'currentUser', function (Member, currentUser) { return Member.get({ id: currentUser.id }).$promise; }],\n trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }]\n }\n })\n .state('app.logged.dashboard.profile', {\n url: '/profile',\n views: {\n 'main@': {\n templateUrl: '/dashboard/profile.html',\n controller: 'DashboardController'\n }\n }\n })\n .state('app.logged.dashboard.settings', {\n url: '/settings',\n views: {\n 'main@': {\n templateUrl: '/dashboard/settings.html',\n controller: 'EditProfileController'\n }\n },\n resolve: {\n groups: ['Group', function (Group) { return Group.query().$promise; }],\n activeProviderPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.active().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['phone_required', 'address_required']\" }).$promise; }]\n }\n })\n .state('app.logged.dashboard.projects', {\n url: '/projects',\n views: {\n 'main@': {\n templateUrl: '/dashboard/projects.html',\n controller: 'DashboardController'\n }\n }\n })\n .state('app.logged.dashboard.trainings', {\n url: '/trainings',\n views: {\n 'main@': {\n templateUrl: '/dashboard/trainings.html',\n controller: 'DashboardController'\n }\n }\n })\n .state('app.logged.dashboard.events', {\n url: '/events',\n views: {\n 'main@': {\n templateUrl: '/dashboard/events.html',\n controller: 'DashboardController'\n }\n }\n })\n .state('app.logged.dashboard.invoices', {\n url: '/invoices',\n views: {\n 'main@': {\n templateUrl: '/dashboard/invoices.html',\n controller: 'DashboardController'\n }\n }\n })\n .state('app.logged.dashboard.payment_schedules', {\n url: '/payment_schedules',\n views: {\n 'main@': {\n templateUrl: '/dashboard/payment_schedules.html',\n controller: 'DashboardController'\n }\n }\n })\n .state('app.logged.dashboard.wallet', {\n url: '/wallet',\n abstract: !Fablab.walletModule,\n views: {\n 'main@': {\n templateUrl: '/dashboard/wallet.html',\n controller: 'WalletController'\n }\n },\n resolve: {\n walletPromise: ['Wallet', 'currentUser', function (Wallet, currentUser) { return Wallet.getWalletByUser({ user_id: currentUser.id }).$promise; }],\n transactionsPromise: ['Wallet', 'walletPromise', function (Wallet, walletPromise) { return Wallet.transactions({ id: walletPromise.id }).$promise; }]\n }\n })\n\n // members\n .state('app.logged.members_show', {\n url: '/members/:id',\n views: {\n 'main@': {\n templateUrl: '/members/show.html',\n controller: 'ShowProfileController'\n }\n },\n resolve: {\n memberPromise: ['$stateParams', 'Member', function ($stateParams, Member) { return Member.get({ id: $stateParams.id }).$promise; }]\n }\n })\n .state('app.logged.members', {\n url: '/members',\n views: {\n 'main@': {\n templateUrl: '/members/index.html',\n controller: 'MembersController'\n }\n },\n resolve: {\n membersPromise: ['Member', function (Member) { return Member.query({ requested_attributes: '[profile]', page: 1, size: 10 }).$promise; }]\n }\n })\n\n // projects\n .state('app.public.projects_list', {\n url: '/projects?q&page&theme_id&component_id&machine_id&from&whole_network',\n views: {\n 'main@': {\n templateUrl: '/projects/index.html',\n controller: 'ProjectsController'\n }\n },\n resolve: {\n themesPromise: ['Theme', function (Theme) { return Theme.query().$promise; }],\n componentsPromise: ['Component', function (Component) { return Component.query().$promise; }],\n machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['openlab_app_id', 'openlab_default']\" }).$promise; }],\n openLabActive: ['Setting', function (Setting) { return Setting.isPresent({ name: 'openlab_app_secret' }).$promise; }]\n }\n })\n .state('app.logged.projects_new', {\n url: '/projects/new',\n views: {\n 'main@': {\n templateUrl: '/projects/new.html',\n controller: 'NewProjectController'\n }\n },\n resolve: {\n allowedExtensions: ['Setting', function (Setting) { return Setting.get({ name: 'allowed_cad_extensions' }).$promise; }]\n }\n })\n .state('app.public.projects_show', {\n url: '/projects/:id',\n views: {\n 'main@': {\n templateUrl: '/projects/show.html',\n controller: 'ShowProjectController'\n }\n },\n resolve: {\n projectPromise: ['$stateParams', 'Project', function ($stateParams, Project) { return Project.get({ id: $stateParams.id }).$promise; }],\n shortnamePromise: ['Setting', function (Setting) { return Setting.get({ name: 'disqus_shortname' }).$promise; }]\n }\n })\n .state('app.logged.projects_edit', {\n url: '/projects/:id/edit',\n views: {\n 'main@': {\n templateUrl: '/projects/edit.html',\n controller: 'EditProjectController'\n }\n },\n resolve: {\n projectPromise: ['$stateParams', 'Project', function ($stateParams, Project) { return Project.get({ id: $stateParams.id }).$promise; }],\n allowedExtensions: ['Setting', function (Setting) { return Setting.get({ name: 'allowed_cad_extensions' }).$promise; }]\n }\n })\n\n // machines\n .state('app.public.machines_list', {\n url: '/machines',\n views: {\n 'main@': {\n templateUrl: '/machines/index.html',\n controller: 'MachinesController'\n }\n },\n resolve: {\n machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['feature_tour_display']\" }).$promise; }]\n }\n })\n .state('app.admin.machines_new', {\n url: '/machines/new',\n views: {\n 'main@': {\n templateUrl: '/machines/new.html',\n controller: 'NewMachineController'\n }\n }\n })\n .state('app.public.machines_show', {\n url: '/machines/:id',\n views: {\n 'main@': {\n templateUrl: '/machines/show.html',\n controller: 'ShowMachineController'\n }\n },\n resolve: {\n machinePromise: ['Machine', '$stateParams', function (Machine, $stateParams) { return Machine.get({ id: $stateParams.id }).$promise; }]\n }\n })\n .state('app.logged.machines_reserve', {\n url: '/machines/:id/reserve',\n views: {\n 'main@': {\n templateUrl: '/machines/reserve.html',\n controller: 'ReserveMachineController'\n }\n },\n resolve: {\n plansPromise: ['Plan', function (Plan) { return Plan.query().$promise; }],\n groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],\n machinePromise: ['Machine', '$stateParams', function (Machine, $stateParams) { return Machine.get({ id: $stateParams.id }).$promise; }],\n settingsPromise: ['Setting', function (Setting) {\n return Setting.query({\n names: \"['machine_explications_alert', 'booking_window_start', 'booking_window_end', 'booking_move_enable', \" +\n \"'booking_move_delay', 'booking_cancel_enable', 'booking_cancel_delay', 'subscription_explications_alert', \" +\n \"'online_payment_module']\"\n }).$promise;\n }]\n }\n })\n .state('app.admin.machines_edit', {\n url: '/machines/:id/edit',\n views: {\n 'main@': {\n templateUrl: '/machines/edit.html',\n controller: 'EditMachineController'\n }\n },\n resolve: {\n machinePromise: ['Machine', '$stateParams', function (Machine, $stateParams) { return Machine.get({ id: $stateParams.id }).$promise; }]\n }\n })\n\n // spaces\n .state('app.public.spaces_list', {\n url: '/spaces',\n abstract: !Fablab.spacesModule,\n views: {\n 'main@': {\n templateUrl: '/spaces/index.html',\n controller: 'SpacesController'\n }\n },\n resolve: {\n spacesPromise: ['Space', function (Space) { return Space.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['feature_tour_display']\" }).$promise; }]\n }\n })\n .state('app.admin.space_new', {\n url: '/spaces/new',\n abstract: !Fablab.spacesModule,\n views: {\n 'main@': {\n templateUrl: '/spaces/new.html',\n controller: 'NewSpaceController'\n }\n }\n })\n .state('app.public.space_show', {\n url: '/spaces/:id',\n abstract: !Fablab.spacesModule,\n views: {\n 'main@': {\n templateUrl: '/spaces/show.html',\n controller: 'ShowSpaceController'\n }\n },\n resolve: {\n spacePromise: ['Space', '$stateParams', function (Space, $stateParams) { return Space.get({ id: $stateParams.id }).$promise; }]\n }\n })\n .state('app.admin.space_edit', {\n url: '/spaces/:id/edit',\n abstract: !Fablab.spacesModule,\n views: {\n 'main@': {\n templateUrl: '/spaces/edit.html',\n controller: 'EditSpaceController'\n }\n },\n resolve: {\n spacePromise: ['Space', '$stateParams', function (Space, $stateParams) { return Space.get({ id: $stateParams.id }).$promise; }]\n }\n })\n .state('app.logged.space_reserve', {\n url: '/spaces/:id/reserve',\n abstract: !Fablab.spacesModule,\n views: {\n 'main@': {\n templateUrl: '/spaces/reserve.html',\n controller: 'ReserveSpaceController'\n }\n },\n resolve: {\n spacePromise: ['Space', '$stateParams', function (Space, $stateParams) { return Space.get({ id: $stateParams.id }).$promise; }],\n plansPromise: ['Plan', function (Plan) { return Plan.query().$promise; }],\n groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) {\n return Setting.query({\n names: \"['booking_window_start', 'booking_window_end', 'booking_move_enable', 'booking_move_delay', \" +\n \"'booking_cancel_enable', 'booking_cancel_delay', 'subscription_explications_alert', \" +\n \"'space_explications_alert', 'online_payment_module']\"\n }).$promise;\n }]\n }\n })\n\n // trainings\n .state('app.public.trainings_list', {\n url: '/trainings',\n abstract: !Fablab.trainingsModule,\n views: {\n 'main@': {\n templateUrl: '/trainings/index.html',\n controller: 'TrainingsController'\n }\n },\n resolve: {\n trainingsPromise: ['Training', function (Training) { return Training.query({ public_page: true }).$promise; }]\n }\n })\n .state('app.public.training_show', {\n url: '/trainings/:id',\n abstract: !Fablab.trainingsModule,\n views: {\n 'main@': {\n templateUrl: '/trainings/show.html',\n controller: 'ShowTrainingController'\n }\n },\n resolve: {\n trainingPromise: ['Training', '$stateParams', function (Training, $stateParams) { return Training.get({ id: $stateParams.id }).$promise; }]\n }\n })\n .state('app.logged.trainings_reserve', {\n url: '/trainings/:id/reserve',\n abstract: !Fablab.trainingsModule,\n views: {\n 'main@': {\n templateUrl: '/trainings/reserve.html',\n controller: 'ReserveTrainingController'\n }\n },\n resolve: {\n explicationAlertPromise: ['Setting', function (Setting) { return Setting.get({ name: 'training_explications_alert' }).$promise; }],\n plansPromise: ['Plan', function (Plan) { return Plan.query().$promise; }],\n groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],\n trainingPromise: ['Training', '$stateParams', function (Training, $stateParams) {\n if ($stateParams.id !== 'all') { return Training.get({ id: $stateParams.id }).$promise; }\n }],\n settingsPromise: ['Setting', function (Setting) {\n return Setting.query({\n names: \"['booking_window_start', 'booking_window_end', 'booking_move_enable', 'booking_move_delay', \" +\n \"'booking_cancel_enable', 'booking_cancel_delay', 'subscription_explications_alert', \" +\n \"'training_explications_alert', 'training_information_message', 'online_payment_module']\"\n }).$promise;\n }]\n }\n })\n // notifications\n .state('app.logged.notifications', {\n url: '/notifications',\n views: {\n 'main@': {\n templateUrl: '/notifications/index.html',\n controller: 'NotificationsController'\n }\n }\n })\n\n // pricing\n .state('app.public.plans', {\n url: '/plans',\n abstract: !Fablab.plansModule,\n views: {\n 'main@': {\n templateUrl: '/plans/index.html',\n controller: 'PlansIndexController'\n }\n },\n resolve: {\n subscriptionExplicationsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'subscription_explications_alert' }).$promise; }],\n plansPromise: ['Plan', function (Plan) { return Plan.query().$promise; }],\n groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['online_payment_module']\" }).$promise; }]\n }\n })\n\n // events\n .state('app.public.events_list', {\n url: '/events',\n views: {\n 'main@': {\n templateUrl: '/events/index.html',\n controller: 'EventsController'\n }\n },\n resolve: {\n categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }],\n themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }],\n ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['online_payment_module']\" }).$promise; }]\n }\n })\n .state('app.public.events_show', {\n url: '/events/:id',\n views: {\n 'main@': {\n templateUrl: '/events/show.html',\n controller: 'ShowEventController'\n }\n },\n resolve: {\n eventPromise: ['Event', '$stateParams', function (Event, $stateParams) { return Event.get({ id: $stateParams.id }).$promise; }],\n priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['booking_move_enable', 'booking_move_delay', 'booking_cancel_enable', 'booking_cancel_delay', 'event_explications_alert', 'online_payment_module']\" }).$promise; }]\n }\n })\n\n // global calendar (trainings, machines and events)\n .state('app.public.calendar', {\n url: '/calendar',\n views: {\n 'main@': {\n templateUrl: '/calendar/calendar.html',\n controller: 'CalendarController'\n }\n },\n resolve: {\n bookingWindowStart: ['Setting', function (Setting) { return Setting.get({ name: 'booking_window_start' }).$promise; }],\n bookingWindowEnd: ['Setting', function (Setting) { return Setting.get({ name: 'booking_window_end' }).$promise; }],\n trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }],\n machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }],\n spacesPromise: ['Space', function (Space) { return Space.query().$promise; }],\n iCalendarPromise: ['ICalendar', function (ICalendar) { return ICalendar.query().$promise; }]\n }\n })\n\n // --- namespace /admin/... ---\n // calendar\n .state('app.admin.calendar', {\n url: '/admin/calendar',\n views: {\n 'main@': {\n templateUrl: '/admin/calendar/calendar.html',\n controller: 'AdminCalendarController'\n }\n },\n resolve: {\n bookingWindowStart: ['Setting', function (Setting) { return Setting.get({ name: 'booking_window_start' }).$promise; }],\n bookingWindowEnd: ['Setting', function (Setting) { return Setting.get({ name: 'booking_window_end' }).$promise; }],\n machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }],\n plansPromise: ['Plan', function (Plan) { return Plan.query().$promise; }],\n groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['slot_duration', 'events_in_calendar', 'feature_tour_display']\" }).$promise; }]\n }\n })\n .state('app.admin.calendar.icalendar', {\n url: '/admin/calendar/icalendar',\n views: {\n 'main@': {\n templateUrl: '/admin/calendar/icalendar.html',\n controller: 'AdminICalendarController'\n }\n },\n resolve: {\n iCalendars: ['ICalendar', function (ICalendar) { return ICalendar.query().$promise; }]\n }\n })\n\n // project's settings\n .state('app.admin.projects', {\n url: '/admin/projects',\n views: {\n 'main@': {\n templateUrl: '/admin/projects/index.html',\n controller: 'AdminProjectsController'\n }\n },\n resolve: {\n componentsPromise: ['Component', function (Component) { return Component.query().$promise; }],\n licencesPromise: ['Licence', function (Licence) { return Licence.query().$promise; }],\n themesPromise: ['Theme', function (Theme) { return Theme.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) {\n return Setting.query({\n names: \"['feature_tour_display', 'disqus_shortname', 'allowed_cad_extensions', \" +\n \"'allowed_cad_mime_types', 'openlab_app_id', 'openlab_app_secret', 'openlab_default']\"\n }).$promise;\n }]\n }\n })\n .state('app.admin.manage_abuses', {\n url: '/admin/abuses',\n views: {\n 'main@': {\n templateUrl: '/admin/abuses/index.html',\n controller: 'AbusesController'\n }\n },\n resolve: {\n abusesPromise: ['Abuse', function (Abuse) { return Abuse.query().$promise; }]\n }\n })\n\n // trainings\n .state('app.admin.trainings', {\n url: '/admin/trainings',\n abstract: !Fablab.trainingsModule,\n views: {\n 'main@': {\n templateUrl: '/admin/trainings/index.html',\n controller: 'TrainingsAdminController'\n }\n },\n resolve: {\n trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }],\n machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['feature_tour_display']\" }).$promise; }]\n }\n })\n .state('app.admin.trainings_new', {\n url: '/admin/trainings/new',\n abstract: !Fablab.trainingsModule,\n views: {\n 'main@': {\n templateUrl: '/admin/trainings/new.html',\n controller: 'NewTrainingController'\n }\n },\n resolve: {\n machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }]\n }\n })\n .state('app.admin.trainings_edit', {\n url: '/admin/trainings/:id/edit',\n abstract: !Fablab.trainingsModule,\n views: {\n 'main@': {\n templateUrl: '/admin/trainings/edit.html',\n controller: 'EditTrainingController'\n }\n },\n resolve: {\n trainingPromise: ['Training', '$stateParams', function (Training, $stateParams) { return Training.get({ id: $stateParams.id }).$promise; }],\n machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }]\n }\n })\n // events\n .state('app.admin.events', {\n url: '/admin/events',\n views: {\n 'main@': {\n templateUrl: '/admin/events/index.html',\n controller: 'AdminEventsController'\n }\n },\n resolve: {\n eventsPromise: ['Event', function (Event) { return Event.query({ page: 1 }).$promise; }],\n categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }],\n themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }],\n ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }],\n priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['feature_tour_display']\" }).$promise; }]\n }\n })\n .state('app.admin.events_new', {\n url: '/admin/events/new',\n views: {\n 'main@': {\n templateUrl: '/events/new.html',\n controller: 'NewEventController'\n }\n },\n resolve: {\n categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }],\n themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }],\n ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }],\n priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }]\n }\n })\n .state('app.admin.events_edit', {\n url: '/admin/events/:id/edit',\n views: {\n 'main@': {\n templateUrl: '/events/edit.html',\n controller: 'EditEventController'\n }\n },\n resolve: {\n eventPromise: ['Event', '$stateParams', function (Event, $stateParams) { return Event.get({ id: $stateParams.id }).$promise; }],\n categoriesPromise: ['Category', function (Category) { return Category.query().$promise; }],\n themesPromise: ['EventTheme', function (EventTheme) { return EventTheme.query().$promise; }],\n ageRangesPromise: ['AgeRange', function (AgeRange) { return AgeRange.query().$promise; }],\n priceCategoriesPromise: ['PriceCategory', function (PriceCategory) { return PriceCategory.query().$promise; }]\n }\n })\n .state('app.admin.event_reservations', {\n url: '/admin/events/:id/reservations',\n views: {\n 'main@': {\n templateUrl: '/admin/events/reservations.html',\n controller: 'ShowEventReservationsController'\n }\n },\n resolve: {\n eventPromise: ['Event', '$stateParams', function (Event, $stateParams) { return Event.get({ id: $stateParams.id }).$promise; }],\n reservationsPromise: ['Reservation', '$stateParams', function (Reservation, $stateParams) { return Reservation.query({ reservable_id: $stateParams.id, reservable_type: 'Event' }).$promise; }]\n }\n })\n\n // pricing\n .state('app.admin.pricing', {\n url: '/admin/pricing',\n views: {\n 'main@': {\n templateUrl: '/admin/pricing/index.html',\n controller: 'EditPricingController'\n }\n },\n resolve: {\n plans: ['Plan', function (Plan) { return Plan.query().$promise; }],\n groups: ['Group', function (Group) { return Group.query().$promise; }],\n machinesPricesPromise: ['Price', function (Price) { return Price.query({ priceable_type: 'Machine', plan_id: 'null' }).$promise; }],\n trainingsPricingsPromise: ['TrainingsPricing', function (TrainingsPricing) { return TrainingsPricing.query().$promise; }],\n trainingsPromise: ['Training', function (Training) { return Training.query().$promise; }],\n machineCreditsPromise: ['Credit', function (Credit) { return Credit.query({ creditable_type: 'Machine' }).$promise; }],\n machinesPromise: ['Machine', function (Machine) { return Machine.query().$promise; }],\n trainingCreditsPromise: ['Credit', function (Credit) { return Credit.query({ creditable_type: 'Training' }).$promise; }],\n couponsPromise: ['Coupon', function (Coupon) { return Coupon.query({ page: 1, filter: 'all' }).$promise; }],\n spacesPromise: ['Space', function (Space) { return Space.query().$promise; }],\n spacesPricesPromise: ['Price', function (Price) { return Price.query({ priceable_type: 'Space', plan_id: 'null' }).$promise; }],\n spacesCreditsPromise: ['Credit', function (Credit) { return Credit.query({ creditable_type: 'Space' }).$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['feature_tour_display', 'slot_duration']\" }).$promise; }]\n }\n })\n\n // plans\n .state('app.admin.plans', {\n abstract: true,\n resolve: {\n prices: ['Pricing', function (Pricing) { return Pricing.query().$promise; }],\n groups: ['Group', function (Group) { return Group.query().$promise; }],\n partners: ['User', function (User) { return User.query({ role: 'partner' }).$promise; }]\n }\n })\n .state('app.admin.plans.new', {\n url: '/admin/plans/new',\n views: {\n 'main@': {\n templateUrl: '/admin/plans/new.html',\n controller: 'NewPlanController'\n }\n }\n })\n .state('app.admin.plans.edit', {\n url: '/admin/plans/:id/edit',\n views: {\n 'main@': {\n templateUrl: '/admin/plans/edit.html',\n controller: 'EditPlanController'\n }\n },\n resolve: {\n spaces: ['Space', function (Space) { return Space.query().$promise; }],\n machines: ['Machine', function (Machine) { return Machine.query().$promise; }],\n plans: ['Plan', function (Plan) { return Plan.query().$promise; }],\n planPromise: ['Plan', '$stateParams', function (Plan, $stateParams) { return Plan.get({ id: $stateParams.id }).$promise; }]\n }\n })\n\n // coupons\n .state('app.admin.coupons_new', {\n url: '/admin/coupons/new',\n views: {\n 'main@': {\n templateUrl: '/admin/coupons/new.html',\n controller: 'NewCouponController'\n }\n }\n })\n .state('app.admin.coupons_edit', {\n url: '/admin/coupons/:id/edit',\n views: {\n 'main@': {\n templateUrl: '/admin/coupons/edit.html',\n controller: 'EditCouponController'\n }\n },\n resolve: {\n couponPromise: ['Coupon', '$stateParams', function (Coupon, $stateParams) { return Coupon.get({ id: $stateParams.id }).$promise; }]\n }\n })\n\n // invoices\n .state('app.admin.invoices', {\n url: '/admin/invoices',\n views: {\n 'main@': {\n templateUrl: '/admin/invoices/index.html',\n controller: 'InvoicesController'\n }\n },\n resolve: {\n settings: ['Setting', function (Setting) {\n return Setting.query({\n names: \"['invoice_legals', 'invoice_text', 'invoice_VAT-rate', 'invoice_VAT-active', 'invoice_order-nb', 'invoice_code-value', \" +\n \"'invoice_code-active', 'invoice_reference', 'invoice_logo', 'accounting_journal_code', 'accounting_card_client_code', \" +\n \"'accounting_card_client_label', 'accounting_wallet_client_code', 'accounting_wallet_client_label', 'invoicing_module', \" +\n \"'accounting_other_client_code', 'accounting_other_client_label', 'accounting_wallet_code', 'accounting_wallet_label', \" +\n \"'accounting_VAT_code', 'accounting_VAT_label', 'accounting_subscription_code', 'accounting_subscription_label', \" +\n \"'accounting_Machine_code', 'accounting_Machine_label', 'accounting_Training_code', 'accounting_Training_label', \" +\n \"'accounting_Event_code', 'accounting_Event_label', 'accounting_Space_code', 'accounting_Space_label', \" +\n \"'feature_tour_display', 'online_payment_module', 'stripe_public_key', 'stripe_currency', 'invoice_prefix']\"\n }).$promise;\n }],\n stripeSecretKey: ['Setting', function (Setting) { return Setting.isPresent({ name: 'stripe_secret_key' }).$promise; }],\n onlinePaymentStatus: ['Payment', function (Payment) { return Payment.onlinePaymentStatus().$promise; }],\n invoices: ['Invoice', function (Invoice) {\n return Invoice.list({\n query: { number: '', customer: '', date: null, order_by: '-reference', page: 1, size: 20 }\n }).$promise;\n }],\n closedPeriods: ['AccountingPeriod', function (AccountingPeriod) { return AccountingPeriod.query().$promise; }]\n }\n })\n\n // members\n .state('app.admin.members', {\n url: '/admin/members',\n views: {\n 'main@': {\n templateUrl: '/admin/members/index.html',\n controller: 'AdminMembersController'\n },\n 'groups@app.admin.members': {\n templateUrl: '/admin/groups/index.html',\n controller: 'GroupsController'\n },\n 'tags@app.admin.members': {\n templateUrl: '/admin/tags/index.html',\n controller: 'TagsController'\n },\n 'authentification@app.admin.members': {\n templateUrl: '/admin/authentications/index.html',\n controller: 'AuthentificationController'\n }\n },\n resolve: {\n membersPromise: ['Member', function (Member) { return Member.list({ query: { search: '', order_by: 'id', page: 1, size: 20 } }).$promise; }],\n adminsPromise: ['Admin', function (Admin) { return Admin.query().$promise; }],\n partnersPromise: ['User', function (User) { return User.query({ role: 'partner' }).$promise; }],\n managersPromise: ['User', function (User) { return User.query({ role: 'manager' }).$promise; }],\n groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],\n tagsPromise: ['Tag', function (Tag) { return Tag.query().$promise; }],\n authProvidersPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['feature_tour_display']\" }).$promise; }]\n }\n })\n .state('app.admin.members_new', {\n url: '/admin/members/new',\n views: {\n 'main@': {\n templateUrl: '/admin/members/new.html',\n controller: 'NewMemberController'\n }\n },\n resolve: {\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['phone_required', 'address_required']\" }).$promise; }]\n }\n })\n .state('app.admin.members_import', {\n url: '/admin/members/import',\n views: {\n 'main@': {\n templateUrl: '/admin/members/import.html',\n controller: 'ImportMembersController'\n }\n },\n resolve: {\n tags: ['Tag', function (Tag) { return Tag.query().$promise; }]\n }\n })\n .state('app.admin.members_import_result', {\n url: '/admin/members/import/:id/results',\n views: {\n 'main@': {\n templateUrl: '/admin/members/import_result.html',\n controller: 'ImportMembersResultController'\n }\n },\n resolve: {\n importItem: ['Import', '$stateParams', function (Import, $stateParams) { return Import.get({ id: $stateParams.id }).$promise; }]\n }\n })\n .state('app.admin.members_edit', {\n url: '/admin/members/:id/edit',\n views: {\n 'main@': {\n templateUrl: '/admin/members/edit.html',\n controller: 'EditMemberController'\n }\n },\n resolve: {\n memberPromise: ['Member', '$stateParams', function (Member, $stateParams) { return Member.get({ id: $stateParams.id }).$promise; }],\n activeProviderPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.active().$promise; }],\n walletPromise: ['Wallet', '$stateParams', function (Wallet, $stateParams) { return Wallet.getWalletByUser({ user_id: $stateParams.id }).$promise; }],\n transactionsPromise: ['Wallet', 'walletPromise', function (Wallet, walletPromise) { return Wallet.transactions({ id: walletPromise.id }).$promise; }],\n tagsPromise: ['Tag', function (Tag) { return Tag.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['phone_required', 'address_required']\" }).$promise; }]\n }\n })\n .state('app.admin.admins_new', {\n url: '/admin/admins/new',\n views: {\n 'main@': {\n templateUrl: '/admin/admins/new.html',\n controller: 'NewAdminController'\n }\n },\n resolve: {\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['phone_required', 'address_required']\" }).$promise; }]\n }\n })\n .state('app.admin.managers_new', {\n url: '/admin/managers/new',\n views: {\n 'main@': {\n templateUrl: '/admin/managers/new.html',\n controller: 'NewManagerController'\n }\n },\n resolve: {\n groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],\n tagsPromise: ['Tag', function (Tag) { return Tag.query().$promise; }]\n }\n })\n\n // authentication providers\n .state('app.admin.authentication_new', {\n url: '/admin/authentications/new',\n views: {\n 'main@': {\n templateUrl: '/admin/authentications/new.html',\n controller: 'NewAuthenticationController'\n }\n },\n resolve: {\n mappingFieldsPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.mapping_fields().$promise; }],\n authProvidersPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.query().$promise; }]\n }\n })\n .state('app.admin.authentication_edit', {\n url: '/admin/authentications/:id/edit',\n views: {\n 'main@': {\n templateUrl: '/admin/authentications/edit.html',\n controller: 'EditAuthenticationController'\n }\n },\n resolve: {\n providerPromise: ['AuthProvider', '$stateParams', function (AuthProvider, $stateParams) { return AuthProvider.get({ id: $stateParams.id }).$promise; }],\n mappingFieldsPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.mapping_fields().$promise; }]\n }\n })\n\n // statistics\n .state('app.admin.statistics', {\n url: '/admin/statistics',\n abstract: !Fablab.statisticsModule,\n views: {\n 'main@': {\n templateUrl: '/admin/statistics/index.html',\n controller: 'StatisticsController'\n }\n },\n resolve: {\n membersPromise: ['Member', function (Member) { return Member.mapping().$promise; }],\n statisticsPromise: ['Statistics', function (Statistics) { return Statistics.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['feature_tour_display']\" }).$promise; }]\n }\n })\n .state('app.admin.stats_graphs', {\n url: '/admin/statistics/evolution',\n abstract: !Fablab.statisticsModule,\n views: {\n 'main@': {\n templateUrl: '/admin/statistics/graphs.html',\n controller: 'GraphsController'\n }\n }\n })\n\n // configurations\n .state('app.admin.settings', {\n url: '/admin/settings',\n views: {\n 'main@': {\n templateUrl: '/admin/settings/index.html',\n controller: 'SettingsController'\n }\n },\n resolve: {\n settingsPromise: ['Setting', function (Setting) {\n return Setting.query({\n names: \"['twitter_name', 'about_title', 'about_body', 'tracking_id', 'facebook_app_id', 'email_from', \" +\n \"'privacy_body', 'privacy_dpo', 'about_contacts', 'book_overlapping_slots', 'invoicing_module', \" +\n \"'home_blogpost', 'machine_explications_alert', 'training_explications_alert', 'slot_duration', \" +\n \"'training_information_message', 'subscription_explications_alert', 'event_explications_alert', \" +\n \"'space_explications_alert', 'booking_window_start', 'booking_window_end', 'events_in_calendar', \" +\n \"'booking_move_enable', 'booking_move_delay', 'booking_cancel_enable', 'feature_tour_display', \" +\n \"'booking_cancel_delay', 'main_color', 'secondary_color', 'spaces_module', 'twitter_analytics', \" +\n \"'fablab_name', 'name_genre', 'reminder_enable', 'plans_module', 'confirmation_required', \" +\n \"'reminder_delay', 'visibility_yearly', 'visibility_others', 'wallet_module', 'trainings_module', \" +\n \"'display_name_enable', 'machines_sort_by', 'fab_analytics', 'statistics_module', 'address_required', \" +\n \"'link_name', 'home_content', 'home_css', 'phone_required', 'upcoming_events_shown']\"\n }).$promise;\n }],\n privacyDraftsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'privacy_draft', history: true }).$promise; }],\n cguFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgu-file' }).$promise; }],\n cgvFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgv-file' }).$promise; }],\n faviconFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'favicon-file' }).$promise; }],\n profileImageFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'profile-image-file' }).$promise; }]\n }\n })\n\n // OpenAPI Clients\n .state('app.admin.open_api_clients', {\n url: '/open_api_clients',\n views: {\n 'main@': {\n templateUrl: '/admin/open_api_clients/index.html.erb',\n controller: 'OpenAPIClientsController'\n }\n },\n resolve: {\n clientsPromise: ['OpenAPIClient', function (OpenAPIClient) { return OpenAPIClient.query().$promise; }],\n settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: \"['feature_tour_display']\" }).$promise; }]\n }\n });\n }\n\n ]);\n","var map = {\n\t\"./angular/switch\": 518,\n\t\"./angular/switch.ts\": 518,\n\t\"./document-filters\": 151,\n\t\"./document-filters.tsx\": 151,\n\t\"./fab-button\": 30,\n\t\"./fab-button.tsx\": 30,\n\t\"./fab-modal\": 41,\n\t\"./fab-modal.tsx\": 41,\n\t\"./html-translate\": 152,\n\t\"./html-translate.tsx\": 152,\n\t\"./labelled-input\": 79,\n\t\"./labelled-input.tsx\": 79,\n\t\"./loader\": 20,\n\t\"./loader.tsx\": 20,\n\t\"./payment-schedule-summary\": 552,\n\t\"./payment-schedule-summary.tsx\": 552,\n\t\"./payment-schedules-dashboard\": 554,\n\t\"./payment-schedules-dashboard.tsx\": 554,\n\t\"./payment-schedules-list\": 555,\n\t\"./payment-schedules-list.tsx\": 555,\n\t\"./payment-schedules-table\": 78,\n\t\"./payment-schedules-table.tsx\": 78,\n\t\"./plan-card\": 556,\n\t\"./plan-card.tsx\": 556,\n\t\"./select-schedule\": 557,\n\t\"./select-schedule.tsx\": 557,\n\t\"./stripe-card-update\": 154,\n\t\"./stripe-card-update.tsx\": 154,\n\t\"./stripe-confirm\": 153,\n\t\"./stripe-confirm.tsx\": 153,\n\t\"./stripe-elements\": 77,\n\t\"./stripe-elements.tsx\": 77,\n\t\"./stripe-form\": 155,\n\t\"./stripe-form.tsx\": 155,\n\t\"./stripe-modal\": 558,\n\t\"./stripe-modal.tsx\": 558,\n\t\"./wallet-info\": 156,\n\t\"./wallet-info.tsx\": 156\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1145;","var map = {\n\t\"./about\": 559,\n\t\"./about.js\": 559,\n\t\"./admin/abuses\": 560,\n\t\"./admin/abuses.js\": 560,\n\t\"./admin/authentications\": 561,\n\t\"./admin/authentications.js\": 561,\n\t\"./admin/calendar\": 562,\n\t\"./admin/calendar.js\": 562,\n\t\"./admin/coupons\": 563,\n\t\"./admin/coupons.js\": 563,\n\t\"./admin/events\": 564,\n\t\"./admin/events.js\": 564,\n\t\"./admin/graphs\": 565,\n\t\"./admin/graphs.js\": 565,\n\t\"./admin/groups\": 566,\n\t\"./admin/groups.js\": 566,\n\t\"./admin/invoices\": 567,\n\t\"./admin/invoices.js\": 567,\n\t\"./admin/members\": 568,\n\t\"./admin/members.js\": 568,\n\t\"./admin/open_api_clients\": 569,\n\t\"./admin/open_api_clients.js\": 569,\n\t\"./admin/plans\": 570,\n\t\"./admin/plans.js\": 570,\n\t\"./admin/price_category\": 571,\n\t\"./admin/price_category.js\": 571,\n\t\"./admin/pricing\": 572,\n\t\"./admin/pricing.js\": 572,\n\t\"./admin/projects\": 573,\n\t\"./admin/projects.js\": 573,\n\t\"./admin/settings\": 574,\n\t\"./admin/settings.js\": 574,\n\t\"./admin/statistics\": 575,\n\t\"./admin/statistics.js\": 575,\n\t\"./admin/tags\": 576,\n\t\"./admin/tags.js\": 576,\n\t\"./admin/trainings\": 577,\n\t\"./admin/trainings.js\": 577,\n\t\"./application.js\": 578,\n\t\"./application.js.erb\": 578,\n\t\"./calendar\": 579,\n\t\"./calendar.js\": 579,\n\t\"./cookies\": 580,\n\t\"./cookies.js\": 580,\n\t\"./dashboard\": 581,\n\t\"./dashboard.js\": 581,\n\t\"./events.js\": 582,\n\t\"./events.js.erb\": 582,\n\t\"./home\": 583,\n\t\"./home.js\": 583,\n\t\"./machines.js\": 584,\n\t\"./machines.js.erb\": 584,\n\t\"./main_nav\": 585,\n\t\"./main_nav.js\": 585,\n\t\"./members\": 586,\n\t\"./members.js\": 586,\n\t\"./notifications\": 587,\n\t\"./notifications.js\": 587,\n\t\"./plans\": 588,\n\t\"./plans.js\": 588,\n\t\"./privacy\": 589,\n\t\"./privacy.js\": 589,\n\t\"./profile\": 590,\n\t\"./profile.js\": 590,\n\t\"./projects\": 591,\n\t\"./projects.js\": 591,\n\t\"./spaces.js\": 592,\n\t\"./spaces.js.erb\": 592,\n\t\"./trainings.js\": 593,\n\t\"./trainings.js.erb\": 593,\n\t\"./wallet\": 594,\n\t\"./wallet.js\": 594\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1291;","var map = {\n\t\"./_t\": 595,\n\t\"./_t.js\": 595,\n\t\"./abuse\": 596,\n\t\"./abuse.js\": 596,\n\t\"./accounting_period\": 597,\n\t\"./accounting_period.js\": 597,\n\t\"./admin\": 598,\n\t\"./admin.js\": 598,\n\t\"./age_range\": 599,\n\t\"./age_range.js\": 599,\n\t\"./auth\": 600,\n\t\"./auth.js\": 600,\n\t\"./authProvider\": 601,\n\t\"./authProvider.js\": 601,\n\t\"./availability\": 602,\n\t\"./availability.js\": 602,\n\t\"./calendar\": 603,\n\t\"./calendar.js\": 603,\n\t\"./category\": 604,\n\t\"./category.js\": 604,\n\t\"./component\": 605,\n\t\"./component.js\": 605,\n\t\"./coupon\": 606,\n\t\"./coupon.js\": 606,\n\t\"./credit\": 607,\n\t\"./credit.js\": 607,\n\t\"./csrf\": 608,\n\t\"./csrf.js\": 608,\n\t\"./customAsset\": 609,\n\t\"./customAsset.js\": 609,\n\t\"./diacritics\": 610,\n\t\"./diacritics.js\": 610,\n\t\"./dialogs\": 611,\n\t\"./dialogs.js\": 611,\n\t\"./elastic\": 612,\n\t\"./elastic.js\": 612,\n\t\"./event\": 613,\n\t\"./event.js\": 613,\n\t\"./event_theme\": 614,\n\t\"./event_theme.js\": 614,\n\t\"./export\": 615,\n\t\"./export.js\": 615,\n\t\"./fab_analytics\": 616,\n\t\"./fab_analytics.js\": 616,\n\t\"./group\": 617,\n\t\"./group.js\": 617,\n\t\"./help\": 618,\n\t\"./help.js\": 618,\n\t\"./helpers\": 619,\n\t\"./helpers.js\": 619,\n\t\"./ical\": 620,\n\t\"./ical.js\": 620,\n\t\"./icalendar\": 621,\n\t\"./icalendar.js\": 621,\n\t\"./import\": 622,\n\t\"./import.js\": 622,\n\t\"./invoice\": 623,\n\t\"./invoice.js\": 623,\n\t\"./licence\": 624,\n\t\"./licence.js\": 624,\n\t\"./machine\": 625,\n\t\"./machine.js\": 625,\n\t\"./member\": 626,\n\t\"./member.js\": 626,\n\t\"./notification\": 627,\n\t\"./notification.js\": 627,\n\t\"./open_api_client\": 628,\n\t\"./open_api_client.js\": 628,\n\t\"./openlab_project\": 629,\n\t\"./openlab_project.js\": 629,\n\t\"./pagination_service\": 630,\n\t\"./pagination_service.js\": 630,\n\t\"./payment\": 631,\n\t\"./payment.js\": 631,\n\t\"./plan\": 632,\n\t\"./plan.js\": 632,\n\t\"./price\": 633,\n\t\"./price.js\": 633,\n\t\"./price_category\": 634,\n\t\"./price_category.js\": 634,\n\t\"./pricing\": 635,\n\t\"./pricing.js\": 635,\n\t\"./project\": 636,\n\t\"./project.js\": 636,\n\t\"./reservation\": 637,\n\t\"./reservation.js\": 637,\n\t\"./session\": 638,\n\t\"./session.js\": 638,\n\t\"./setting\": 639,\n\t\"./setting.js\": 639,\n\t\"./slot\": 640,\n\t\"./slot.js\": 640,\n\t\"./socialNetworks\": 641,\n\t\"./socialNetworks.js\": 641,\n\t\"./space\": 642,\n\t\"./space.js\": 642,\n\t\"./statistics\": 643,\n\t\"./statistics.js\": 643,\n\t\"./subscription\": 644,\n\t\"./subscription.js\": 644,\n\t\"./tag\": 645,\n\t\"./tag.js\": 645,\n\t\"./theme\": 646,\n\t\"./theme.js\": 646,\n\t\"./training\": 647,\n\t\"./training.js\": 647,\n\t\"./trainings_pricing\": 648,\n\t\"./trainings_pricing.js\": 648,\n\t\"./translations\": 649,\n\t\"./translations.js\": 649,\n\t\"./user\": 650,\n\t\"./user.js\": 650,\n\t\"./version\": 651,\n\t\"./version.js\": 651,\n\t\"./wallet\": 652,\n\t\"./wallet.js\": 652\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1292;","var map = {\n\t\"./bs-jasny-fileinput\": 653,\n\t\"./bs-jasny-fileinput.js\": 653,\n\t\"./cart\": 654,\n\t\"./cart.js\": 654,\n\t\"./compile\": 655,\n\t\"./compile.js\": 655,\n\t\"./confirmation_needed\": 656,\n\t\"./confirmation_needed.js\": 656,\n\t\"./coupon\": 657,\n\t\"./coupon.js\": 657,\n\t\"./directives\": 658,\n\t\"./directives.js\": 658,\n\t\"./fab_user_avatar\": 659,\n\t\"./fab_user_avatar.js\": 659,\n\t\"./home/events\": 660,\n\t\"./home/events.js\": 660,\n\t\"./home/news\": 661,\n\t\"./home/news.js\": 661,\n\t\"./home/projects\": 662,\n\t\"./home/projects.js\": 662,\n\t\"./home/twitter\": 663,\n\t\"./home/twitter.js\": 663,\n\t\"./members\": 664,\n\t\"./members.js\": 664,\n\t\"./post_render\": 665,\n\t\"./post_render.js\": 665,\n\t\"./selectMember\": 666,\n\t\"./selectMember.js\": 666,\n\t\"./settings/boolean-setting\": 667,\n\t\"./settings/boolean-setting.js\": 667,\n\t\"./settings/number-setting\": 668,\n\t\"./settings/number-setting.js\": 668,\n\t\"./settings/select-multiple-setting\": 669,\n\t\"./settings/select-multiple-setting.js\": 669,\n\t\"./settings/select-setting\": 670,\n\t\"./settings/select-setting.js\": 670,\n\t\"./settings/text-setting\": 671,\n\t\"./settings/text-setting.js\": 671,\n\t\"./socialLink\": 672,\n\t\"./socialLink.js\": 672,\n\t\"./stripe-form\": 673,\n\t\"./stripe-form.js\": 673,\n\t\"./validators\": 674,\n\t\"./validators.js\": 674\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1293;","var map = {\n\t\"./filters\": 675,\n\t\"./filters.js\": 675\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1294;","var map = {\n\t\"./import-png.d\": 676,\n\t\"./import-png.d.ts\": 676\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1295;","var map = {\n\t\"./arrow-left\": 129,\n\t\"./arrow-left.png\": 129,\n\t\"./fabmanager-logo\": 677,\n\t\"./fabmanager-logo.png\": 677,\n\t\"./mastercard\": 70,\n\t\"./mastercard.png\": 70,\n\t\"./no_avatar\": 130,\n\t\"./no_avatar.png\": 130,\n\t\"./powered_by_stripe\": 69,\n\t\"./powered_by_stripe.png\": 69,\n\t\"./social/dailymotion\": 213,\n\t\"./social/dailymotion.png\": 213,\n\t\"./social/echosciences\": 214,\n\t\"./social/echosciences.png\": 214,\n\t\"./visa\": 71,\n\t\"./visa.png\": 71\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1296;","var map = {\n\t\"./admin/abuses\": 131,\n\t\"./admin/abuses/\": 131,\n\t\"./admin/abuses/index\": 131,\n\t\"./admin/abuses/index.html\": 131,\n\t\"./admin/admins/new\": 678,\n\t\"./admin/admins/new.html\": 678,\n\t\"./admin/authentications\": 132,\n\t\"./admin/authentications/\": 132,\n\t\"./admin/authentications/_data_mapping\": 679,\n\t\"./admin/authentications/_data_mapping.html\": 679,\n\t\"./admin/authentications/_form\": 680,\n\t\"./admin/authentications/_form.html\": 680,\n\t\"./admin/authentications/_oauth2\": 681,\n\t\"./admin/authentications/_oauth2.html\": 681,\n\t\"./admin/authentications/_oauth2_mapping\": 682,\n\t\"./admin/authentications/_oauth2_mapping.html\": 682,\n\t\"./admin/authentications/edit\": 683,\n\t\"./admin/authentications/edit.html\": 683,\n\t\"./admin/authentications/index\": 132,\n\t\"./admin/authentications/index.html\": 132,\n\t\"./admin/authentications/new\": 684,\n\t\"./admin/authentications/new.html\": 684,\n\t\"./admin/calendar/calendar\": 685,\n\t\"./admin/calendar/calendar.html\": 685,\n\t\"./admin/calendar/deleteRecurrent\": 686,\n\t\"./admin/calendar/deleteRecurrent.html\": 686,\n\t\"./admin/calendar/eventModal\": 687,\n\t\"./admin/calendar/eventModal.html\": 687,\n\t\"./admin/calendar/icalendar\": 688,\n\t\"./admin/calendar/icalendar.html\": 688,\n\t\"./admin/coupons/_form\": 689,\n\t\"./admin/coupons/_form.html\": 689,\n\t\"./admin/coupons/edit\": 690,\n\t\"./admin/coupons/edit.html\": 690,\n\t\"./admin/coupons/new\": 691,\n\t\"./admin/coupons/new.html\": 691,\n\t\"./admin/events\": 133,\n\t\"./admin/events/\": 133,\n\t\"./admin/events/filters\": 692,\n\t\"./admin/events/filters.html\": 692,\n\t\"./admin/events/index\": 133,\n\t\"./admin/events/index.html\": 133,\n\t\"./admin/events/monitoring\": 693,\n\t\"./admin/events/monitoring.html\": 693,\n\t\"./admin/events/price_form\": 694,\n\t\"./admin/events/price_form.html\": 694,\n\t\"./admin/events/prices\": 695,\n\t\"./admin/events/prices.html\": 695,\n\t\"./admin/events/reservations\": 696,\n\t\"./admin/events/reservations.html\": 696,\n\t\"./admin/groups\": 134,\n\t\"./admin/groups/\": 134,\n\t\"./admin/groups/index\": 134,\n\t\"./admin/groups/index.html\": 134,\n\t\"./admin/invoices\": 135,\n\t\"./admin/invoices/\": 135,\n\t\"./admin/invoices/_period\": 697,\n\t\"./admin/invoices/_period.html\": 697,\n\t\"./admin/invoices/accountingExportModal\": 698,\n\t\"./admin/invoices/accountingExportModal.html\": 698,\n\t\"./admin/invoices/avoirModal\": 699,\n\t\"./admin/invoices/avoirModal.html\": 699,\n\t\"./admin/invoices/closePeriodModal\": 700,\n\t\"./admin/invoices/closePeriodModal.html\": 700,\n\t\"./admin/invoices/codes\": 701,\n\t\"./admin/invoices/codes.html\": 701,\n\t\"./admin/invoices/index\": 135,\n\t\"./admin/invoices/index.html\": 135,\n\t\"./admin/invoices/list\": 702,\n\t\"./admin/invoices/list.html\": 702,\n\t\"./admin/invoices/payment\": 703,\n\t\"./admin/invoices/payment.html\": 703,\n\t\"./admin/invoices/settings\": 704,\n\t\"./admin/invoices/settings.html\": 704,\n\t\"./admin/invoices/settings/editCode\": 705,\n\t\"./admin/invoices/settings/editCode.html\": 705,\n\t\"./admin/invoices/settings/editNumber\": 706,\n\t\"./admin/invoices/settings/editNumber.html\": 706,\n\t\"./admin/invoices/settings/editPrefix\": 707,\n\t\"./admin/invoices/settings/editPrefix.html\": 707,\n\t\"./admin/invoices/settings/editReference\": 708,\n\t\"./admin/invoices/settings/editReference.html\": 708,\n\t\"./admin/invoices/settings/editVAT\": 709,\n\t\"./admin/invoices/settings/editVAT.html\": 709,\n\t\"./admin/invoices/settings/stripeKeys\": 710,\n\t\"./admin/invoices/settings/stripeKeys.html\": 710,\n\t\"./admin/managers/new\": 711,\n\t\"./admin/managers/new.html\": 711,\n\t\"./admin/members\": 136,\n\t\"./admin/members/\": 136,\n\t\"./admin/members/_form\": 712,\n\t\"./admin/members/_form.html\": 712,\n\t\"./admin/members/administrators\": 713,\n\t\"./admin/members/administrators.html\": 713,\n\t\"./admin/members/change_role_modal\": 714,\n\t\"./admin/members/change_role_modal.html\": 714,\n\t\"./admin/members/edit\": 715,\n\t\"./admin/members/edit.html\": 715,\n\t\"./admin/members/import\": 716,\n\t\"./admin/members/import.html\": 716,\n\t\"./admin/members/import_result\": 717,\n\t\"./admin/members/import_result.html\": 717,\n\t\"./admin/members/index\": 136,\n\t\"./admin/members/index.html\": 136,\n\t\"./admin/members/managers\": 718,\n\t\"./admin/members/managers.html\": 718,\n\t\"./admin/members/members\": 719,\n\t\"./admin/members/members.html\": 719,\n\t\"./admin/members/new\": 720,\n\t\"./admin/members/new.html\": 720,\n\t\"./admin/members/partners\": 721,\n\t\"./admin/members/partners.html\": 721,\n\t\"./admin/members/users\": 722,\n\t\"./admin/members/users.html\": 722,\n\t\"./admin/open_api_clients/index.html\": 723,\n\t\"./admin/open_api_clients/index.html.erb\": 723,\n\t\"./admin/plans/_form\": 724,\n\t\"./admin/plans/_form.html\": 724,\n\t\"./admin/plans/edit\": 725,\n\t\"./admin/plans/edit.html\": 725,\n\t\"./admin/plans/new\": 726,\n\t\"./admin/plans/new.html\": 726,\n\t\"./admin/pricing\": 137,\n\t\"./admin/pricing/\": 137,\n\t\"./admin/pricing/coupons\": 727,\n\t\"./admin/pricing/coupons.html\": 727,\n\t\"./admin/pricing/credits\": 728,\n\t\"./admin/pricing/credits.html\": 728,\n\t\"./admin/pricing/index\": 137,\n\t\"./admin/pricing/index.html\": 137,\n\t\"./admin/pricing/machine_hours\": 729,\n\t\"./admin/pricing/machine_hours.html\": 729,\n\t\"./admin/pricing/sendCoupon\": 730,\n\t\"./admin/pricing/sendCoupon.html\": 730,\n\t\"./admin/pricing/spaces\": 731,\n\t\"./admin/pricing/spaces.html\": 731,\n\t\"./admin/pricing/subscriptions\": 732,\n\t\"./admin/pricing/subscriptions.html\": 732,\n\t\"./admin/pricing/trainings\": 733,\n\t\"./admin/pricing/trainings.html\": 733,\n\t\"./admin/projects\": 138,\n\t\"./admin/projects/\": 138,\n\t\"./admin/projects/index\": 138,\n\t\"./admin/projects/index.html\": 138,\n\t\"./admin/projects/licences\": 734,\n\t\"./admin/projects/licences.html\": 734,\n\t\"./admin/projects/materials\": 735,\n\t\"./admin/projects/materials.html\": 735,\n\t\"./admin/projects/settings\": 736,\n\t\"./admin/projects/settings.html\": 736,\n\t\"./admin/projects/themes\": 737,\n\t\"./admin/projects/themes.html\": 737,\n\t\"./admin/settings\": 139,\n\t\"./admin/settings/\": 139,\n\t\"./admin/settings/about\": 738,\n\t\"./admin/settings/about.html\": 738,\n\t\"./admin/settings/analyticsModal\": 739,\n\t\"./admin/settings/analyticsModal.html\": 739,\n\t\"./admin/settings/boolean\": 740,\n\t\"./admin/settings/boolean.html\": 740,\n\t\"./admin/settings/general\": 741,\n\t\"./admin/settings/general.html\": 741,\n\t\"./admin/settings/home_page\": 742,\n\t\"./admin/settings/home_page.html\": 742,\n\t\"./admin/settings/index\": 139,\n\t\"./admin/settings/index.html\": 139,\n\t\"./admin/settings/newSelectOption\": 743,\n\t\"./admin/settings/newSelectOption.html\": 743,\n\t\"./admin/settings/number\": 744,\n\t\"./admin/settings/number.html\": 744,\n\t\"./admin/settings/privacy\": 745,\n\t\"./admin/settings/privacy.html\": 745,\n\t\"./admin/settings/reservations\": 746,\n\t\"./admin/settings/reservations.html\": 746,\n\t\"./admin/settings/save_policy\": 747,\n\t\"./admin/settings/save_policy.html\": 747,\n\t\"./admin/settings/select\": 748,\n\t\"./admin/settings/select-multiple\": 749,\n\t\"./admin/settings/select-multiple.html\": 749,\n\t\"./admin/settings/select.html\": 748,\n\t\"./admin/settings/text\": 750,\n\t\"./admin/settings/text.html\": 750,\n\t\"./admin/statistics\": 140,\n\t\"./admin/statistics/\": 140,\n\t\"./admin/statistics/export\": 751,\n\t\"./admin/statistics/export.html\": 751,\n\t\"./admin/statistics/graphs\": 752,\n\t\"./admin/statistics/graphs.html\": 752,\n\t\"./admin/statistics/index\": 140,\n\t\"./admin/statistics/index.html\": 140,\n\t\"./admin/subscriptions/create_modal\": 753,\n\t\"./admin/subscriptions/create_modal.html\": 753,\n\t\"./admin/subscriptions/expired_at_modal\": 754,\n\t\"./admin/subscriptions/expired_at_modal.html\": 754,\n\t\"./admin/tags\": 141,\n\t\"./admin/tags/\": 141,\n\t\"./admin/tags/index\": 141,\n\t\"./admin/tags/index.html\": 141,\n\t\"./admin/trainings\": 142,\n\t\"./admin/trainings/\": 142,\n\t\"./admin/trainings/_form\": 755,\n\t\"./admin/trainings/_form.html\": 755,\n\t\"./admin/trainings/edit\": 756,\n\t\"./admin/trainings/edit.html\": 756,\n\t\"./admin/trainings/index\": 142,\n\t\"./admin/trainings/index.html\": 142,\n\t\"./admin/trainings/modal_edit\": 757,\n\t\"./admin/trainings/modal_edit.html\": 757,\n\t\"./admin/trainings/new\": 758,\n\t\"./admin/trainings/new.html\": 758,\n\t\"./admin/trainings/validTrainingModal\": 759,\n\t\"./admin/trainings/validTrainingModal.html\": 759,\n\t\"./admin/versions/upgradeModal\": 202,\n\t\"./admin/versions/upgradeModal.html\": 202,\n\t\"./calendar/calendar\": 760,\n\t\"./calendar/calendar.html\": 760,\n\t\"./calendar/filter\": 761,\n\t\"./calendar/filter.html\": 761,\n\t\"./calendar/filterAside\": 762,\n\t\"./calendar/filterAside.html\": 762,\n\t\"./dashboard/events\": 763,\n\t\"./dashboard/events.html\": 763,\n\t\"./dashboard/invoices\": 764,\n\t\"./dashboard/invoices.html\": 764,\n\t\"./dashboard/nav\": 765,\n\t\"./dashboard/nav.html\": 765,\n\t\"./dashboard/payment_schedules\": 766,\n\t\"./dashboard/payment_schedules.html\": 766,\n\t\"./dashboard/profile\": 767,\n\t\"./dashboard/profile.html\": 767,\n\t\"./dashboard/projects\": 768,\n\t\"./dashboard/projects.html\": 768,\n\t\"./dashboard/settings\": 769,\n\t\"./dashboard/settings.html\": 769,\n\t\"./dashboard/trainings\": 770,\n\t\"./dashboard/trainings.html\": 770,\n\t\"./dashboard/wallet\": 771,\n\t\"./dashboard/wallet.html\": 771,\n\t\"./events\": 143,\n\t\"./events/\": 143,\n\t\"./events/_form\": 772,\n\t\"./events/_form.html\": 772,\n\t\"./events/deleteRecurrent\": 206,\n\t\"./events/deleteRecurrent.html\": 206,\n\t\"./events/edit\": 773,\n\t\"./events/edit.html\": 773,\n\t\"./events/editRecurrent\": 774,\n\t\"./events/editRecurrent.html\": 774,\n\t\"./events/index\": 143,\n\t\"./events/index.html\": 143,\n\t\"./events/modify_event_reservation_modal\": 207,\n\t\"./events/modify_event_reservation_modal.html\": 207,\n\t\"./events/new\": 775,\n\t\"./events/new.html\": 775,\n\t\"./events/show\": 776,\n\t\"./events/show.html\": 776,\n\t\"./home\": 777,\n\t\"./home.html\": 777,\n\t\"./home/events\": 778,\n\t\"./home/events.html\": 778,\n\t\"./home/members\": 779,\n\t\"./home/members.html\": 779,\n\t\"./home/news\": 780,\n\t\"./home/news.html\": 780,\n\t\"./home/projects\": 781,\n\t\"./home/projects.html\": 781,\n\t\"./home/twitter\": 782,\n\t\"./home/twitter.html\": 782,\n\t\"./machines\": 144,\n\t\"./machines/\": 144,\n\t\"./machines/_form\": 783,\n\t\"./machines/_form.html\": 783,\n\t\"./machines/edit\": 784,\n\t\"./machines/edit.html\": 784,\n\t\"./machines/index\": 144,\n\t\"./machines/index.html\": 144,\n\t\"./machines/new\": 785,\n\t\"./machines/new.html\": 785,\n\t\"./machines/request_training_modal\": 212,\n\t\"./machines/request_training_modal.html\": 212,\n\t\"./machines/reserve\": 786,\n\t\"./machines/reserve.html\": 786,\n\t\"./machines/show\": 787,\n\t\"./machines/show.html\": 787,\n\t\"./machines/training_reservation_modal\": 211,\n\t\"./machines/training_reservation_modal.html\": 211,\n\t\"./members\": 145,\n\t\"./members/\": 145,\n\t\"./members/index\": 145,\n\t\"./members/index.html\": 145,\n\t\"./members/show\": 788,\n\t\"./members/show.html\": 788,\n\t\"./notifications\": 146,\n\t\"./notifications/\": 146,\n\t\"./notifications/index\": 146,\n\t\"./notifications/index.html\": 146,\n\t\"./plans\": 147,\n\t\"./plans/\": 147,\n\t\"./plans/_plan\": 789,\n\t\"./plans/_plan.html\": 789,\n\t\"./plans/index\": 147,\n\t\"./plans/index.html\": 147,\n\t\"./profile/_token\": 790,\n\t\"./profile/_token.html\": 790,\n\t\"./profile/complete\": 791,\n\t\"./profile/complete.html\": 791,\n\t\"./profile/resend_code_modal\": 792,\n\t\"./profile/resend_code_modal.html\": 792,\n\t\"./projects\": 148,\n\t\"./projects/\": 148,\n\t\"./projects/_form\": 793,\n\t\"./projects/_form.html\": 793,\n\t\"./projects/edit\": 794,\n\t\"./projects/edit.html\": 794,\n\t\"./projects/index\": 148,\n\t\"./projects/index.html\": 148,\n\t\"./projects/new\": 795,\n\t\"./projects/new.html\": 795,\n\t\"./projects/show\": 796,\n\t\"./projects/show.html\": 796,\n\t\"./shared/ConfirmationNewModal\": 205,\n\t\"./shared/ConfirmationNewModal.html\": 205,\n\t\"./shared/_admin_form\": 797,\n\t\"./shared/_admin_form.html\": 797,\n\t\"./shared/_cart\": 798,\n\t\"./shared/_cart.html\": 798,\n\t\"./shared/_coupon\": 799,\n\t\"./shared/_coupon.html\": 799,\n\t\"./shared/_manager_form\": 800,\n\t\"./shared/_manager_form.html\": 800,\n\t\"./shared/_member_form\": 801,\n\t\"./shared/_member_form.html\": 801,\n\t\"./shared/_member_select\": 802,\n\t\"./shared/_member_select.html\": 802,\n\t\"./shared/_partner_new_modal\": 803,\n\t\"./shared/_partner_new_modal.html\": 803,\n\t\"./shared/_reserve_slot_same_time\": 210,\n\t\"./shared/_reserve_slot_same_time.html\": 210,\n\t\"./shared/_reserve_slot_tags_mismatch\": 804,\n\t\"./shared/_reserve_slot_tags_mismatch.html\": 804,\n\t\"./shared/_reserve_slot_without_plan\": 805,\n\t\"./shared/_reserve_slot_without_plan.html\": 805,\n\t\"./shared/_social_link\": 806,\n\t\"./shared/_social_link.html\": 806,\n\t\"./shared/_user_avatar\": 807,\n\t\"./shared/_user_avatar.html\": 807,\n\t\"./shared/about\": 808,\n\t\"./shared/about.html\": 808,\n\t\"./shared/confirm_modal\": 809,\n\t\"./shared/confirm_modal.html\": 809,\n\t\"./shared/confirm_modify_slot_modal\": 810,\n\t\"./shared/confirm_modify_slot_modal.html\": 810,\n\t\"./shared/cookies\": 811,\n\t\"./shared/cookies.html\": 811,\n\t\"./shared/deviseModal\": 203,\n\t\"./shared/deviseModal.html\": 203,\n\t\"./shared/header.html\": 812,\n\t\"./shared/header.html.erb\": 812,\n\t\"./shared/help_modal\": 813,\n\t\"./shared/help_modal.html\": 813,\n\t\"./shared/leftnav\": 814,\n\t\"./shared/leftnav.html\": 814,\n\t\"./shared/passwordEditModal\": 201,\n\t\"./shared/passwordEditModal.html\": 201,\n\t\"./shared/passwordNewModal\": 204,\n\t\"./shared/passwordNewModal.html\": 204,\n\t\"./shared/privacy\": 815,\n\t\"./shared/privacy.html\": 815,\n\t\"./shared/publicProfile.html\": 816,\n\t\"./shared/publicProfile.html.erb\": 816,\n\t\"./shared/signalAbuseModal\": 817,\n\t\"./shared/signalAbuseModal.html\": 817,\n\t\"./shared/signupModal\": 200,\n\t\"./shared/signupModal.html\": 200,\n\t\"./shared/tour-step-template\": 818,\n\t\"./shared/tour-step-template.html\": 818,\n\t\"./shared/valid_reservation_modal\": 209,\n\t\"./shared/valid_reservation_modal.html\": 209,\n\t\"./spaces\": 149,\n\t\"./spaces/\": 149,\n\t\"./spaces/_form\": 819,\n\t\"./spaces/_form.html\": 819,\n\t\"./spaces/edit\": 820,\n\t\"./spaces/edit.html\": 820,\n\t\"./spaces/index\": 149,\n\t\"./spaces/index.html\": 149,\n\t\"./spaces/new\": 821,\n\t\"./spaces/new.html\": 821,\n\t\"./spaces/reserve\": 822,\n\t\"./spaces/reserve.html\": 822,\n\t\"./spaces/show\": 823,\n\t\"./spaces/show.html\": 823,\n\t\"./stripe/payment_modal\": 208,\n\t\"./stripe/payment_modal.html\": 208,\n\t\"./trainings\": 150,\n\t\"./trainings/\": 150,\n\t\"./trainings/index\": 150,\n\t\"./trainings/index.html\": 150,\n\t\"./trainings/reserve\": 824,\n\t\"./trainings/reserve.html\": 824,\n\t\"./trainings/show\": 825,\n\t\"./trainings/show.html\": 825,\n\t\"./wallet/credit_modal\": 826,\n\t\"./wallet/credit_modal.html\": 826,\n\t\"./wallet/show\": 827,\n\t\"./wallet/show.html\": 827,\n\t\"./wallet/transactions\": 828,\n\t\"./wallet/transactions.html\": 828\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1297;"],"sourceRoot":""}