{"id":42550,"date":"2026-02-09T19:39:48","date_gmt":"2026-02-10T00:39:48","guid":{"rendered":"https:\/\/dormalab.com\/commentaires-des-praticiens\/"},"modified":"2026-06-27T08:54:34","modified_gmt":"2026-06-27T12:54:34","slug":"commentaires-sur-le-praticien","status":"publish","type":"page","link":"https:\/\/dormalab.com\/fr\/commentaires-sur-le-praticien\/","title":{"rendered":"Commentaires sur le praticien"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"Content-Security-Policy\" content=\"upgrade-insecure-requests\">\n    <title>Partagez vos commentaires<\/title>\n\n    <!-- Bootstrap -->\n    <script src=\"https:\/\/cliniquevoyageur.ca\/external-js\/bootstrap.min.js\"><\/script>\n    <link rel=\"stylesheet\" href=\"https:\/\/cliniquevoyageur.ca\/external-js\/bootstrap.min.css\">\n\n    <!-- Font Awesome -->\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.7.2\/css\/all.min.css\"\n      integrity=\"sha512-Evv84Mr4kqVGRNSgIGL\/F\/aIDqQb7xQ2vcrdIwxfjThSH8CSR7PBEakCr51Ck+w+\/U6swU2Im1vVX0SVk9ABhg==\"\n      crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" \/>\n\n    <!-- jQuery -->\n    <script src=\"https:\/\/cliniquevoyageur.ca\/external-js\/jquery.min.js\"><\/script>\n\n    <style>\n        \/* Scoped styles to prevent conflicts with website *\/\n        .practitioner-feedback-wrapper {\n            font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n            max-width: 600px;\n            margin: 0 auto;\n            background-color: #ffffff;\n            padding: 40px;\n            border-radius: 8px;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n        }\n        .practitioner-feedback-wrapper .feedback-container {\n            max-width: 100%;\n        }\n        .practitioner-feedback-wrapper h1 {\n            color: #002b49;\n            margin-bottom: 30px;\n            text-align: center;\n            font-weight: 600;\n        }\n        .practitioner-feedback-wrapper .star-rating-display {\n            text-align: center;\n            margin: 30px 0 10px 0;\n            font-size: 50px;\n        }\n        .practitioner-feedback-wrapper .star-rating-display i {\n            color: #FFD700;\n        }\n        .practitioner-feedback-wrapper .star-label-display {\n            text-align: center;\n            margin-bottom: 20px;\n        }\n        .practitioner-feedback-wrapper .star-label-display .label-text {\n            font-size: 10px;\n            color: #888888;\n            text-transform: uppercase;\n            letter-spacing: 0.5px;\n            font-weight: 600;\n        }\n        .practitioner-feedback-wrapper .form-group {\n            margin-bottom: 25px;\n        }\n        .practitioner-feedback-wrapper label {\n            font-weight: 600;\n            color: #333;\n            margin-bottom: 8px;\n            display: block;\n        }\n        .practitioner-feedback-wrapper textarea {\n            min-height: 120px;\n        }\n        .practitioner-feedback-wrapper .btn-submit {\n            background-color: #002b49;\n            color: #ffffff;\n            padding: 12px 40px;\n            font-size: 18px;\n            font-weight: bold;\n            border: none;\n            border-radius: 5px;\n            width: 100%;\n            margin-top: 20px;\n        }\n        .practitioner-feedback-wrapper .btn-submit:hover {\n            background-color: #004080;\n            color: #ffffff;\n        }\n        .practitioner-feedback-wrapper .btn-submit:disabled {\n            background-color: #cccccc;\n            cursor: not-allowed;\n        }\n        .practitioner-feedback-wrapper .loading {\n            display: none;\n            text-align: center;\n            margin-top: 20px;\n        }\n        .practitioner-feedback-wrapper .error-message {\n            color: #dc3545;\n            margin-top: 10px;\n            display: none;\n            padding: 10px;\n            background-color: #f8d7da;\n            border-radius: 4px;\n        }\n        .practitioner-feedback-wrapper .info-message {\n            color: #005eb8;\n            margin-top: 10px;\n            font-size: 14px;\n            text-align: center;\n        }\n        .practitioner-feedback-wrapper .success-message {\n            text-align: center;\n            padding: 20px;\n        }\n        .practitioner-feedback-wrapper .success-message h1 {\n            color: #28a745;\n        }\n        .practitioner-feedback-wrapper .practitioner-display {\n            font-size: 16px;\n            color: #333;\n            padding: 10px 0;\n        }\n        .practitioner-feedback-wrapper .practitioner-display strong {\n            color: #002b49;\n        }\n        \/* Checkbox: force our styles over host page (appearance:none + custom checkmark) *\/\n        .practitioner-feedback-wrapper .form-check {\n            display: flex;\n            align-items: center;\n            min-height: 1.5rem;\n        }\n        .practitioner-feedback-wrapper .form-check-input {\n            width: 1.25rem;\n            height: 1.25rem;\n            margin-top: 0;\n            margin-right: 0.5rem;\n            border: 2px solid #333 !important;\n            border-radius: 0.25rem;\n            flex-shrink: 0;\n            appearance: none !important;\n            -webkit-appearance: none !important;\n            background-color: #fff !important;\n        }\n        .practitioner-feedback-wrapper .form-check-input:checked {\n            background-color: #002b49 !important;\n            border-color: #002b49 !important;\n            background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 16 16' fill='white'%3E%3Cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'\/%3E%3C\/svg%3E\") !important;\n            background-size: 100% 100% !important;\n        }\n        .practitioner-feedback-wrapper .form-check-label {\n            margin-bottom: 0;\n            font-weight: 500;\n            cursor: pointer;\n        }\n    <\/style>\n<script>\n(function (root, factory) {\n  var api = factory(root);\n\n  if (typeof module === \"object\" && module.exports) {\n    module.exports = api;\n  }\n\n  root.SummitQuestionnaireV2 = api;\n\n  \/\/ Expose helper functions as globals so legacy HTML call sites that reference them\n  \/\/ by bare name (e.g. `resolvePublicApiBase(...)`) keep working after the helper is\n  \/\/ inlined into the page. Without this, the IIFE only exposes the api object via\n  \/\/ `window.SummitQuestionnaireV2`, which causes a ReferenceError in code paths that\n  \/\/ do not use the defensive `window.SummitQuestionnaireV2 && ...` pattern.\n  if (api && typeof api === \"object\") {\n    var _helperExports = [\n      \"resolveStage\",\n      \"resolveApiBase\",\n      \"resolvePublicApiBase\",\n      \"rewriteUrl\",\n      \"rewriteLegacyUrl\",\n      \"rewriteManagedTargets\",\n      \"attachManagedForms\",\n    ];\n    for (var _i = 0; _i < _helperExports.length; _i++) {\n      var _name = _helperExports[_i];\n      if (typeof api[_name] === \"function\" &#038;&#038; typeof root[_name] !== \"function\") {\n        root[_name] = api[_name];\n      }\n    }\n  }\n})(typeof globalThis !== \"undefined\" ? globalThis : this, function (root) {\n  var PROD_BASE = \"https:\/\/api.ascentemr.com\/v2\";\n  var DEV_BASE = \"https:\/\/dev.ascentemr.com\/v2\";\n  var STAGING_BASE = \"https:\/\/staging.ascentemr.com\/v2\";\n  var LOCAL_BASE = \"http:\/\/localhost:4010\/dev\/v2\";\n  var DOM_READY_EVENTS = [\"DOMContentLoaded\", \"load\"];\n\n  function asSearchParams(input) {\n    if (typeof URLSearchParams === \"undefined\") {\n      return {\n        get: function () {\n          return null;\n        },\n      };\n    }\n\n    if (!input &#038;&#038; root.location &#038;&#038; typeof root.location.search === \"string\") {\n      return new URLSearchParams(root.location.search);\n    }\n\n    if (input instanceof URLSearchParams) {\n      return input;\n    }\n\n    if (typeof input === \"string\") {\n      return new URLSearchParams(input.charAt(0) === \"?\" ? input.slice(1) : input);\n    }\n\n    if (input &#038;&#038; typeof input === \"object\" &#038;&#038; typeof input.toString === \"function\") {\n      return new URLSearchParams(String(input));\n    }\n\n    return new URLSearchParams(\"\");\n  }\n\n  function normalize(value) {\n    return String(value || \"\").trim().toLowerCase();\n  }\n\n  function currentOrigin() {\n    if (root.location &#038;&#038; typeof root.location.origin === \"string\" &#038;&#038; root.location.origin) {\n      return root.location.origin.replace(\/\\\/$\/, \"\");\n    }\n    if (typeof URL !== \"undefined\" &#038;&#038; root.location &#038;&#038; typeof root.location.href === \"string\") {\n      try {\n        return new URL(root.location.href).origin.replace(\/\\\/$\/, \"\");\n      } catch (_error) {}\n    }\n    return \"\";\n  }\n\n  function canUseSameOriginApi() {\n    var hostname = normalize(root.location &#038;&#038; root.location.hostname);\n    if (!hostname) {\n      return false;\n    }\n\n    return (\n      hostname === \"localhost\" ||\n      hostname === \"127.0.0.1\" ||\n      hostname === \"::1\" ||\n      hostname === \"dev.ascent.summithealth.ca\" ||\n      hostname === \"ascent.summithealth.ca\" ||\n      hostname.indexOf(\".vercel.app\") >= 0\n    );\n  }\n\n  function isProductionWordpressHost() {\n    var hostname = normalize(root.location && root.location.hostname);\n    if (!hostname) {\n      return false;\n    }\n    if (\n      hostname.indexOf(\"dev.\") === 0 ||\n      hostname.indexOf(\"dev-\") === 0 ||\n      hostname.indexOf(\"staging.\") === 0 ||\n      hostname.indexOf(\"staging-\") === 0 ||\n      hostname.indexOf(\".staging.\") >= 0 ||\n      hostname.indexOf(\".vercel.app\") >= 0\n    ) {\n      return false;\n    }\n\n    return (\n      hostname === \"dormalab.com\" ||\n      hostname === \"www.dormalab.com\" ||\n      hostname === \"summithealth.ca\" ||\n      hostname === \"www.summithealth.ca\" ||\n      hostname === \"cliniquevoyageur.ca\" ||\n      hostname === \"www.cliniquevoyageur.ca\"\n    );\n  }\n\n  function resolveStage(searchLike) {\n    var params = asSearchParams(searchLike);\n    var requestedStage = normalize(params.get(\"stage\"));\n    var testMode = normalize(params.get(\"test\"));\n    var hostname = normalize(root.location && root.location.hostname);\n\n    if (requestedStage === \"local\" || testMode === \"true\") {\n      return \"local\";\n    }\n    if (requestedStage === \"dev\") {\n      return \"dev\";\n    }\n    if (requestedStage === \"staging\") {\n      return \"staging\";\n    }\n    if (requestedStage === \"prod\" || requestedStage === \"production\") {\n      return \"prod\";\n    }\n\n    if (!hostname || hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\") {\n      return \"local\";\n    }\n    if (\n      hostname === \"staging.ascentemr.com\" ||\n      hostname.indexOf(\"staging.\") === 0 ||\n      hostname.indexOf(\"staging-\") === 0 ||\n      hostname.indexOf(\".staging.\") >= 0\n    ) {\n      return \"staging\";\n    }\n    if (\n      hostname === \"dev.ascentemr.com\" ||\n      hostname === \"dev.ascent.summithealth.ca\" ||\n      hostname.indexOf(\"dev.\") === 0 ||\n      hostname.indexOf(\"dev-\") === 0 ||\n      hostname.indexOf(\".vercel.app\") >= 0\n    ) {\n      return \"dev\";\n    }\n\n    return \"prod\";\n  }\n\n  function resolveApiBase(searchLike) {\n    var stage = resolveStage(searchLike);\n\n    if (isProductionWordpressHost()) {\n      return PROD_BASE;\n    }\n    if (canUseSameOriginApi()) {\n      return currentOrigin() + \"\/api\/v2\";\n    }\n    if (stage === \"local\") {\n      return LOCAL_BASE;\n    }\n    if (stage === \"dev\") {\n      return DEV_BASE;\n    }\n    if (stage === \"staging\") {\n      return STAGING_BASE;\n    }\n\n    return currentOrigin() ? currentOrigin() + \"\/api\/v2\" : DEV_BASE;\n  }\n\n  function resolvePublicApiBase(searchLike) {\n    return resolveApiBase(searchLike).replace(\/\\\/$\/, \"\") + \"\/public\";\n  }\n\n  function startsWith(value, prefix) {\n    return String(value || \"\").slice(0, prefix.length) === prefix;\n  }\n\n  function isAscentApiHost(host) {\n    var normalizedHost = normalize(host);\n    return (\n      normalizedHost === \"api.ascentemr.com\" ||\n      normalizedHost === \"dev.ascentemr.com\" ||\n      normalizedHost === \"staging.ascentemr.com\" ||\n      normalizedHost === \"api.summittravelhealthdev.com\" ||\n      normalizedHost === \"dev.summittravelhealthdev.com\" ||\n      normalizedHost === \"staging.summittravelhealthdev.com\" ||\n      normalizedHost.indexOf(\"localhost:3000\") === 0 ||\n      normalizedHost.indexOf(\"127.0.0.1:3000\") === 0 ||\n      normalizedHost.indexOf(\"localhost:4010\") === 0 ||\n      normalizedHost.indexOf(\"127.0.0.1:4010\") === 0\n    );\n  }\n\n  function normalizePublicPath(pathname) {\n    var normalized = String(pathname || \"\");\n    if (!normalized) {\n      return \"\/public\";\n    }\n\n    if (startsWith(normalized, \"\/public\")) {\n      return normalized;\n    }\n    if (startsWith(normalized, \"\/v2\/public\")) {\n      return normalized.slice(3);\n    }\n    if (startsWith(normalized, \"\/dev\/v2\/public\")) {\n      return normalized.slice(7);\n    }\n    if (startsWith(normalized, \"\/dev\/v2\/\")) {\n      return \"\/public\" + normalized.slice(7);\n    }\n    if (startsWith(normalized, \"\/dev\")) {\n      return \"\/public\" + normalized.slice(4);\n    }\n    if (startsWith(normalized, \"\/v2\/\")) {\n      return \"\/public\" + normalized.slice(3);\n    }\n\n    return normalized;\n  }\n\n  function shouldRewriteUrl(parsed, rawUrl) {\n    var pathname = String(parsed && parsed.pathname || \"\");\n    if (\n      startsWith(pathname, \"\/public\") ||\n      startsWith(pathname, \"\/v2\/public\") ||\n      startsWith(pathname, \"\/dev\/v2\/public\") ||\n      startsWith(pathname, \"\/dev\") ||\n      startsWith(pathname, \"\/v2\/\")\n    ) {\n      var rawValue = String(rawUrl || \"\");\n      var isRelative =\n        startsWith(rawValue, \"\/\") ||\n        startsWith(rawValue, \".\/\") ||\n        startsWith(rawValue, \"..\/\");\n      return isRelative || isAscentApiHost(parsed.host) || normalize(parsed.host) === normalize(root.location && root.location.host);\n    }\n\n    return false;\n  }\n\n  function rewriteUrl(rawUrl, searchLike) {\n    var value = String(rawUrl || \"\");\n    if (!value || typeof URL === \"undefined\") {\n      return value;\n    }\n\n    try {\n      var parsed = new URL(value, root.location && root.location.href ? root.location.href : undefined);\n      if (!shouldRewriteUrl(parsed, value)) {\n        return value;\n      }\n\n      var apiBase = resolveApiBase(searchLike);\n      var normalizedPath = normalizePublicPath(parsed.pathname);\n\n      return apiBase.replace(\/\\\/$\/, \"\") + normalizedPath + parsed.search + parsed.hash;\n    } catch (_error) {\n      return value;\n    }\n  }\n\n  function patchFetch() {\n    if (typeof root.fetch !== \"function\" || root.fetch.__summitQuestionnaireV2Patched) {\n      return;\n    }\n\n    var originalFetch = root.fetch.bind(root);\n\n    var patchedFetch = function (input, init) {\n      if (typeof Request !== \"undefined\" && input instanceof Request) {\n        var rewrittenRequestUrl = rewriteUrl(input.url);\n        if (rewrittenRequestUrl !== input.url) {\n          input = new Request(rewrittenRequestUrl, input);\n        }\n      } else if (typeof input === \"string\" || (typeof URL !== \"undefined\" && input instanceof URL)) {\n        input = rewriteUrl(String(input));\n      }\n\n      return originalFetch(input, init);\n    };\n\n    patchedFetch.__summitQuestionnaireV2Patched = true;\n    root.fetch = patchedFetch;\n  }\n\n  function patchXmlHttpRequest() {\n    if (\n      typeof XMLHttpRequest === \"undefined\" ||\n      !XMLHttpRequest.prototype ||\n      XMLHttpRequest.prototype.open.__summitQuestionnaireV2Patched\n    ) {\n      return;\n    }\n\n    var originalOpen = XMLHttpRequest.prototype.open;\n    XMLHttpRequest.prototype.open = function (method, url) {\n      var rewrittenUrl = rewriteUrl(url);\n      return originalOpen.apply(this, [method, rewrittenUrl].concat([].slice.call(arguments, 2)));\n    };\n    XMLHttpRequest.prototype.open.__summitQuestionnaireV2Patched = true;\n  }\n\n  function rewriteManagedTargets(documentLike) {\n    var doc = documentLike || root.document;\n    if (!doc || typeof doc.querySelectorAll !== \"function\") {\n      return;\n    }\n\n    doc.querySelectorAll(\"form[action], a[href]\").forEach(function (element) {\n      var attributeName = element.tagName === \"FORM\" ? \"action\" : \"href\";\n      var currentValue = element.getAttribute(attributeName);\n      var rewrittenValue = rewriteUrl(currentValue);\n      if (rewrittenValue && rewrittenValue !== currentValue) {\n        element.setAttribute(attributeName, rewrittenValue);\n      }\n    });\n  }\n\n  function getRecaptchaSiteKey(form) {\n    if (!form || !form.querySelector) {\n      return null;\n    }\n\n    var localWidget = form.querySelector(\".g-recaptcha[data-sitekey]\");\n    if (localWidget) {\n      return localWidget.getAttribute(\"data-sitekey\");\n    }\n\n    var globalWidget =\n      root.document && root.document.querySelector(\".g-recaptcha[data-sitekey]\");\n    return globalWidget ? globalWidget.getAttribute(\"data-sitekey\") : null;\n  }\n\n  function collectFormPayload(form) {\n    var payload = {};\n    var formData = new FormData(form);\n\n    formData.forEach(function (value, key) {\n      if (payload[key] !== undefined) {\n        if (!Array.isArray(payload[key])) {\n          payload[key] = [payload[key]];\n        }\n        payload[key].push(value);\n        return;\n      }\n\n      payload[key] = value;\n    });\n\n    payload.formKey = form.getAttribute(\"data-v2-form-key\") || \"\";\n    payload.pageUrl = root.location ? root.location.href : \"\";\n    payload.recaptchaToken =\n      payload.recaptchaToken ||\n      payload[\"g-recaptcha-response\"] ||\n      \"\";\n    payload.recaptchaSiteKey = payload.recaptchaSiteKey || getRecaptchaSiteKey(form);\n\n    return payload;\n  }\n\n  function ensureStatusElement(form, kind) {\n    var attributeName = kind === \"error\" ? \"data-v2-form-error\" : \"data-v2-form-success\";\n    var existing = form.querySelector(\"[\" + attributeName + \"]\");\n    if (existing) {\n      return existing;\n    }\n\n    var element = root.document.createElement(\"div\");\n    element.setAttribute(attributeName, \"true\");\n    element.style.display = \"none\";\n    element.style.marginBottom = \"12px\";\n    element.style.padding = \"12px\";\n    element.style.borderRadius = \"4px\";\n    element.style.fontSize = \"14px\";\n    element.style.background = kind === \"error\" ? \"#fbe9e7\" : \"#e8f5e9\";\n    element.style.color = kind === \"error\" ? \"#b71c1c\" : \"#1b5e20\";\n    form.insertBefore(element, form.firstChild);\n    return element;\n  }\n\n  function setStatusMessage(form, kind, message) {\n    var element = ensureStatusElement(form, kind);\n    element.textContent = message || \"\";\n    element.style.display = message ? \"block\" : \"none\";\n  }\n\n  function disableSubmitButtons(form, disabled) {\n    var buttons = form.querySelectorAll(\"button[type=submit], input[type=submit]\");\n    buttons.forEach(function (button) {\n      button.disabled = Boolean(disabled);\n    });\n  }\n\n  async function submitManagedForm(form) {\n    var payload = collectFormPayload(form);\n    var action = rewriteUrl(form.getAttribute(\"action\"));\n    var response = await root.fetch(action, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application\/json\",\n      },\n      body: JSON.stringify(payload),\n    });\n\n    var contentType = String(response.headers && response.headers.get && response.headers.get(\"content-type\") || \"\");\n    var data =\n      contentType.indexOf(\"application\/json\") >= 0\n        ? await response.json()\n        : { success: response.ok, message: await response.text() };\n\n    if (!response.ok || data.success === false) {\n      throw new Error(data.error || data.message || \"Form submission failed.\");\n    }\n\n    return data;\n  }\n\n  function attachFormHandler(form) {\n    if (!form || form.__summitQuestionnaireV2Attached) {\n      return;\n    }\n\n    form.__summitQuestionnaireV2Attached = true;\n    form.addEventListener(\"submit\", async function (event) {\n      event.preventDefault();\n\n      if (form.__summitQuestionnaireV2Submitting) {\n        return;\n      }\n\n      if (typeof form.checkValidity === \"function\" && !form.checkValidity()) {\n        if (typeof form.reportValidity === \"function\") {\n          form.reportValidity();\n        }\n        return;\n      }\n\n      form.__summitQuestionnaireV2Submitting = true;\n      setStatusMessage(form, \"error\", \"\");\n      setStatusMessage(form, \"success\", \"\");\n      disableSubmitButtons(form, true);\n\n      try {\n        var result = await submitManagedForm(form);\n        var redirectUrl = result.redirectUrl || collectFormPayload(form).retURL;\n\n        if (redirectUrl && root.location && typeof root.location.assign === \"function\") {\n          root.location.assign(redirectUrl);\n          return;\n        }\n\n        setStatusMessage(form, \"success\", \"Votre formulaire a ete soumis avec succes.\");\n      } catch (error) {\n        setStatusMessage(form, \"error\", error && error.message ? error.message : \"Le formulaire n'a pas pu etre soumis.\");\n        if (root.console && typeof root.console.error === \"function\") {\n          root.console.error(\"SummitQuestionnaireV2 form submission failed\", error);\n        }\n      } finally {\n        disableSubmitButtons(form, false);\n        form.__summitQuestionnaireV2Submitting = false;\n      }\n    });\n  }\n\n  function attachManagedForms(documentLike) {\n    var doc = documentLike || root.document;\n    if (!doc || typeof doc.querySelectorAll !== \"function\") {\n      return;\n    }\n\n    var managedForms = doc.querySelectorAll(\"form[data-v2-form-key]\");\n    managedForms.forEach(attachFormHandler);\n  }\n\n  function bootstrap() {\n    patchFetch();\n    patchXmlHttpRequest();\n\n    if (!root.document || typeof root.document.addEventListener !== \"function\") {\n      return;\n    }\n\n    rewriteManagedTargets(root.document);\n    attachManagedForms(root.document);\n    DOM_READY_EVENTS.forEach(function (eventName) {\n      root.document.addEventListener(eventName, function () {\n        rewriteManagedTargets(root.document);\n        attachManagedForms(root.document);\n      });\n    });\n\n    root.document.addEventListener(\"submit\", function (event) {\n      var form = event && event.target;\n      if (form && typeof form.getAttribute === \"function\") {\n        var currentAction = form.getAttribute(\"action\");\n        var rewrittenAction = rewriteUrl(currentAction);\n        if (rewrittenAction && rewrittenAction !== currentAction) {\n          form.setAttribute(\"action\", rewrittenAction);\n        }\n      }\n    }, true);\n  }\n\n  bootstrap();\n\n  return {\n    resolveStage: resolveStage,\n    resolveApiBase: resolveApiBase,\n    resolvePublicApiBase: resolvePublicApiBase,\n    rewriteUrl: rewriteUrl,\n    rewriteLegacyUrl: rewriteUrl,\n    rewriteManagedTargets: rewriteManagedTargets,\n    attachManagedForms: attachManagedForms,\n    bootstrap: bootstrap,\n  };\n});\n<\/script>\n<\/head>\n<body>\n    <div class=\"practitioner-feedback-wrapper\">\n        <div class=\"feedback-container\">\n        <h1 id=\"pageTitle\">Partagez vos commentaires<\/h1>\n\n        <form id=\"feedbackForm\">\n            <input type=\"hidden\" id=\"appointmentId\" name=\"appointmentId\">\n            <input type=\"hidden\" id=\"rating\" name=\"rating\">\n\n            <div class=\"form-group\">\n                <div id=\"practitionerName\" class=\"practitioner-display\">\n                    <strong>Praticien:<\/strong> <span id=\"practitionerNameText\">Chargement&#8230;<\/span>\n                <\/div>\n            <\/div>\n\n            <div class=\"form-group\">\n                <label>Votre \u00e9valuation<\/label>\n                <div class=\"star-rating-display\" id=\"starRatingDisplay\">\n                    <!-- Stars will be populated by JavaScript -->\n                <\/div>\n                <div class=\"star-label-display\" id=\"starLabelDisplay\">\n                    <!-- Label will be populated by JavaScript -->\n                <\/div>\n                <div class=\"info-message\" id=\"ratingInfo\"><\/div>\n            <\/div>\n\n            <div class=\"form-group\" id=\"commentsGroup\">\n                <label for=\"comments\">Commentaires<\/label>\n                <textarea class=\"form-control\" id=\"comments\" name=\"comments\" rows=\"5\" placeholder=\"Veuillez partager vos r\u00e9flexions sur votre exp\u00e9rience...\"><\/textarea>\n            <\/div>\n\n            <div class=\"form-group\" id=\"contactGroup\">\n                <div class=\"form-check\">\n                    <input class=\"form-check-input\" type=\"checkbox\" id=\"canContact\" name=\"canContact\">\n                    <label class=\"form-check-label\" for=\"canContact\">\n                        Pouvons-nous vous contacter pour faire un suivi sur vos commentaires?\n                    <\/label>\n                <\/div>\n            <\/div>\n\n            <button type=\"submit\" class=\"btn btn-submit\" id=\"submitBtn\">Soumettre les commentaires<\/button>\n\n            <div class=\"loading\" id=\"loading\">\n                <i class=\"fas fa-spinner fa-spin\"><\/i> Envoi en cours&#8230;\n            <\/div>\n\n            <div class=\"error-message\" id=\"errorMessage\"><\/div>\n        <\/form>\n        <\/div>\n    <\/div>\n\n    <script>\n        \/\/ Dorma flow: always use dormaGooglePlaceId for visit and submit\n        const USE_DORMA_GOOGLE_PLACE = true;\n\n        \/\/ Detect if running locally\n        const isLocal = window.location.hostname === 'localhost' ||\n                       window.location.hostname === '127.0.0.1' ||\n                       window.location.hostname === '';\n\n        const API_BASE_URL = resolvePublicApiBase(window.location.search).replace(\/\\\/$\/, '');\n\n        $(document).ready(function() {\n            \/\/ Get URL parameters (case-insensitive check)\n            const urlParams = new URLSearchParams(window.location.search);\n            const appointmentId = urlParams.get('appointmentId');\n            const rating = parseInt(urlParams.get('Rating') || urlParams.get('rating'));\n\n            if (!appointmentId) {\n                $('.practitioner-feedback-wrapper').html(`\n                    <div class=\"error-container\" style=\"text-align: center; padding: 40px;\">\n                        <h1 style=\"color: #dc3545; margin-bottom: 20px;\">D\u00e9sol\u00e9, nous rencontrons un probl\u00e8me en ce moment<\/h1>\n                        <p style=\"color: #666; font-size: 16px;\">Veuillez r\u00e9essayer plus tard ou contacter le support si le probl\u00e8me persiste.<\/p>\n                    <\/div>\n                `);\n                return;\n            }\n\n            if (!rating || rating < 1 || rating > 5) {\n                $('#errorMessage').text('Lien de commentaires invalide. Veuillez utiliser le lien de votre courriel.').show();\n                $('#feedbackForm').hide();\n                return;\n            }\n\n            $('#appointmentId').val(appointmentId);\n            $('#rating').val(rating);\n\n            \/\/ Display the selected rating with label\n            const ratingLabels = ['', 'Terrible', 'M\u00e9diocre', 'Moyen', 'Bon', 'Excellent'];\n            let starsHtml = '';\n            for (let i = 1; i <= 5; i++) {\n                if (i <= rating) {\n                    starsHtml += '<i class=\"fas fa-star\"><\/i>';\n                } else {\n                    starsHtml += '<i class=\"far fa-star\"><\/i>';\n                }\n            }\n            $('#starRatingDisplay').html(starsHtml);\n            $('#starLabelDisplay').html('<span class=\"label-text\">' + ratingLabels[rating] + '<\/span>');\n\n            \/\/ Load appointment details and practitioner info (with Dorma Google Place)\n            loadAppointmentDetails(appointmentId, rating);\n\n            \/\/ Auto-save feedback when page loads (with useDormaGooglePlace)\n            autoSaveFeedback(appointmentId, rating);\n\n            \/\/ Show\/hide form fields based on rating\n            if (rating >= 4) {\n                $('#commentsGroup').hide();\n                $('#contactGroup').hide();\n            } else {\n                $('#ratingInfo').text('Nous appr\u00e9cions vos commentaires. Veuillez nous aider \u00e0 nous am\u00e9liorer en partageant plus de d\u00e9tails.');\n            }\n\n            \/\/ Form submission (saves with useDormaGooglePlace so redirect uses dormaGooglePlaceId)\n            $('#feedbackForm').on('submit', function(e) {\n                e.preventDefault();\n\n                const formData = {\n                    appointmentId: $('#appointmentId').val(),\n                    rating: parseInt($('#rating').val()),\n                    comments: $('#comments').val() || '',\n                    canContact: $('#canContact').is(':checked'),\n                    pageUrl: window.location.href,\n                    useDormaGooglePlace: USE_DORMA_GOOGLE_PLACE\n                };\n\n                $('#submitBtn').prop('disabled', true);\n                $('#loading').show();\n                $('#errorMessage').hide();\n\n                const submitUrl = `${API_BASE_URL}\/feedback\/submit`;\n                $.ajax({\n                    url: submitUrl,\n                    method: 'POST',\n                    contentType: 'application\/json',\n                    data: JSON.stringify(formData),\n                    success: function(response) {\n                        if (formData.rating >= 4) {\n                            if (response.googleReviewUrl) {\n                                window.location.href = response.googleReviewUrl;\n                            } else {\n                                $('#submitBtn').prop('disabled', false);\n                                $('#loading').hide();\n                                $('#errorMessage').text('Impossible de rediriger vers l\\'avis Google. Veuillez contacter le support.').show();\n                            }\n                        } else {\n                            $('.practitioner-feedback-wrapper').html(`\n                                <div class=\"success-message\">\n                                    <h1>Merci!<\/h1>\n                                    <p>Merci pour vos commentaires. Nous appr\u00e9cions que vous preniez le temps de partager votre exp\u00e9rience avec nous.<\/p>\n                                    <p>Nous examinerons vos commentaires et travaillerons \u00e0 am\u00e9liorer nos services.<\/p>\n                                <\/div>\n                            `);\n                        }\n                    },\n                    error: function(xhr, status, error) {\n                        $('#submitBtn').prop('disabled', false);\n                        $('#loading').hide();\n                        let errorMsg = 'Une erreur s\\'est produite. Veuillez r\u00e9essayer.';\n                        if (xhr.responseJSON && xhr.responseJSON.error) {\n                            errorMsg = xhr.responseJSON.error;\n                        } else if (xhr.status === 0) {\n                            errorMsg = 'Impossible de se connecter au serveur. Veuillez v\u00e9rifier votre connexion et r\u00e9essayer.';\n                        }\n                        $('#errorMessage').text(errorMsg).show();\n                    }\n                });\n            });\n        });\n\n        function autoSaveFeedback(appointmentId, rating) {\n            const formData = {\n                appointmentId: appointmentId,\n                rating: parseInt(rating),\n                comments: '',\n                canContact: false,\n                pageUrl: window.location.href,\n                useDormaGooglePlace: USE_DORMA_GOOGLE_PLACE\n            };\n\n            $.ajax({\n                url: `${API_BASE_URL}\/feedback\/submit`,\n                method: 'POST',\n                contentType: 'application\/json',\n                data: JSON.stringify(formData),\n                success: function(response) {},\n                error: function(xhr, status, error) {}\n            });\n        }\n\n        function loadAppointmentDetails(appointmentId, rating) {\n            const url = `${API_BASE_URL}\/feedback\/appointment\/${appointmentId}?dorma=1`;\n            $.ajax({\n                url: url,\n                method: 'GET',\n                success: function(response) {\n                    const practitionerName = response.practitionerName || 'Non disponible';\n                    if (practitionerName !== 'Non disponible') {\n                        $('#practitionerNameText').text(practitionerName);\n                        $('#practitionerName').show();\n                    } else {\n                        $('#practitionerName').hide();\n                    }\n\n                    if (rating >= 4) {\n                        const starText = rating === 5 ? '5 \u00e9toiles' : '4 \u00e9toiles';\n                        $('#pageTitle').text(`Merci pour les ${starText}!`);\n\n                        if (practitionerName !== 'Non disponible') {\n                            $('#ratingInfo').html(`\n                                <p style=\"margin-bottom: 15px;\">Nous sommes ravis que vous ayez eu une excellente exp\u00e9rience avec <strong>${practitionerName}<\/strong>. Pourriez-vous prendre 10 secondes pour rendre cet avis public? Cela aide d'autres patients \u00e0 nous trouver.<\/p>\n                                <p style=\"font-size: 12px; color: #666; font-style: italic; margin-top: 10px;\">Note: Google vous demandera de re-s\u00e9lectionner les \u00e9toiles sur l'\u00e9cran suivant.<\/p>\n                            `);\n                        } else {\n                            $('#ratingInfo').html(`\n                                <p style=\"margin-bottom: 15px;\">Nous sommes ravis que vous ayez eu une excellente exp\u00e9rience. Pourriez-vous prendre 10 secondes pour rendre cet avis public? Cela aide d'autres patients \u00e0 nous trouver.<\/p>\n                                <p style=\"font-size: 12px; color: #666; font-style: italic; margin-top: 10px;\">Note: Google vous demandera de re-s\u00e9lectionner les \u00e9toiles sur l'\u00e9cran suivant.<\/p>\n                            `);\n                        }\n                        $('#submitBtn').text('Publier mon avis');\n                    }\n                },\n                error: function(xhr, status, error) {\n                    $('#practitionerNameText').text('Non disponible');\n\n                    if (rating >= 4) {\n                        const starText = rating === 5 ? '5 \u00e9toiles' : '4 \u00e9toiles';\n                        $('#pageTitle').text(`Merci pour les ${starText}!`);\n                        $('#ratingInfo').html(`\n                            <p style=\"margin-bottom: 15px;\">Nous sommes ravis que vous ayez eu une excellente exp\u00e9rience. Pourriez-vous prendre 10 secondes pour rendre cet avis public? Cela aide d'autres patients \u00e0 nous trouver.<\/p>\n                            <p style=\"font-size: 12px; color: #666; font-style: italic; margin-top: 10px;\">Note: Google vous demandera de re-s\u00e9lectionner les \u00e9toiles sur l'\u00e9cran suivant.<\/p>\n                        `);\n                        $('#submitBtn').text('Publier mon avis');\n                    }\n                }\n            });\n        }\n    <\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Partagez vos commentaires Partagez vos commentaires Praticien: Chargement&#8230; Votre \u00e9valuation Commentaires Pouvons-nous vous contacter pour faire un suivi sur vos commentaires? Soumettre les commentaires Envoi en cours&#8230;<\/p>\n","protected":false},"author":22,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-42550","page","type-page","status-publish"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Commentaires sur le praticien - Dorma Sleep Clinics<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dormalab.com\/fr\/commentaires-sur-le-praticien\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Commentaires sur le praticien - Dorma Sleep Clinics\" \/>\n<meta property=\"og:description\" content=\"Partagez vos commentaires Partagez vos commentaires Praticien: Chargement&#8230; Votre \u00e9valuation Commentaires Pouvons-nous vous contacter pour faire un suivi sur vos commentaires? Soumettre les commentaires Envoi en cours&#8230;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dormalab.com\/fr\/commentaires-sur-le-praticien\/\" \/>\n<meta property=\"og:site_name\" content=\"Dorma Sleep Clinics\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-27T12:54:34+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/commentaires-sur-le-praticien\\\/\",\"url\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/commentaires-sur-le-praticien\\\/\",\"name\":\"Commentaires sur le praticien - Dorma Sleep Clinics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#website\"},\"datePublished\":\"2026-02-10T00:39:48+00:00\",\"dateModified\":\"2026-06-27T12:54:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/commentaires-sur-le-praticien\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dormalab.com\\\/fr\\\/commentaires-sur-le-praticien\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/commentaires-sur-le-praticien\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Commentaires sur le praticien\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/\",\"name\":\"Dorma Sleep Clinics\",\"description\":\"Sleep Well Live Well\",\"publisher\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#organization\",\"name\":\"Dorma Clinique Du Sommeil\",\"url\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/dormalab.com\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png\",\"contentUrl\":\"https:\\\/\\\/dormalab.com\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png\",\"width\":120,\"height\":25,\"caption\":\"Dorma Clinique Du Sommeil\"},\"image\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Commentaires sur le praticien - Dorma Sleep Clinics","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dormalab.com\/fr\/commentaires-sur-le-praticien\/","og_locale":"fr_FR","og_type":"article","og_title":"Commentaires sur le praticien - Dorma Sleep Clinics","og_description":"Partagez vos commentaires Partagez vos commentaires Praticien: Chargement&#8230; Votre \u00e9valuation Commentaires Pouvons-nous vous contacter pour faire un suivi sur vos commentaires? Soumettre les commentaires Envoi en cours&#8230;","og_url":"https:\/\/dormalab.com\/fr\/commentaires-sur-le-praticien\/","og_site_name":"Dorma Sleep Clinics","article_modified_time":"2026-06-27T12:54:34+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/dormalab.com\/fr\/commentaires-sur-le-praticien\/","url":"https:\/\/dormalab.com\/fr\/commentaires-sur-le-praticien\/","name":"Commentaires sur le praticien - Dorma Sleep Clinics","isPartOf":{"@id":"https:\/\/dormalab.com\/fr\/#website"},"datePublished":"2026-02-10T00:39:48+00:00","dateModified":"2026-06-27T12:54:34+00:00","breadcrumb":{"@id":"https:\/\/dormalab.com\/fr\/commentaires-sur-le-praticien\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dormalab.com\/fr\/commentaires-sur-le-praticien\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/dormalab.com\/fr\/commentaires-sur-le-praticien\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/dormalab.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Commentaires sur le praticien"}]},{"@type":"WebSite","@id":"https:\/\/dormalab.com\/fr\/#website","url":"https:\/\/dormalab.com\/fr\/","name":"Dorma Sleep Clinics","description":"Sleep Well Live Well","publisher":{"@id":"https:\/\/dormalab.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dormalab.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/dormalab.com\/fr\/#organization","name":"Dorma Clinique Du Sommeil","url":"https:\/\/dormalab.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/dormalab.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/dormalab.com\/wp-content\/uploads\/2019\/10\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png","contentUrl":"https:\/\/dormalab.com\/wp-content\/uploads\/2019\/10\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png","width":120,"height":25,"caption":"Dorma Clinique Du Sommeil"},"image":{"@id":"https:\/\/dormalab.com\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages\/42550","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/comments?post=42550"}],"version-history":[{"count":6,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages\/42550\/revisions"}],"predecessor-version":[{"id":42947,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages\/42550\/revisions\/42947"}],"wp:attachment":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/media?parent=42550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}