{"version":3,"sources":["webpack:///./app/javascript/shared/utils.js","webpack:///./app/javascript/shared/activestorage/uploader.js","webpack:///./app/javascript/shared/activestorage/file-upload-error.js","webpack:///./app/javascript/shared/polyfills/insertAdjacentElement.js","webpack:///./app/javascript/shared/polyfills/dataset.js","webpack:///./app/javascript/shared/page-update-event.js","webpack:///./app/javascript/shared/activestorage/ujs.js","webpack:///./app/javascript/shared/remote-poller.js","webpack:///./app/javascript/shared/safari-11-file-xhr-workaround.js","webpack:///./app/javascript/shared/remote-input.js","webpack:///./app/javascript/shared/franceconnect.js","webpack:///./app/javascript/shared/toggle-target.js","webpack:///./app/javascript/shared/ujs-error-handling.js","webpack:///./app/javascript/new_design/chartkick.js","webpack:///./app/javascript/new_design/form-validation.js","webpack:///./app/javascript/new_design/procedure-context.js","webpack:///./app/javascript/new_design/procedure-form.js","webpack:///./app/javascript/new_design/spinner.js","webpack:///./app/javascript/new_design/dropdown.js","webpack:///./app/javascript/new_design/support.js","webpack:///./app/javascript/new_design/messagerie.js","webpack:///./app/javascript/new_design/dossiers/auto-save-controller.js","webpack:///./app/javascript/new_design/dossiers/auto-save.js","webpack:///./app/javascript/new_design/dossiers/auto-upload-controller.js","webpack:///./app/javascript/new_design/dossiers/auto-uploads-controllers.js","webpack:///./app/javascript/new_design/dossiers/auto-upload.js","webpack:///./app/javascript/new_design/champs/carte.js","webpack:///./app/javascript/new_design/champs/linked-drop-down-list.js","webpack:///./app/javascript/new_design/state-button.js","webpack:///./app/javascript/new_design/champs/repetition.js","webpack:///./app/javascript/new_design/champs/drop-down-list.js","webpack:///./app/javascript/new_design/user-sign_up.js","webpack:///./app/javascript/shared/register-react-components.jsx","webpack:///./app/javascript/packs/application.js","webpack:///./app/javascript/new_design/avis.js","webpack:///./app/javascript/new_design/fc-fusion.js","webpack:///./app/javascript/shared/activestorage/progress-bar.js"],"names":["fire","Rails","csrfToken","show","el","classList","remove","hide","add","toggle","force","undefined","enable","disabled","disable","hasClass","cssClass","contains","addClass","removeClass","delegate","eventNames","selector","callback","split","forEach","eventName","document","ajax","options","Promise","resolve","reject","Object","assign","success","response","statusText","xhr","error","Error","status","getJSON","url","data","method","fetchOptions","query","fetch","then","ok","json","scrollTo","container","scrollTop","offset","top","scrollToBottom","scrollHeight","isNumeric","n","isNaN","parseFloat","isFinite","element","rect","getBoundingClientRect","body","left","scrollLeft","timeoutable","promise","timeoutDelay","timeoutPromise","setTimeout","race","toUpperCase","headers","accept","credentials","objectToQuerystring","JSON","stringify","window","AbortController","controller","signal","abort","obj","keys","reduce","key","i","encodeURIComponent","join","Uploader","input","file","directUploadUrl","autoAttachUrl","this","directUpload","DirectUpload","progressBar","ProgressBar","id","a","start","_upload","blobSignedId","_attach","end","destroy","message","create","errorMsg","attributes","errorFromDirectUploadMessage","signed_id","attachmentRequest","type","errors","FileUploadError","ERROR_CODE_ATTACH","event","progress","loaded","total","upload","addEventListener","uploadRequestDidProgress","ERROR_CODE_READ","FAILURE_CLIENT","FAILURE_CONNECTIVITY","code","name","captureStackTrace","constructor","stack","isNetworkError","matches","match","parseInt","includes","HTMLElement","prototype","insertAdjacentElement","position","elem","node","first","_this","parent","parentNode","toLowerCase","firstChild","insertBefore","lastChild","appendChild","nextSibling","dash","dataRegEx","hasEventListener","test","createElement","DOMAttrModified","mutationSupport","getDataset","string","dataset","attribute","replace","_","letter","value","mutation","removeEventListener","detachEvent","attachEvent","setAttribute","defineProperty","Element","get","_datasetCache","call","target","addUploadEventListener","handler","detail","init","button","form","querySelector","removeAttribute","alert","preventDefault","failureReason","attachementPoller","deactivate","exportPoller","attachments","querySelectorAll","exports","attachmentPollUrl","exportPollUrl","check","RemotePoller","settings","urls","Set","timeout","checks","interval","maxChecks","isEnabled","isActive","activate","reset","clearTimeout","currentInterval","e","files","length","remote","inputChangeSelector","debounce","getAttribute","isRemote","fconnect","tracesUrl","aboutUrl","toggleElement","style","display","openFCPopin","popin","iframe","frameBorder","createFCIframe","className","currentHost","location","hostname","fconnectProfile","getElementById","linkAccess","access","logoutUrl","innerHTML","aboutLink","href","onclick","createAboutLink","historyLink","createHistoryLink","elm","createLogoutElement","createFCAccessElement","bind","eventMethod","eventer","removeChild","closeFCPopin","evt","targetSelector","toggleTarget","focus","reload","AreaChart","args","charts","PieChart","LineChart","ColumnChart","touch","updateReadMoreVisibility","descBody","isOverflowing","clientHeight","syncInputToElement","fromSelector","toSelector","fromElement","toElement","innerText","syncFormToPreview","hideSpinner","Chartkick","ChartType","clear","closest","stopPropagation","parentElement","buttonExpanded","ButtonExpand","domNode","handleFocus","keyCode","freeze","RETURN","allButtons","controlledNode","hideContent","handleKeydown","handleClick","handleBlur","formInput","b","showContent","buttons","toggleExpand","expandButtons","be","push","setAllButtons","setFormInput","ul","elementToScroll","commentaireForms","Array","from","commentaireInputs","map","persistedContentId","index","localStorage","getItem","setItem","removeItem","AutoSaveController","latestPromise","_sendAutosaveRequest","_didSucceed","_didFail","_didEnqueue","autosavePromise","_formDataForDraft","formData","formDataError","params","action","dataType","fileInputs","fileInput","FormData","AUTOSAVE_DEBOUNCE_DELAY","gon","autosave","debounce_delay","AUTOSAVE_STATUS_VISIBLE_DURATION","status_visible_duration","autoSaveController","enqueueAutosaveRequest","FORM_SELECTOR","INPUTS_SELECTOR","setState","state","offsetHeight","hideSucceededStatusAfterDelay","console","logError","AutoUploadController","uploader","_begin","_succeeded","_failed","_done","_hideErrorMessage","_messageFromError","_displayErrorMessage","toString","canRetry","title","description","retry","errorNode","textContent","errorElement","AutoUploadsControllers","inFlightUploadsCount","_incrementInFlightUploads","_decrementInFlightUploads","submitButton","disableElement","enableElement","autoUploadsControllers","startUpload","inputSelector","inputTarget","inputHandlers","Map","geoArea","properties","trim","set","primary","selectElement","option","selectedIndex","selectOptions","parse","secondaryOptions","motivationCancel","row","inputGroup","userNewEmailSelector","suggestionsSelector","emailSuggestionSelector","userEmailInput","suggestedEmailSpan","suggestion","suggest","full","CLASS_NAME_ATTR","CLASS_NAME_SELECTOR","findDOMNodes","searchSelector","separator","getSelector","components","registry","ReactComponentRegistry","ComponentClass","getConstructor","propsJson","props","cacheId","log","component","render","Loader","Loadable","loader","LazyComponent","lazy","fallback","ComboAdresseSearch","ComboAnnuaireEducationSearch","ComboCommunesSearch","ComboDepartementsSearch","ComboMultipleDropdownList","ComboPaysSearch","ComboRegionsSearch","MapEditor","MapReader","Trix","TypesDeChampEditor","mountComponents","DS","toggleCondidentielExplanation","showMotivation","showImportJustificatif","showFusion","showNewAccount","showNewAccountPasswordConfirmation","replaceSemicolonByComma","acceptEmailSuggestion","discardEmailSuggestionBox","ActiveStorage","PENDING_CLASS","ERROR_CLASS","clearErrors","html","insertAdjacentHTML","getDirectUploadElement","getDirectUploadProgressElement","width","filename"],"mappings":"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","file":"js/application-7d974f2c90c3e5e11895.chunk.js","sourcesContent":["import Rails from '@rails/ujs';\nimport debounce from 'debounce';\n\nexport { debounce };\nexport const { fire, csrfToken } = Rails;\n\nexport function show(el) {\n el && el.classList.remove('hidden');\n}\n\nexport function hide(el) {\n el && el.classList.add('hidden');\n}\n\nexport function toggle(el, force) {\n if (force == undefined) {\n el & el.classList.toggle('hidden');\n } else if (force) {\n el && el.classList.remove('hidden');\n } else {\n el && el.classList.add('hidden');\n }\n}\n\nexport function enable(el) {\n el && (el.disabled = false);\n}\n\nexport function disable(el) {\n el && (el.disabled = true);\n}\n\nexport function hasClass(el, cssClass) {\n return el && el.classList.contains(cssClass);\n}\n\nexport function addClass(el, cssClass) {\n el && el.classList.add(cssClass);\n}\n\nexport function removeClass(el, cssClass) {\n el && el.classList.remove(cssClass);\n}\n\nexport function delegate(eventNames, selector, callback) {\n eventNames\n .split(' ')\n .forEach((eventName) =>\n Rails.delegate(document, selector, eventName, callback)\n );\n}\n\n// A promise-based wrapper for Rails.ajax().\n//\n// Returns a Promise that is either:\n// - resolved in case of a 20* HTTP response code,\n// - rejected with an Error object otherwise.\n//\n// See Rails.ajax() code for more details.\nexport function ajax(options) {\n return new Promise((resolve, reject) => {\n Object.assign(options, {\n success: (response, statusText, xhr) => {\n resolve({ response, statusText, xhr });\n },\n error: (response, statusText, xhr) => {\n // NB: on HTTP/2 connections, statusText is always empty.\n let error = new Error(\n `Erreur ${xhr.status}` + (statusText ? ` : ${statusText}` : '')\n );\n Object.assign(error, { response, statusText, xhr });\n reject(error);\n }\n });\n Rails.ajax(options);\n });\n}\n\nexport function getJSON(url, data, method = 'GET') {\n const { query, ...options } = fetchOptions(data, method);\n\n return fetch(`${url}${query}`, options).then((response) => {\n if (response.ok) {\n if (response.status === 204) {\n return null;\n }\n return response.json();\n }\n const error = new Error(response.statusText || response.status);\n error.response = response;\n throw error;\n });\n}\n\nexport function scrollTo(container, scrollTo) {\n container.scrollTop =\n offset(scrollTo).top - offset(container).top + container.scrollTop;\n}\n\nexport function scrollToBottom(container) {\n container.scrollTop = container.scrollHeight;\n}\n\nexport function on(selector, eventName, fn) {\n [...document.querySelectorAll(selector)].forEach((element) =>\n element.addEventListener(eventName, (event) => fn(event, event.detail))\n );\n}\n\nexport function isNumeric(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\n\nfunction offset(element) {\n const rect = element.getBoundingClientRect();\n return {\n top: rect.top + document.body.scrollTop,\n left: rect.left + document.body.scrollLeft\n };\n}\n\n// Takes a promise, and return a promise that times out after the given delay.\nexport function timeoutable(promise, timeoutDelay) {\n let timeoutPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n reject(new Error(`Promise timed out after ${timeoutDelay}ms`));\n }, timeoutDelay);\n });\n return Promise.race([promise, timeoutPromise]);\n}\n\nconst FETCH_TIMEOUT = 30 * 1000; // 30 sec\n\nfunction fetchOptions(data, method = 'GET') {\n const options = {\n query: '',\n method: method.toUpperCase(),\n headers: {\n accept: 'application/json',\n 'x-csrf-token': csrfToken(),\n 'x-requested-with': 'XMLHttpRequest'\n },\n credentials: 'same-origin'\n };\n\n if (data) {\n if (options.method === 'GET') {\n options.query = objectToQuerystring(data);\n } else {\n options.headers['content-type'] = 'application/json';\n options.body = JSON.stringify(data);\n }\n }\n\n if (window.AbortController) {\n const controller = new AbortController();\n options.signal = controller.signal;\n\n setTimeout(() => {\n controller.abort();\n }, FETCH_TIMEOUT);\n }\n\n return options;\n}\n\nfunction objectToQuerystring(obj) {\n return Object.keys(obj).reduce(function (query, key, i) {\n return [\n query,\n i === 0 ? '?' : '&',\n encodeURIComponent(key),\n '=',\n encodeURIComponent(obj[key])\n ].join('');\n }, '');\n}\n","import { DirectUpload } from '@rails/activestorage';\nimport { ajax } from '@utils';\nimport ProgressBar from './progress-bar';\nimport FileUploadError, {\n errorFromDirectUploadMessage,\n ERROR_CODE_ATTACH\n} from './file-upload-error';\n\n/**\n Uploader class is a delegate for DirectUpload instance\n used to track lifecycle and progress of an upload.\n */\nexport default class Uploader {\n constructor(input, file, directUploadUrl, autoAttachUrl) {\n this.directUpload = new DirectUpload(file, directUploadUrl, this);\n this.progressBar = new ProgressBar(input, this.directUpload.id, file);\n this.autoAttachUrl = autoAttachUrl;\n }\n\n /**\n Upload (and optionally attach) the file.\n Returns the blob signed id on success.\n Throws a FileUploadError on failure.\n */\n async start() {\n this.progressBar.start();\n\n try {\n let blobSignedId = await this._upload();\n\n if (this.autoAttachUrl) {\n await this._attach(blobSignedId);\n // On response, the attachment HTML fragment will replace the progress bar.\n } else {\n this.progressBar.end();\n this.progressBar.destroy();\n }\n\n return blobSignedId;\n } catch (error) {\n this.progressBar.error(error.message);\n throw error;\n }\n }\n\n /**\n Upload the file using the DirectUpload instance, and return the blob signed_id.\n Throws a FileUploadError on failure.\n */\n async _upload() {\n return new Promise((resolve, reject) => {\n this.directUpload.create((errorMsg, attributes) => {\n if (errorMsg) {\n let error = errorFromDirectUploadMessage(errorMsg);\n reject(error);\n } else {\n resolve(attributes.signed_id);\n }\n });\n });\n }\n\n /**\n Attach the file by sending a POST request to the autoAttachUrl.\n Throws a FileUploadError on failure (containing the first validation\n error message, if any).\n */\n async _attach(blobSignedId) {\n const attachmentRequest = {\n url: this.autoAttachUrl,\n type: 'PUT',\n data: `blob_signed_id=${blobSignedId}`\n };\n\n try {\n await ajax(attachmentRequest);\n } catch (e) {\n let message = e.response && e.response.errors && e.response.errors[0];\n throw new FileUploadError(\n message || 'Error attaching file.',\n e.xhr.status,\n ERROR_CODE_ATTACH\n );\n }\n }\n\n uploadRequestDidProgress(event) {\n const progress = (event.loaded / event.total) * 100;\n if (progress) {\n this.progressBar.progress(progress);\n }\n }\n\n directUploadWillStoreFileWithXHR(xhr) {\n xhr.upload.addEventListener('progress', (event) =>\n this.uploadRequestDidProgress(event)\n );\n }\n}\n","// Error while reading the file client-side\nexport const ERROR_CODE_READ = 'file-upload-read-error';\n// Error while creating the empty blob on the server\nexport const ERROR_CODE_CREATE = 'file-upload-create-error';\n// Error while uploading the blob content\nexport const ERROR_CODE_STORE = 'file-upload-store-error';\n// Error while attaching the blob to the record\nexport const ERROR_CODE_ATTACH = 'file-upload-attach-error';\n\n// Failure on the client side (syntax error, error reading file, etc.)\nexport const FAILURE_CLIENT = 'file-upload-failure-client';\n// Failure on the server side (typically non-200 response)\nexport const FAILURE_SERVER = 'file-upload-failure-server';\n// Failure during the transfert (request aborted, connection lost, etc)\nexport const FAILURE_CONNECTIVITY = 'file-upload-failure-connectivity';\n\n/**\n Represent an error during a file upload.\n */\nexport default class FileUploadError extends Error {\n constructor(message, status, code) {\n super(message);\n\n this.name = 'FileUploadError';\n this.status = status;\n this.code = code;\n\n // Prevent the constructor stacktrace from being included.\n // (it messes up with Sentry issues grouping)\n if (Error.captureStackTrace) {\n // V8-only\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = new Error().stack;\n }\n }\n\n /**\n Return the component responsible of the error (client, server or connectivity).\n See FAILURE_* constants for values.\n */\n get failureReason() {\n let isNetworkError = this.code && this.code != ERROR_CODE_READ;\n\n if (isNetworkError && this.status != 0) {\n return FAILURE_SERVER;\n } else if (isNetworkError && this.status == 0) {\n return FAILURE_CONNECTIVITY;\n } else {\n return FAILURE_CLIENT;\n }\n }\n}\n\n// Convert an error message returned by DirectUpload to a proper error object.\n//\n// This function has two goals:\n// 1. Remove the file name from the DirectUpload error message\n// (because the filename confuses Sentry error grouping)\n// 2. Create each kind of error on a different line\n// (so that Sentry knows they are different kind of errors, from\n// the line they were created.)\nexport function errorFromDirectUploadMessage(message) {\n let matches = message.match(/ Status: ([0-9]{1,3})/);\n let status = matches ? parseInt(matches[1], 10) : undefined;\n\n // prettier-ignore\n if (message.includes('Error reading')) {\n return new FileUploadError('Error reading file.', status, ERROR_CODE_READ);\n } else if (message.includes('Error creating')) {\n return new FileUploadError('Error creating file.', status, ERROR_CODE_CREATE);\n } else if (message.includes('Error storing')) {\n return new FileUploadError('Error storing file.', status, ERROR_CODE_STORE);\n } else {\n return new FileUploadError(message, status, undefined);\n }\n}\n","/*\n Updated w/ insertAdjacentElement\n @author Dan Levy @justsml\n 2016-06-23\n\n Credit: @lyleunderwood - afterend patch/fix\n\n 2011-10-10\n\n By Eli Grey, http://eligrey.com\n Public Domain.\n NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n*/\n\nfunction insertAdjacentElement(position, elem) {\n const _this = this;\n const parent = this.parentNode;\n let node, first;\n\n switch (position.toLowerCase()) {\n case 'beforebegin':\n while ((node = elem.firstChild)) {\n parent.insertBefore(node, _this);\n }\n break;\n case 'afterbegin':\n first = _this.firstChild;\n while ((node = elem.lastChild)) {\n first = _this.insertBefore(node, first);\n }\n break;\n case 'beforeend':\n while ((node = elem.firstChild)) {\n _this.appendChild(node);\n }\n break;\n case 'afterend':\n parent.insertBefore(elem, _this.nextSibling);\n break;\n }\n return elem;\n}\n\n// Method missing in Firefox < 48\nif (!HTMLElement.prototype.insertAdjacentElement) {\n HTMLElement.prototype.insertAdjacentElement = insertAdjacentElement;\n}\n","/*\n @preserve dataset polyfill for IE < 11. See https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset and http://caniuse.com/#search=dataset\n\n @author ShirtlessKirk copyright 2015\n @license WTFPL (http://www.wtfpl.net/txt/copying)\n*/\n\nconst dash = /-([a-z])/gi;\nconst dataRegEx = /^data-(.+)/;\nconst hasEventListener = !!document.addEventListener;\nconst test = document.createElement('_');\nconst DOMAttrModified = 'DOMAttrModified';\n\nlet mutationSupport = false;\n\nfunction clearDataset(event) {\n delete event.target._datasetCache;\n}\n\nfunction toCamelCase(string) {\n return string.replace(dash, function (_, letter) {\n return letter.toUpperCase();\n });\n}\n\nfunction getDataset() {\n const dataset = {};\n\n for (let attribute of this.attributes) {\n let match = attribute.name.match(dataRegEx);\n if (match) {\n dataset[toCamelCase(match[1])] = attribute.value;\n }\n }\n\n return dataset;\n}\n\nfunction mutation() {\n if (hasEventListener) {\n test.removeEventListener(DOMAttrModified, mutation, false);\n } else {\n test.detachEvent(`on${DOMAttrModified}`, mutation);\n }\n\n mutationSupport = true;\n}\n\nif (!test.dataset) {\n if (hasEventListener) {\n test.addEventListener(DOMAttrModified, mutation, false);\n } else {\n test.attachEvent(`on${DOMAttrModified}`, mutation);\n }\n\n // trigger event (if supported)\n test.setAttribute('foo', 'bar');\n\n Object.defineProperty(Element.prototype, 'dataset', {\n get: mutationSupport\n ? function get() {\n if (!this._datasetCache) {\n this._datasetCache = getDataset.call(this);\n }\n\n return this._datasetCache;\n }\n : getDataset\n });\n\n if (mutationSupport && hasEventListener) {\n // < IE9 supports neither\n document.addEventListener(DOMAttrModified, clearDataset, false);\n }\n}\n","import { fire } from '@utils';\n\naddEventListener('DOMContentLoaded', function () {\n fire(document, 'ds:page:update');\n});\n\naddEventListener('ajax:success', function () {\n fire(document, 'ds:page:update');\n});\n","import ProgressBar from './progress-bar';\nimport {\n errorFromDirectUploadMessage,\n ERROR_CODE_READ,\n FAILURE_CLIENT\n} from './file-upload-error';\nimport { fire } from '@utils';\n\nconst INITIALIZE_EVENT = 'direct-upload:initialize';\nconst START_EVENT = 'direct-upload:start';\nconst PROGRESS_EVENT = 'direct-upload:progress';\nconst ERROR_EVENT = 'direct-upload:error';\nconst END_EVENT = 'direct-upload:end';\n\nfunction addUploadEventListener(type, handler) {\n addEventListener(type, (event) => {\n // Internet Explorer and Edge will sometime replay Javascript events\n // that were dispatched just before a page navigation (!), but without\n // the event payload.\n //\n // Ignore these replayed events.\n const isEventValid = event && event.detail && event.detail.id != undefined;\n if (!isEventValid) return;\n\n handler(event);\n });\n}\n\naddUploadEventListener(INITIALIZE_EVENT, ({ target, detail: { id, file } }) => {\n ProgressBar.init(target, id, file);\n});\n\naddUploadEventListener(START_EVENT, ({ target, detail: { id } }) => {\n ProgressBar.start(id);\n // At the end of the upload, the form will be submitted again.\n // Avoid the confirm dialog to be presented again then.\n const button = target.form.querySelector('button.primary');\n if (button) {\n button.removeAttribute('data-confirm');\n }\n});\n\naddUploadEventListener(PROGRESS_EVENT, ({ detail: { id, progress } }) => {\n ProgressBar.progress(id, progress);\n});\n\naddUploadEventListener(ERROR_EVENT, (event) => {\n let id = event.detail.id;\n let errorMsg = event.detail.error;\n\n // Display an error message\n alert(\n `Nous sommes désolés, une erreur s’est produite lors de l’envoi du fichier.\n\n (${errorMsg})`\n );\n // Prevent ActiveStorage from displaying its own error message\n event.preventDefault();\n\n ProgressBar.error(id, errorMsg);\n\n // Report unexpected client errors to Sentry.\n // (But ignore usual client errors, or errors we can monitor better on the server side.)\n let error = errorFromDirectUploadMessage(errorMsg);\n if (error.failureReason == FAILURE_CLIENT && error.code != ERROR_CODE_READ) {\n fire(document, 'sentry:capture-exception', error);\n }\n});\n\naddUploadEventListener(END_EVENT, ({ detail: { id } }) => {\n ProgressBar.end(id);\n});\n","import { ajax, delegate } from '@utils';\n\naddEventListener('DOMContentLoaded', () => {\n attachementPoller.deactivate();\n exportPoller.deactivate();\n\n const attachments = document.querySelectorAll('[data-attachment-poll-url]');\n const exports = document.querySelectorAll('[data-export-poll-url]');\n\n for (let { dataset } of attachments) {\n attachementPoller.add(dataset.attachmentPollUrl);\n }\n\n for (let { dataset } of exports) {\n exportPoller.add(dataset.exportPollUrl);\n }\n});\n\naddEventListener('attachment:update', ({ detail: { url } }) => {\n attachementPoller.add(url);\n});\n\naddEventListener('export:update', ({ detail: { url } }) => {\n exportPoller.add(url);\n});\n\ndelegate('click', '[data-attachment-refresh]', (event) => {\n event.preventDefault();\n attachementPoller.check();\n});\n\n// Periodically check the state of a set of URLs.\n//\n// Each time the given URL is requested, the matching `show.js.erb` view is rendered,\n// causing the state to be refreshed.\n//\n// This is used mainly to refresh attachments during the anti-virus check,\n// but also to refresh the state of a pending spreadsheet export.\nclass RemotePoller {\n urls = new Set();\n timeout;\n checks = 0;\n\n constructor(settings = {}) {\n this.interval = settings.interval;\n this.maxChecks = settings.maxChecks;\n }\n\n get isEnabled() {\n return this.checks <= this.maxChecks;\n }\n\n get isActive() {\n return this.timeout !== undefined;\n }\n\n add(url) {\n if (this.isEnabled) {\n if (!this.isActive) {\n this.activate();\n }\n this.urls.add(url);\n }\n }\n\n check() {\n let urls = this.urls;\n this.reset();\n for (let url of urls) {\n // Start the request. The JS payload in the response will update the page.\n // (Errors are ignored, because background tasks shouldn't report errors to the user.)\n ajax({ url, type: 'get' }).catch(() => {});\n }\n }\n\n activate() {\n clearTimeout(this.timeout);\n this.timeout = setTimeout(() => {\n this.checks++;\n this.currentInterval = this.interval * 1.5;\n this.check();\n }, this.currentInterval);\n }\n\n deactivate() {\n this.checks = 0;\n this.currentInterval = this.interval;\n this.reset();\n }\n\n reset() {\n clearTimeout(this.timeout);\n this.urls = new Set();\n this.timeout = undefined;\n }\n}\n\nconst attachementPoller = new RemotePoller({ interval: 3000, maxChecks: 5 });\nconst exportPoller = new RemotePoller({ interval: 6000, maxChecks: 10 });\n","// iOS 11.3 Safari / macOS Safari 11.1 empty XHR bug workaround.\n// This should work with every modern browser which supports ES5 (including IE9).\n// https://stackoverflow.com/questions/49614091/safari-11-1-ajax-xhr-form-submission-fails-when-inputtype-file-is-empty\n// https://github.com/rails/rails/issues/32440\n\ndocument.addEventListener('ajax:before', function (e) {\n let inputs = e.target.querySelectorAll('input[type=\"file\"]:not([disabled])');\n inputs.forEach(function (input) {\n if (input.files.length > 0) {\n return;\n }\n input.setAttribute('data-safari-temp-disabled', 'true');\n input.setAttribute('disabled', '');\n });\n});\n\n// You should call this by yourself when you aborted an ajax request by stopping a event in ajax:before hook.\ndocument.addEventListener('ajax:beforeSend', function (e) {\n let inputs = e.target.querySelectorAll(\n 'input[type=\"file\"][data-safari-temp-disabled]'\n );\n inputs.forEach(function (input) {\n input.removeAttribute('data-safari-temp-disabled');\n input.removeAttribute('disabled');\n });\n});\n","import { delegate, fire, debounce } from '@utils';\n\nconst remote = 'data-remote';\nconst inputChangeSelector = `input[${remote}], textarea[${remote}]`;\n\n// This is a patch for ujs remote handler. Its purpose is to add\n// a debounced input listener.\nfunction handleRemote(event) {\n const element = this;\n\n if (isRemote(element)) {\n fire(element, 'change', event);\n }\n}\n\nfunction isRemote(element) {\n const value = element.getAttribute(remote);\n return value && value !== 'false';\n}\n\ndelegate('input', inputChangeSelector, debounce(handleRemote, 200));\n","const fconnect = {\n tracesUrl: '/traces',\n aboutUrl: ''\n};\nconst document = window.document;\n\nfunction init() {\n fconnect.currentHost = 'fcp.integ01.dev-franceconnect.fr';\n\n if (window.location.hostname == 'www.demarches-simplifiees.fr')\n fconnect.currentHost = 'app.franceconnect.gouv.fr';\n\n var fconnectProfile = document.getElementById('fconnect-profile');\n if (fconnectProfile) {\n var linkAccess = document.querySelector('#fconnect-profile > a');\n var fcLogoutUrl = fconnectProfile.getAttribute('data-fc-logout-url');\n var access = createFCAccessElement(fcLogoutUrl);\n fconnectProfile.appendChild(access);\n linkAccess.onclick = toggleElement.bind(access);\n }\n}\n\naddEventListener('ds:page:update', init);\n\nfunction toggleElement(event) {\n event.preventDefault();\n if (this.style.display === 'block') {\n this.style.display = 'none';\n } else {\n this.style.display = 'block';\n }\n}\n\nfunction closeFCPopin(event) {\n event.preventDefault();\n fconnect.popin.className = 'fade-out';\n setTimeout(function () {\n document.body.removeChild(fconnect.popin);\n }, 200);\n}\n\nfunction openFCPopin() {\n fconnect.popin = document.createElement('div');\n fconnect.popin.id = 'fc-background';\n\n var iframe = createFCIframe();\n\n document.body.appendChild(fconnect.popin);\n\n fconnect.popin.appendChild(iframe);\n\n setTimeout(function () {\n fconnect.popin.className = 'fade-in';\n }, 200);\n}\n\nfunction createFCIframe() {\n var iframe = document.createElement('iframe');\n iframe.setAttribute('id', 'fconnect-iframe');\n iframe.frameBorder = 0;\n iframe.name = 'fconnect-iframe';\n return iframe;\n}\n\nfunction createFCAccessElement(logoutUrl) {\n var access = document.createElement('div');\n access.id = 'fconnect-access';\n access.innerHTML = '
Vous êtes identifié grâce à FranceConnect
';\n access.appendChild(createAboutLink());\n access.appendChild(document.createElement('hr'));\n access.appendChild(createHistoryLink());\n access.appendChild(createLogoutElement(logoutUrl));\n return access;\n}\n\nfunction createHistoryLink() {\n var historyLink = document.createElement('a');\n historyLink.target = 'fconnect-iframe';\n historyLink.href = '//' + fconnect.currentHost + fconnect.tracesUrl;\n historyLink.onclick = openFCPopin;\n historyLink.innerHTML = 'Historique des connexions/échanges de données';\n\n return historyLink;\n}\n\nfunction createAboutLink() {\n var aboutLink = document.createElement('a');\n aboutLink.href = fconnect.aboutUrl\n ? '//' + fconnect.currentHost + fconnect.aboutUrl\n : '#';\n if (fconnect.aboutUrl) {\n aboutLink.target = 'fconnect-iframe';\n aboutLink.onclick = openFCPopin;\n }\n aboutLink.innerHTML = \"Qu'est-ce-que FranceConnect ?\";\n\n return aboutLink;\n}\n\nfunction createLogoutElement(logoutUrl) {\n var elm = document.createElement('div');\n elm.className = 'logout';\n elm.innerHTML =\n 'Se déconnecter';\n return elm;\n}\n\nvar eventMethod = window.addEventListener ? 'addEventListener' : 'attachEvent';\nvar eventer = window[eventMethod];\nvar messageEvent = eventMethod == 'attachEvent' ? 'onmessage' : 'message';\n\n// Listen to message from child window\neventer(\n messageEvent,\n function (e) {\n var key = e.message ? 'message' : 'data';\n var data = e[key];\n if (data === 'close_popup') {\n closeFCPopin(e);\n }\n },\n false\n);\n","import { delegate, toggle } from '@utils';\n\n// Unobtrusive Javascript for allowing an element to toggle\n// the visibility of another element.\n//\n// Usage:\n// \n//
Content
\n\nconst TOGGLE_SOURCE_SELECTOR = '[data-toggle-target]';\n\ndelegate('click', TOGGLE_SOURCE_SELECTOR, (evt) => {\n evt.preventDefault();\n\n const targetSelector = evt.target.dataset.toggleTarget;\n const targetElements = document.querySelectorAll(targetSelector);\n for (let target of targetElements) {\n toggle(target);\n target.focus();\n }\n});\n","// For links and requests done through rails-ujs (mostly data-remote links),\n// redirect to the sign-in page when the server responds '401 Unauthorized'.\ndocument.body.addEventListener('ajax:error', (event) => {\n const [, , xhr] = event.detail;\n if (xhr && xhr.status == 401) {\n location.reload(); // reload whole page so Devise will redirect to sign-in\n }\n});\n","// Ruby chartkick helper implementation assumes Chartkick is already loaded.\n// It has no way to delay execution. So we wrap all the Chartkick classes\n// to queue rendering for when Chartkick is loaded.\n\nclass AreaChart {\n constructor(...args) {\n charts.add(['AreaChart', args]);\n }\n}\n\nclass PieChart {\n constructor(...args) {\n charts.add(['PieChart', args]);\n }\n}\n\nclass LineChart {\n constructor(...args) {\n charts.add(['LineChart', args]);\n }\n}\n\nclass ColumnChart {\n constructor(...args) {\n charts.add(['ColumnChart', args]);\n }\n}\n\nconst charts = new Set();\n\nfunction initialize() {\n for (const [ChartType, args] of charts) {\n new window.Chartkick[ChartType](...args);\n }\n charts.clear();\n}\n\nif (!window.Chartkick) {\n window.Chartkick = { AreaChart, PieChart, LineChart, ColumnChart };\n addEventListener('chartkick:ready', initialize);\n}\n","import { delegate } from '@utils';\n\ndelegate('blur keydown', 'input, textarea', ({ target }) => {\n touch(target);\n});\n\ndelegate(\n 'click',\n 'input[type=\"submit\"]:not([formnovalidate])',\n ({ target }) => {\n let form = target.closest('form');\n let inputs = form ? form.querySelectorAll('input, textarea') : [];\n [...inputs].forEach(touch);\n }\n);\n\nfunction touch({ classList }) {\n classList.add('touched');\n}\n","import { delegate } from '@utils';\n\nfunction updateReadMoreVisibility() {\n const descBody = document.querySelector('.procedure-description-body');\n if (descBody) {\n // If the description text overflows, display a \"Read more\" button.\n const isOverflowing = descBody.scrollHeight > descBody.clientHeight;\n descBody.classList.toggle('read-more-enabled', isOverflowing);\n }\n}\n\nfunction expandProcedureDescription() {\n const descBody = document.querySelector('.procedure-description-body');\n descBody.classList.remove('read-more-collapsed');\n}\n\naddEventListener('ds:page:update', updateReadMoreVisibility);\naddEventListener('resize', updateReadMoreVisibility);\n\ndelegate('click', '.read-more-button', expandProcedureDescription);\n","import { delegate } from '@utils';\n\nfunction syncInputToElement(fromSelector, toSelector) {\n const fromElement = document.querySelector(fromSelector);\n const toElement = document.querySelector(toSelector);\n if (toElement && fromElement) {\n toElement.innerText = fromElement.value;\n }\n}\n\nfunction syncFormToPreview() {\n syncInputToElement('#procedure_libelle', '.procedure-title');\n syncInputToElement('#procedure_description', '.procedure-description-body');\n}\n\ndelegate('input', '.procedure-form #procedure_libelle', syncFormToPreview);\ndelegate('input', '.procedure-form #procedure_description', syncFormToPreview);\n","import { show, hide, delegate } from '@utils';\n\nfunction showSpinner() {\n [...document.querySelectorAll('.spinner')].forEach(show);\n}\n\nfunction hideSpinner() {\n [...document.querySelectorAll('.spinner')].forEach(hide);\n}\n\ndelegate('ajax:complete', '[data-spinner]', hideSpinner);\ndelegate('ajax:stopped', '[data-spinner]', hideSpinner);\ndelegate('ajax:send', '[data-spinner]', showSpinner);\n","import { delegate } from '@utils';\n\ndelegate('click', 'body', (event) => {\n if (!event.target.closest('.dropdown, [data-reach-combobox-popover]')) {\n [...document.querySelectorAll('.dropdown')].forEach((element) => {\n const button = element.querySelector('.dropdown-button');\n button.setAttribute('aria-expanded', false);\n element.classList.remove('open', 'fade-in-down');\n });\n }\n});\n\ndelegate('click', '.dropdown-button', (event) => {\n event.stopPropagation();\n const button = event.target.closest('.dropdown-button');\n const parent = button.parentElement;\n if (parent.classList.contains('dropdown')) {\n parent.classList.toggle('open');\n var buttonExpanded = button.getAttribute('aria-expanded') === 'true';\n button.setAttribute('aria-expanded', !buttonExpanded);\n }\n});\n","//\n// This content is inspired by w3c aria example\n// https://www.w3.org/TR/wai-aria-practices-1.1/examples/disclosure/disclosure-faq.html\n//\n\nclass ButtonExpand {\n constructor(domNode) {\n this.domNode = domNode;\n\n this.keyCode = Object.freeze({\n RETURN: 13\n });\n\n this.allButtons = [];\n this.controlledNode = false;\n\n var id = this.domNode.getAttribute('aria-controls');\n\n if (id) {\n this.controlledNode = document.getElementById(id);\n }\n\n this.domNode.setAttribute('aria-expanded', 'false');\n this.hideContent();\n\n this.domNode.addEventListener('keydown', this.handleKeydown.bind(this));\n this.domNode.addEventListener('click', this.handleClick.bind(this));\n this.domNode.addEventListener('focus', this.handleFocus.bind(this));\n this.domNode.addEventListener('blur', this.handleBlur.bind(this));\n }\n\n showContent() {\n this.domNode.setAttribute('aria-expanded', 'true');\n this.domNode.classList.add('primary');\n if (this.controlledNode) {\n this.controlledNode.classList.remove('hidden');\n }\n this.formInput.value = this.domNode.getAttribute('data-question-type');\n\n this.allButtons.forEach((b) => {\n if (b != this) {\n b.hideContent();\n }\n });\n }\n\n hideContent() {\n this.domNode.setAttribute('aria-expanded', 'false');\n this.domNode.classList.remove('primary');\n if (this.controlledNode) {\n this.controlledNode.classList.add('hidden');\n }\n }\n\n toggleExpand() {\n if (this.domNode.getAttribute('aria-expanded') === 'true') {\n this.hideContent();\n } else {\n this.showContent();\n }\n }\n\n setAllButtons(buttons) {\n this.allButtons = buttons;\n }\n\n setFormInput(formInput) {\n this.formInput = formInput;\n }\n\n handleKeydown() {\n switch (event.keyCode) {\n case this.keyCode.RETURN:\n this.toggleExpand();\n\n event.stopPropagation();\n event.preventDefault();\n break;\n\n default:\n break;\n }\n }\n\n handleClick() {\n event.stopPropagation();\n event.preventDefault();\n this.toggleExpand();\n }\n\n handleFocus = function () {\n this.domNode.classList.add('focus');\n };\n\n handleBlur() {\n this.domNode.classList.remove('focus');\n }\n}\n\n/* Initialize Hide/Show Buttons */\n\nif (document.querySelector('#contact-form')) {\n window.addEventListener(\n 'ds:page:update',\n function () {\n var buttons = document.querySelectorAll(\n 'button[aria-expanded][aria-controls], button.button-without-hint'\n );\n var expandButtons = [];\n var formInput = document.querySelector('form input#type');\n\n buttons.forEach((button) => {\n var be = new ButtonExpand(button);\n expandButtons.push(be);\n });\n expandButtons.forEach((button) => button.setAllButtons(expandButtons));\n expandButtons.forEach((button) => button.setFormInput(formInput));\n },\n false\n );\n}\n","import { scrollTo, scrollToBottom } from '@utils';\n\nfunction scrollMessagerie() {\n const ul = document.querySelector('.messagerie ul');\n\n if (ul) {\n const elementToScroll = document.querySelector('.date.highlighted');\n\n if (elementToScroll) {\n scrollTo(ul, elementToScroll);\n } else {\n scrollToBottom(ul);\n }\n }\n}\n\nfunction saveMessageContent() {\n const commentaireForms = Array.from(\n document.querySelectorAll('form[data-persisted-content-id]')\n );\n\n if (commentaireForms.length) {\n const commentaireInputs = Array.from(\n document.querySelectorAll('.persisted-input')\n );\n\n const persistedContentIds = commentaireForms.map(\n (form) => form.dataset.persistedContentId\n );\n\n const keys = persistedContentIds.map((key) => `persisted-value-${key}`);\n\n const object = commentaireInputs.map((input, index) => {\n return {\n input: input,\n form: commentaireForms[index],\n key: keys[index]\n };\n });\n\n for (const el of object) {\n if (localStorage.getItem(el.key)) {\n el.input.value = localStorage.getItem(el.key);\n }\n\n el.input.addEventListener('change', (event) => {\n localStorage.setItem(el.key, event.target.value);\n });\n\n el.form.addEventListener('submit', () => {\n localStorage.removeItem(el.key);\n });\n }\n }\n}\n\naddEventListener('ds:page:update', scrollMessagerie);\naddEventListener('ds:page:update', saveMessageContent);\n","import { ajax, fire, timeoutable } from '@utils';\n\n// Manages a queue of Autosave operations,\n// and sends `autosave:*` events to indicate the state of the requests:\n//\n// - autosave:enqueue () when an autosave request has been enqueued\n// - autosave:end ({ response, statusText, xhr }) when an autosave request finished successfully\n// - autosave:failure (Error) when an autosave request failed\n//\nexport default class AutoSaveController {\n constructor() {\n this.timeoutDelay = 60000; // 1mn\n this.latestPromise = Promise.resolve();\n }\n\n // Add a new autosave request to the queue.\n // It will be started after the previous one finishes (to prevent older form data\n // to overwrite newer data if the server does not respond in order.)\n enqueueAutosaveRequest(form) {\n this.latestPromise = this.latestPromise.finally(() => {\n return this._sendAutosaveRequest(form)\n .then(this._didSucceed)\n .catch(this._didFail);\n });\n this._didEnqueue();\n }\n\n // Create a fetch request that saves the form.\n // Returns a promise fulfilled when the request completes.\n _sendAutosaveRequest(form) {\n const autosavePromise = new Promise((resolve, reject) => {\n if (!document.body.contains(form)) {\n return reject(new Error('The form can no longer be found.'));\n }\n\n const [formData, formDataError] = this._formDataForDraft(form);\n if (formDataError) {\n formDataError.message = `Error while generating the form data (${formDataError.message})`;\n return reject(formDataError);\n }\n\n const params = {\n url: form.action,\n type: form.method,\n data: formData,\n dataType: 'script'\n };\n\n return ajax(params)\n .then(({ response }) => {\n resolve(response);\n })\n .catch((error) => {\n reject(error);\n });\n });\n\n // Time out the request after a while, to avoid recent requests not starting\n // because an older one is stuck.\n return timeoutable(autosavePromise, this.timeoutDelay);\n }\n\n // Extract a FormData object of the form fields.\n _formDataForDraft(form) {\n // File inputs are handled separatly by ActiveStorage:\n // exclude them from the draft (by disabling them).\n // (Also Safari has issue with FormData containing empty file inputs)\n const fileInputs = form.querySelectorAll(\n 'input[type=\"file\"]:not([disabled]), .editable-champ-piece_justificative input:not([disabled])'\n );\n fileInputs.forEach((fileInput) => (fileInput.disabled = true));\n\n // Generate the form data\n let formData = null;\n try {\n formData = new FormData(form);\n return [formData, null];\n } catch (error) {\n return [null, error];\n } finally {\n // Re-enable disabled file inputs\n fileInputs.forEach((fileInput) => (fileInput.disabled = false));\n }\n }\n\n _didEnqueue() {\n fire(document, 'autosave:enqueue');\n }\n\n _didSucceed(response) {\n fire(document, 'autosave:end', response);\n }\n\n _didFail(error) {\n fire(document, 'autosave:error', error);\n }\n}\n","import AutoSaveController from './auto-save-controller.js';\nimport {\n debounce,\n delegate,\n fire,\n enable,\n disable,\n hasClass,\n addClass,\n removeClass\n} from '@utils';\n\nconst AUTOSAVE_DEBOUNCE_DELAY = gon.autosave.debounce_delay;\nconst AUTOSAVE_STATUS_VISIBLE_DURATION = gon.autosave.status_visible_duration;\n\n// Create a controller responsible for queuing autosave operations.\nconst autoSaveController = new AutoSaveController();\n\nfunction enqueueAutosaveRequest() {\n const form = document.querySelector(FORM_SELECTOR);\n autoSaveController.enqueueAutosaveRequest(form);\n}\n\n//\n// Whenever a 'change' event is triggered on one of the form inputs, try to autosave.\n//\n\nconst FORM_SELECTOR = 'form#dossier-edit-form.autosave-enabled';\nconst INPUTS_SELECTOR = `${FORM_SELECTOR} input:not([type=file]), ${FORM_SELECTOR} select, ${FORM_SELECTOR} textarea`;\nconst RETRY_BUTTON_SELECTOR = '.autosave-retry';\n\n// When an autosave is requested programmatically, auto-save the form immediately\naddEventListener('autosave:trigger', (event) => {\n const form = event.target.closest('form');\n if (form && form.classList.contains('autosave-enabled')) {\n enqueueAutosaveRequest();\n }\n});\n\n// When the \"Retry\" button is clicked, auto-save the form immediately\ndelegate('click', RETRY_BUTTON_SELECTOR, enqueueAutosaveRequest);\n\n// When an input changes, batches changes for N seconds, then auto-save the form\ndelegate(\n 'change',\n INPUTS_SELECTOR,\n debounce(enqueueAutosaveRequest, AUTOSAVE_DEBOUNCE_DELAY)\n);\n\n//\n// Display some UI during the autosave\n//\n\naddEventListener('autosave:enqueue', () => {\n disable(document.querySelector('button.autosave-retry'));\n});\n\naddEventListener('autosave:end', () => {\n enable(document.querySelector('button.autosave-retry'));\n setState('succeeded');\n hideSucceededStatusAfterDelay();\n});\n\naddEventListener('autosave:error', (event) => {\n let error = event.detail;\n\n if (error.xhr && error.xhr.status == 401) {\n // If we are unauthenticated, reload the page using a GET request.\n // This will allow Devise to properly redirect us to sign-in, and then back to this page.\n document.location.reload();\n return;\n }\n\n enable(document.querySelector('button.autosave-retry'));\n setState('failed');\n\n const shouldLogError = !error.xhr || error.xhr.status != 0; // ignore timeout errors\n if (shouldLogError) {\n logError(error);\n }\n});\n\nfunction setState(state) {\n const autosave = document.querySelector('.autosave');\n if (autosave) {\n // Re-apply the state even if already present, to get a nice animation\n removeClass(autosave, 'autosave-state-idle');\n removeClass(autosave, 'autosave-state-succeeded');\n removeClass(autosave, 'autosave-state-failed');\n autosave.offsetHeight; // flush animations\n addClass(autosave, `autosave-state-${state}`);\n }\n}\n\nfunction hideSucceededStatus() {\n const autosave = document.querySelector('.autosave');\n if (hasClass(autosave, 'autosave-state-succeeded')) {\n setState('idle');\n }\n}\nconst hideSucceededStatusAfterDelay = debounce(\n hideSucceededStatus,\n AUTOSAVE_STATUS_VISIBLE_DURATION\n);\n\nfunction logError(error) {\n if (error && error.message) {\n error.message = `[Autosave] ${error.message}`;\n console.error(error);\n fire(document, 'sentry:capture-exception', error);\n }\n}\n","import Uploader from '../../shared/activestorage/uploader';\nimport { show, hide, toggle } from '@utils';\nimport {\n ERROR_CODE_READ,\n FAILURE_CONNECTIVITY\n} from '../../shared/activestorage/file-upload-error';\n\n// Given a file input in a champ with a selected file, upload a file,\n// then attach it to the dossier.\n//\n// On success, the champ is replaced by an HTML fragment describing the attachment.\n// On error, a error message is displayed above the input.\nexport default class AutoUploadController {\n constructor(input, file) {\n this.input = input;\n this.file = file;\n this.uploader = new Uploader(\n input,\n file,\n input.dataset.directUploadUrl,\n input.dataset.autoAttachUrl\n );\n }\n\n // Create, upload and attach the file.\n // On failure, display an error message and throw a FileUploadError.\n async start() {\n try {\n this._begin();\n await this.uploader.start();\n this._succeeded();\n } catch (error) {\n this._failed(error);\n throw error;\n } finally {\n this._done();\n }\n }\n\n _begin() {\n this.input.disabled = true;\n this._hideErrorMessage();\n }\n\n _succeeded() {\n this.input.value = null;\n }\n\n _failed(error) {\n if (!document.body.contains(this.input)) {\n return;\n }\n\n this.uploader.progressBar.destroy();\n\n let message = this._messageFromError(error);\n this._displayErrorMessage(message);\n }\n\n _done() {\n this.input.disabled = false;\n }\n\n _messageFromError(error) {\n let message = error.message || error.toString();\n let canRetry = error.status && error.status != 422;\n\n if (error.failureReason == FAILURE_CONNECTIVITY) {\n return {\n title: 'Le fichier n’a pas pu être envoyé.',\n description: 'Vérifiez votre connexion à Internet, puis ré-essayez.',\n retry: true\n };\n } else if (error.code == ERROR_CODE_READ) {\n return {\n title: 'Nous n’arrivons pas à lire ce fichier sur votre appareil.',\n description: 'Essayez à nouveau, ou sélectionnez un autre fichier.',\n retry: false\n };\n } else {\n return {\n title: 'Le fichier n’a pas pu être envoyé.',\n description: message,\n retry: canRetry\n };\n }\n }\n\n _displayErrorMessage(message) {\n let errorNode = this.input.parentElement.querySelector('.attachment-error');\n if (errorNode) {\n show(errorNode);\n errorNode.querySelector('.attachment-error-title').textContent =\n message.title || '';\n errorNode.querySelector('.attachment-error-description').textContent =\n message.description || '';\n toggle(errorNode.querySelector('.attachment-error-retry'), message.retry);\n }\n }\n\n _hideErrorMessage() {\n let errorElement =\n this.input.parentElement.querySelector('.attachment-error');\n if (errorElement) {\n hide(errorElement);\n }\n }\n}\n","import Rails from '@rails/ujs';\nimport AutoUploadController from './auto-upload-controller.js';\nimport {\n FAILURE_CLIENT,\n ERROR_CODE_READ\n} from '../../shared/activestorage/file-upload-error';\n\n// Manage multiple concurrent uploads.\n//\n// When the first upload starts, all the form \"Submit\" buttons are disabled.\n// They are enabled again when the last upload ends.\nexport default class AutoUploadsControllers {\n constructor() {\n this.inFlightUploadsCount = 0;\n }\n\n async upload(input, file) {\n let form = input.form;\n this._incrementInFlightUploads(form);\n\n try {\n let controller = new AutoUploadController(input, file);\n await controller.start();\n } catch (err) {\n // Report unexpected client errors to Sentry.\n // (But ignore usual client errors, or errors we can monitor better on the server side.)\n if (err.failureReason == FAILURE_CLIENT && err.code != ERROR_CODE_READ) {\n throw err;\n }\n } finally {\n this._decrementInFlightUploads(form);\n }\n }\n\n _incrementInFlightUploads(form) {\n this.inFlightUploadsCount += 1;\n\n if (form) {\n form\n .querySelectorAll('button[type=submit]')\n .forEach((submitButton) => Rails.disableElement(submitButton));\n }\n }\n\n _decrementInFlightUploads(form) {\n if (this.inFlightUploadsCount > 0) {\n this.inFlightUploadsCount -= 1;\n }\n\n if (this.inFlightUploadsCount == 0 && form) {\n form\n .querySelectorAll('button[type=submit]')\n .forEach((submitButton) => Rails.enableElement(submitButton));\n }\n }\n}\n","import AutoUploadsControllers from './auto-uploads-controllers.js';\nimport { delegate } from '@utils';\n\n// Create a controller responsible for managing several concurrent uploads.\nconst autoUploadsControllers = new AutoUploadsControllers();\n\nfunction startUpload(input) {\n Array.from(input.files).forEach((file) => {\n autoUploadsControllers.upload(input, file);\n });\n}\n\nconst fileInputSelector = `input[type=file][data-direct-upload-url][data-auto-attach-url]:not([disabled])`;\ndelegate('change', fileInputSelector, (event) => {\n startUpload(event.target);\n});\n\nconst retryButtonSelector = `button.attachment-error-retry`;\ndelegate('click', retryButtonSelector, function () {\n const inputSelector = this.dataset.inputTarget;\n const input = document.querySelector(inputSelector);\n startUpload(input);\n});\n","import { delegate, fire, debounce } from '@utils';\n\nconst inputHandlers = new Map();\n\naddEventListener('ds:page:update', () => {\n const inputs = document.querySelectorAll('.areas input[data-geo-area]');\n\n for (const input of inputs) {\n input.addEventListener('focus', (event) => {\n const id = parseInt(event.target.dataset.geoArea);\n fire(document, 'map:feature:focus', { id });\n });\n }\n});\n\ndelegate('click', '.areas a[data-geo-area]', (event) => {\n event.preventDefault();\n const id = parseInt(event.target.dataset.geoArea);\n fire(document, 'map:feature:focus', { id });\n});\n\ndelegate('input', '.areas input[data-geo-area]', (event) => {\n const id = parseInt(event.target.dataset.geoArea);\n\n let handler = inputHandlers.get(id);\n if (!handler) {\n handler = debounce(() => {\n const input = document.querySelector(`input[data-geo-area=\"${id}\"]`);\n if (input) {\n fire(document, 'map:feature:update', {\n id,\n properties: { description: input.value.trim() }\n });\n }\n }, 200);\n inputHandlers.set(id, handler);\n }\n\n handler();\n});\n","import { delegate } from '@utils';\n\nconst PRIMARY_SELECTOR = 'select[data-secondary-options]';\nconst SECONDARY_SELECTOR = 'select[data-secondary]';\nconst CHAMP_SELECTOR = '.editable-champ';\n\ndelegate('change', PRIMARY_SELECTOR, (evt) => {\n const primary = evt.target;\n const secondary = primary\n .closest(CHAMP_SELECTOR)\n .querySelector(SECONDARY_SELECTOR);\n const options = JSON.parse(primary.dataset.secondaryOptions);\n\n selectOptions(secondary, options[primary.value]);\n});\n\nfunction selectOptions(selectElement, options) {\n selectElement.innerHTML = '';\n\n for (let option of options) {\n let element = document.createElement('option');\n element.textContent = option;\n element.value = option;\n selectElement.appendChild(element);\n }\n\n selectElement.selectedIndex = 0;\n}\n","import { show, hide } from '@utils';\n\nexport function showMotivation(event, state) {\n event.preventDefault();\n motivationCancel();\n show(document.querySelector(`.motivation.${state}`));\n hide(document.querySelector('.dropdown-items'));\n}\n\nexport function motivationCancel() {\n document.querySelectorAll('.motivation').forEach(hide);\n show(document.querySelector('.dropdown-items'));\n}\n\nexport function showImportJustificatif(name) {\n show(document.querySelector('#justificatif_motivation_import_' + name));\n hide(document.querySelector('#justificatif_motivation_suggest_' + name));\n}\n","import { delegate, fire } from '@utils';\n\nconst CHAMP_SELECTOR = '.editable-champ';\nconst BUTTON_SELECTOR = '.button.remove-row';\nconst DESTROY_INPUT_SELECTOR = 'input[type=hidden][name*=_destroy]';\nconst DOM_ID_INPUT_SELECTOR = 'input[type=hidden][name*=deleted_row_dom_ids]';\n\ndelegate('click', BUTTON_SELECTOR, (evt) => {\n evt.preventDefault();\n\n const row = evt.target.closest('.row');\n\n for (let input of row.querySelectorAll(DESTROY_INPUT_SELECTOR)) {\n input.disabled = false;\n input.value = true;\n }\n row.querySelector(DOM_ID_INPUT_SELECTOR).disabled = false;\n\n for (let champ of row.querySelectorAll(CHAMP_SELECTOR)) {\n champ.remove();\n }\n\n evt.target.remove();\n row.classList.remove('row');\n\n // We could debounce the autosave request, so that row removal would be batched\n // with the next changes.\n // However *adding* a new repetition row isn't debounced (changes are immediately\n // effective server-side).\n // So, to avoid ordering issues, enqueue an autosave request as soon as the row\n // is removed.\n fire(row, 'autosave:trigger');\n});\n","import { delegate, show, hide } from '@utils';\n\ndelegate(\n 'change',\n '.editable-champ-drop_down_list select, .editable-champ-drop_down_list input[type=\"radio\"]',\n (event) => {\n const parent = event.target.closest('.editable-champ-drop_down_list');\n const inputGroup = parent?.querySelector('.drop_down_other');\n if (inputGroup) {\n const input = inputGroup.querySelector('input');\n if (event.target.value === '__other__') {\n show(inputGroup);\n input.disabled = false;\n } else {\n hide(inputGroup);\n input.disabled = true;\n }\n }\n }\n);\n","import { delegate, show, hide } from '@utils';\nimport { suggest } from 'email-butler';\n\nconst userNewEmailSelector = '#new_user input#user_email';\nconst passwordFieldSelector = '#new_user input#user_password';\nconst suggestionsSelector = '.suspect-email';\nconst emailSuggestionSelector = '.suspect-email .email-suggestion-address';\n\ndelegate('focusout', userNewEmailSelector, () => {\n // When the user leaves the email input during account creation, we check if this account looks correct.\n // If not (e.g if its \"bidou@gmail.coo\" or \"john@yahoo.rf\"), we attempt to suggest a fix for the invalid email.\n const userEmailInput = document.querySelector(userNewEmailSelector);\n const suggestedEmailSpan = document.querySelector(emailSuggestionSelector);\n\n const suggestion = suggest(userEmailInput.value);\n if (suggestion && suggestion.full && suggestedEmailSpan) {\n suggestedEmailSpan.innerHTML = suggestion.full;\n show(document.querySelector(suggestionsSelector));\n } else {\n hide(document.querySelector(suggestionsSelector));\n }\n});\n\nexport function acceptEmailSuggestion() {\n const userEmailInput = document.querySelector(userNewEmailSelector);\n const suggestedEmailSpan = document.querySelector(emailSuggestionSelector);\n\n userEmailInput.value = suggestedEmailSpan.innerHTML;\n hide(document.querySelector(suggestionsSelector));\n document.querySelector(passwordFieldSelector).focus();\n}\n\nexport function discardEmailSuggestionBox() {\n hide(document.querySelector(suggestionsSelector));\n}\n","import React, { Suspense, lazy, createElement } from 'react';\nimport { render } from 'react-dom';\n\n// This attribute holds the name of component which should be mounted\n// example: `data-react-class=\"MyApp.Items.EditForm\"`\nconst CLASS_NAME_ATTR = 'data-react-class';\n\n// This attribute holds JSON stringified props for initializing the component\n// example: `data-react-props=\"{\\\"item\\\": { \\\"id\\\": 1, \\\"name\\\": \\\"My Item\\\"} }\"`\nconst PROPS_ATTR = 'data-react-props';\n\n// A unique identifier to identify a node\nconst CACHE_ID_ATTR = 'data-react-cache-id';\n\nconst CLASS_NAME_SELECTOR = `[${CLASS_NAME_ATTR}]`;\n\n// helper method for the mount and unmount methods to find the\n// `data-react-class` DOM elements\nfunction findDOMNodes(searchSelector) {\n const [selector, parent] = getSelector(searchSelector);\n return parent.querySelectorAll(selector);\n}\n\nfunction getSelector(searchSelector) {\n switch (typeof searchSelector) {\n case 'undefined':\n return [CLASS_NAME_SELECTOR, document];\n case 'object':\n return [CLASS_NAME_SELECTOR, searchSelector];\n case 'string':\n return [\n ['', ' ']\n .map(\n (separator) => `${searchSelector}${separator}${CLASS_NAME_SELECTOR}`\n )\n .join(', '),\n document\n ];\n }\n}\n\nclass ReactComponentRegistry {\n #cache = {};\n #components;\n\n constructor(components) {\n this.#components = components;\n }\n\n getConstructor(className) {\n return this.#components[className];\n }\n\n mountComponents(searchSelector) {\n const nodes = findDOMNodes(searchSelector);\n\n for (const node of nodes) {\n const className = node.getAttribute(CLASS_NAME_ATTR);\n const ComponentClass = this.getConstructor(className);\n const propsJson = node.getAttribute(PROPS_ATTR);\n const props = propsJson && JSON.parse(propsJson);\n const cacheId = node.getAttribute(CACHE_ID_ATTR);\n\n if (!ComponentClass) {\n const message = `Cannot find component: \"${className}\"`;\n console?.log(\n `%c[react-rails] %c${message} for element`,\n 'font-weight: bold',\n '',\n node\n );\n throw new Error(\n `${message}. Make sure your component is available to render.`\n );\n } else {\n let component = this.#cache[cacheId];\n if (!component) {\n this.#cache[cacheId] = component = createElement(\n ComponentClass,\n props\n );\n }\n\n render(component, node);\n }\n }\n }\n}\n\nconst Loader = () =>
;\n\nexport function Loadable(loader) {\n const LazyComponent = lazy(loader);\n\n return function PureComponent(props) {\n return (\n }>\n \n \n );\n };\n}\n\nexport function registerReactComponents(components) {\n const registry = new ReactComponentRegistry(components);\n\n addEventListener('ds:page:update', () => registry.mountComponents());\n}\n","import '../shared/polyfills';\nimport Rails from '@rails/ujs';\nimport * as ActiveStorage from '@rails/activestorage';\nimport 'whatwg-fetch'; // window.fetch polyfill\n\nimport '../shared/page-update-event';\nimport '../shared/activestorage/ujs';\nimport '../shared/remote-poller';\nimport '../shared/safari-11-file-xhr-workaround';\nimport '../shared/remote-input';\nimport '../shared/franceconnect';\nimport '../shared/toggle-target';\nimport '../shared/ujs-error-handling';\n\nimport '../new_design/chartkick';\nimport '../new_design/dropdown';\nimport '../new_design/form-validation';\nimport '../new_design/procedure-context';\nimport '../new_design/procedure-form';\nimport '../new_design/spinner';\nimport '../new_design/support';\nimport '../new_design/messagerie';\nimport '../new_design/dossiers/auto-save';\nimport '../new_design/dossiers/auto-upload';\n\nimport '../new_design/champs/carte';\nimport '../new_design/champs/linked-drop-down-list';\nimport '../new_design/champs/repetition';\nimport '../new_design/champs/drop-down-list';\n\nimport {\n toggleCondidentielExplanation,\n replaceSemicolonByComma\n} from '../new_design/avis';\nimport {\n showMotivation,\n motivationCancel,\n showImportJustificatif\n} from '../new_design/state-button';\nimport {\n acceptEmailSuggestion,\n discardEmailSuggestionBox\n} from '../new_design/user-sign_up';\nimport {\n showFusion,\n showNewAccount,\n showNewAccountPasswordConfirmation\n} from '../new_design/fc-fusion';\n\nimport {\n registerReactComponents,\n Loadable\n} from '../shared/register-react-components';\n\nregisterReactComponents({\n Chartkick: Loadable(() => import('../components/Chartkick')),\n ComboAdresseSearch: Loadable(() =>\n import('../components/ComboAdresseSearch')\n ),\n ComboAnnuaireEducationSearch: Loadable(() =>\n import('../components/ComboAnnuaireEducationSearch')\n ),\n ComboCommunesSearch: Loadable(() =>\n import('../components/ComboCommunesSearch')\n ),\n ComboDepartementsSearch: Loadable(() =>\n import('../components/ComboDepartementsSearch')\n ),\n ComboMultipleDropdownList: Loadable(() =>\n import('../components/ComboMultipleDropdownList')\n ),\n ComboPaysSearch: Loadable(() => import('../components/ComboPaysSearch')),\n ComboRegionsSearch: Loadable(() =>\n import('../components/ComboRegionsSearch')\n ),\n MapEditor: Loadable(() => import('../components/MapEditor')),\n MapReader: Loadable(() => import('../components/MapReader')),\n Trix: Loadable(() => import('../components/Trix')),\n TypesDeChampEditor: Loadable(() => import('../components/TypesDeChampEditor'))\n});\n\n// This is the global application namespace where we expose helpers used from rails views\nconst DS = {\n fire: (eventName, data) => Rails.fire(document, eventName, data),\n toggleCondidentielExplanation,\n showMotivation,\n motivationCancel,\n showImportJustificatif,\n showFusion,\n showNewAccount,\n showNewAccountPasswordConfirmation,\n replaceSemicolonByComma,\n acceptEmailSuggestion,\n discardEmailSuggestionBox\n};\n\n// Start Rails helpers\nRails.start();\nActiveStorage.start();\n\n// Expose globals\nwindow.DS = window.DS || DS;\n","import { toggle } from '@utils';\n\nexport function toggleCondidentielExplanation() {\n toggle(document.querySelector('.confidentiel-explanation'));\n}\n\nexport function replaceSemicolonByComma(event) {\n event.target.value = event.target.value.replace(/;/g, ',');\n}\n","import { show, hide } from '@utils';\n\nexport function showFusion() {\n show(document.querySelector('.fusion'));\n hide(document.querySelector('.new-account'));\n hide(document.querySelector('.new-account-password-confirmation'));\n}\n\nexport function showNewAccount() {\n hide(document.querySelector('.fusion'));\n show(document.querySelector('.new-account'));\n hide(document.querySelector('.new-account-password-confirmation'));\n}\n\nexport function showNewAccountPasswordConfirmation() {\n hide(document.querySelector('.fusion'));\n hide(document.querySelector('.new-account'));\n show(document.querySelector('.new-account-password-confirmation'));\n}\n","const PENDING_CLASS = 'direct-upload--pending';\nconst ERROR_CLASS = 'direct-upload--error';\nconst COMPLETE_CLASS = 'direct-upload--complete';\n\n/**\n ProgressBar is and utility class responsible for\n rendering upload progress bar. It is used to handle\n direct-upload form ujs events but also in the\n Uploader delegate used with uploads on json api.\n\n As the associated DOM element may disappear for some\n reason (a dynamic React list, an element being removed\n and recreated again later, etc.), this class doesn't\n raise any error if the associated DOM element cannot\n be found.\n */\nexport default class ProgressBar {\n static init(input, id, file) {\n clearErrors(input);\n const html = this.render(id, file.name);\n input.insertAdjacentHTML('beforebegin', html);\n }\n\n static start(id) {\n const element = getDirectUploadElement(id);\n if (element) {\n element.classList.remove(PENDING_CLASS);\n element.focus();\n }\n }\n\n static progress(id, progress) {\n const element = getDirectUploadProgressElement(id);\n if (element) {\n element.style.width = `${progress}%`;\n element.setAttribute('aria-valuenow', progress);\n }\n }\n\n static error(id, error) {\n const element = getDirectUploadElement(id);\n if (element) {\n element.classList.add(ERROR_CLASS);\n element.setAttribute('title', error);\n }\n }\n\n static end(id) {\n const element = getDirectUploadElement(id);\n if (element) {\n element.classList.add(COMPLETE_CLASS);\n }\n }\n\n static render(id, filename) {\n return `
\n
\n ${filename}\n
`;\n }\n\n constructor(input, id, file) {\n this.constructor.init(input, id, file);\n this.id = id;\n }\n\n start() {\n this.constructor.start(this.id);\n }\n\n progress(progress) {\n this.constructor.progress(this.id, progress);\n }\n\n error(error) {\n this.constructor.error(this.id, error);\n }\n\n end() {\n this.constructor.end(this.id);\n }\n\n destroy() {\n const element = getDirectUploadElement(this.id);\n element.remove();\n }\n}\n\nfunction clearErrors(input) {\n const errorElements = input.parentElement.querySelectorAll(`.${ERROR_CLASS}`);\n for (let element of errorElements) {\n element.remove();\n }\n}\n\nfunction getDirectUploadElement(id) {\n return document.getElementById(`direct-upload-${id}`);\n}\n\nfunction getDirectUploadProgressElement(id) {\n return document.querySelector(\n `#direct-upload-${id} .direct-upload__progress`\n );\n}\n"],"sourceRoot":""}