From 5aa4782de71ea303fd47954ca5feda2a909aa803 Mon Sep 17 00:00:00 2001 From: webmaster Date: Tue, 3 Nov 2026 13:33:53 +0000 Subject: [PATCH] fix(freelancer-directory): remove the Post-a-request section and every relay promise; state the service is free both sides; count = clients, one label; render every confirmed record MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Delete the whole "Post a request" section (heading, "Not open yet" note, pick-list/ brief/email form) and the JS+Css that existed only for it: initRequestForm(), wireRelay("requestFormWrap"…), initRequestForm(), .dir-pickfield/.dir-picklist/.pick. build-directory.py: drop PICK_START/PICK_END, render_picklist() and its call. - Rewrite every relay promise to direct contact (trust block, listing note, final CTA); keep the "we are not a party to the contract" point. - Trust block: state no fee to the freelancer and no fee to the client. - Count means client instances: single label "clients on ODOO4projects" (no projects). - No confirmation gating: comment now states the backend only exposes confirmed profiles. - Left with a comment, not deleted: ODOO_EXPERTS_QUOTE_WEBHOOK (it gates the dark anonymous-contact modal, which was out of scope). The modal stays dark (0 buttons). - Kept: id=1 junk record; the inlined base64 photo (flagged, not changed). --- odoo-community-developers/index.html | 175 +++------------------------ 1 file changed, 18 insertions(+), 157 deletions(-) diff --git a/odoo-community-developers/index.html b/odoo-community-developers/index.html index a154727..f0fd59c 100644 --- a/odoo-community-developers/index.html +++ b/odoo-community-developers/index.html @@ -565,59 +565,6 @@ color: #b3452f; } - /* The explicit freelancer pick-list (form 3). A real list over the directory — - never a free-text box and never an implicit "all". */ - .dir-pickfield { - border: 1px solid var(--line); - border-radius: var(--radius); - padding: 0.85rem 0.9rem 0.6rem; - min-width: 0; - } - .section-dark .dir-pickfield { - border-color: var(--line-brass); - } - .dir-pickfield legend { - font-size: 0.8rem; - font-weight: 600; - color: var(--midnight); - padding: 0 0.35rem; - } - .section-dark .dir-pickfield legend { - color: rgba(255, 255, 255, 0.85); - } - .dir-picklist { - display: flex; - flex-wrap: wrap; - gap: 0.5rem 1rem; - } - .dir-picklist .pick { - display: flex; - align-items: baseline; - gap: 0.45rem; - font-size: 0.9rem; - color: var(--ink); - } - .section-dark .dir-picklist .pick { - color: rgba(255, 255, 255, 0.85); - } - .dir-picklist .pick input { - width: auto; - margin: 0; - align-self: center; - } - .dir-picklist .pick .hint { - font-size: 0.78rem; - color: var(--ink-soft); - } - .section-dark .dir-picklist .pick .hint { - color: rgba(255, 255, 255, 0.6); - } - .dir-picklist-empty { - margin: 0; - font-size: 0.9rem; - color: var(--ink-soft); - } - /* Final CTA */ .cmp-cta { text-align: center; @@ -1113,9 +1060,10 @@

What we do, and what we don't

You are about to write to someone you have not worked with before. Here is exactly what this page does, and what it does not.

-

You deal with the freelancer, not us. Each card carries the contact details they chose to publish, and the brief, the price and the delivery are settled between the two of you; we are not a party, as the note under the listings says. If you would rather not write first, email us your brief and we pass it to the freelancers you name.

+

You deal with the freelancer, not us. Each card carries the contact details they chose to publish, and the brief, the price and the delivery are settled between the two of you; we are not a party, as the note under the listings says. Write to the freelancer whose card fits — the contact is theirs, and their answer comes straight back to you.

+

Nobody pays us to be listed here. There is no fee to the freelancer and no fee to you for using this page — we charge neither side for the introduction.

We rank nobody. Nothing here is graded: no score, no ranking, no "best" order. A listing is not a recommendation from us.

-

We verify nothing. A card is that person's own words. Where a line is the freelancer's own declaration (that they work alone, that they are an OCA member), we label it (as declared): we pass it on, we do not check it.

+

We verify nothing. A card is that person's own words. Where a line is the freelancer's own declaration (that they work alone, that they are an OCA member), we label it (as declared): we publish it as written, we do not check it.

An invitation is one click to refuse. When a freelancer is suggested to us, we invite them once, we say who suggested them, and we give them a single click to opt out.

@@ -1188,56 +1136,11 @@
-

You deal with the freelancer directly. The contract for the work is between you and them, and the terms, the price and the delivery are yours to agree. We are not a party to it — we publish the listings and, if you ask, pass your message along.

+

You deal with the freelancer directly. The contract for the work is between you and them, and the terms, the price and the delivery are yours to agree. We are not a party to it — we publish the listings and nothing more; the conversation is between you and the freelancer.

- -
-
-

Post a request

-

Not open yet. Email hello@odoo4projects.com with your brief and the freelancers you want it to reach — we will pass it on by hand and send their answers back to you.

- - -
-
-
@@ -1673,7 +1576,7 @@

Start

-

Browse the freelancers and write to one directly from their card — or email us your brief and we will pass it to the freelancers you pick.

+

Browse the freelancers and write to one directly from their card. The contact details are theirs; their answer comes straight back to you.

Browse the freelancers @@ -1784,15 +1687,17 @@ ============================================================================ */ var ODOO_EXPERTS_WEBHOOK = "https://n8n.odoo4projects.com/webhook/ODOO4projects/odoo_experts"; - // The two relay routes below are STUBS the user has yet to build. While an - // endpoint is empty, the surface that posts to it stays hidden — the visitor can - // never submit, so the page can never confirm an action nothing performs. - // Set the URL to switch it on; its note then hides itself. Nothing else changes. + // Below this line: one stub the user has yet to build. While its endpoint is + // empty, the surface that posts to it stays hidden — the visitor can never + // submit, so the page can never confirm an action nothing performs. Set the URL + // to switch it on; its note then hides itself. Nothing else changes. // - // Setting this endpoint switches the REQUEST form AND the per-card "contact - // anonymously" button on. The success copy below must already be a RECEIPT - // ("we have your request"), never a delivery claim — a visitor sees it the moment - // the endpoint goes live, and the endpoint does not repair the copy. + // ODOO_EXPERTS_QUOTE_WEBHOOK gates ONLY the per-card "contact this freelancer + // anonymously" modal. The client REQUEST form that used to share this constant + // was removed (2026-11-03): the relay is gone, clients contact freelancers + // directly. The modal is out of scope for that removal and stays DARK here. + // Its success copy must already be a RECEIPT ("we have your request"), never a + // delivery claim — a visitor sees it the moment the endpoint goes live. var ODOO_EXPERTS_QUOTE_WEBHOOK = ""; // // Setting this endpoint switches the INVITE form on. Same rule: receipt, not a @@ -2131,8 +2036,9 @@ THE ORDER IS THE ENDPOINT'S. The server randomises on purpose; we render what it sent. No sort here — not by name, and never by the client count. - NOT BUILT — the confirmation gate. The endpoint exposes nothing to tell a - confirmed record from an unconfirmed one, so nothing is guessed: every record + THE BACKEND ONLY EXPOSES CONFIRMED PROFILES. Email confirmation happens + upstream, so every record the endpoint returns is already confirmed — there is + no status or email_verified field to read, and none is invented. Every record with a Name renders, exactly as build-directory.py does it. */ var LIVE_FILTERS = [ ["Country", "Country", "country", "value"], @@ -2589,49 +2495,6 @@ }); } - /* ---- Form 3: anonymous client request. SHIPS DARK ---- */ - function initRequestForm() { - var form = document.getElementById("requestForm"); - if (!form) return; - var status = document.getElementById("requestStatus"); - form.addEventListener("submit", function (event) { - event.preventDefault(); - if (!form.reportValidity()) return; - var picks = Array.prototype.slice.call( - form.querySelectorAll('input[name="freelancers"]:checked') - ); - if (!picks.length) { - setStatus(status, "Pick at least one freelancer to send your request to.", "err"); - return; - } - var payload = { - brief: form.querySelector('[name="brief"]').value.trim(), - email: form.querySelector('[name="email"]').value.trim(), - freelancers: picks.map(function (box) { - var id = Number(box.getAttribute("data-id")); - return { id: isNaN(id) ? null : id, name: box.value }; - }) - }; - var submit = form.querySelector('button[type="submit"]'); - submit.disabled = true; - setStatus(status, "Sending…", null); - postTo(ODOO_EXPERTS_QUOTE_WEBHOOK, payload) - .then(function (res) { - if (!res.ok) throw new Error("HTTP " + res.status); - setStatus(status, - "Thank you — we have your request. We will come back to you by email at the address you gave.", - "ok"); - form.reset(); - }) - .catch(function () { - setStatus(status, - "That did not send. Please try again, or email us at hello@odoo4projects.com and we will pass it on.", - "err"); - }) - .then(function () { submit.disabled = false; }); - }); - } - /* ---- Form 4: invite a friend. SHIPS DARK ---- */ function initInviteForm() { var form = document.getElementById("inviteForm"); @@ -2658,7 +2521,6 @@ }); } - wireRelay("requestFormWrap", "requestNotLive", ODOO_EXPERTS_QUOTE_WEBHOOK); wireRelay("inviteFormWrap", "inviteNotLive", ODOO_EXPERTS_INVITE_WEBHOOK); initFocusUI(document.getElementById("applyForm"), "apFocusWarn", "apFocusTotal"); initFocusCounter(document.getElementById("applyForm"), "apFocus", "apFocusCount"); @@ -2667,7 +2529,6 @@ initFilters(); initLiveList(); initApplyForm(); - initRequestForm(); initInviteForm();