From 4d99407e4e6dee00d0532b1e4c191bf162882a7b Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 12 Jan 2024 16:31:52 +0100
Subject: [PATCH 001/282] Install chromatic

---
 front/package-lock.json | 18 ++++++++++++++++++
 front/package.json      |  1 +
 2 files changed, 19 insertions(+)

diff --git a/front/package-lock.json b/front/package-lock.json
index bf459204d9a2..a385a3cf2b6b 100644
--- a/front/package-lock.json
+++ b/front/package-lock.json
@@ -164,6 +164,7 @@
         "babel-plugin-react-intl": "2.4.0",
         "babel-plugin-styled-components": "^2.0.7",
         "chalk": "4.1.2",
+        "chromatic": "^10.2.1",
         "clean-webpack-plugin": "4.0.0",
         "copy-webpack-plugin": "^11.0.0",
         "css-loader": "^6.7.3",
@@ -15210,6 +15211,17 @@
         "node": ">=10"
       }
     },
+    "node_modules/chromatic": {
+      "version": "10.2.1",
+      "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-10.2.1.tgz",
+      "integrity": "sha512-8FU4hcqFkSie+00602fRBl8fSHp2pX452n8eoM1hcvlaTHzMpIDiEV3qrijBuxrc5n+OaKg0HNN550vOZZoQ6w==",
+      "dev": true,
+      "bin": {
+        "chroma": "dist/bin.js",
+        "chromatic": "dist/bin.js",
+        "chromatic-cli": "dist/bin.js"
+      }
+    },
     "node_modules/chrome-trace-event": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
@@ -42066,6 +42078,12 @@
       "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
       "dev": true
     },
+    "chromatic": {
+      "version": "10.2.1",
+      "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-10.2.1.tgz",
+      "integrity": "sha512-8FU4hcqFkSie+00602fRBl8fSHp2pX452n8eoM1hcvlaTHzMpIDiEV3qrijBuxrc5n+OaKg0HNN550vOZZoQ6w==",
+      "dev": true
+    },
     "chrome-trace-event": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
diff --git a/front/package.json b/front/package.json
index 70bf9da69328..550dd6f85685 100644
--- a/front/package.json
+++ b/front/package.json
@@ -205,6 +205,7 @@
     "babel-plugin-react-intl": "2.4.0",
     "babel-plugin-styled-components": "^2.0.7",
     "chalk": "4.1.2",
+    "chromatic": "^10.2.1",
     "clean-webpack-plugin": "4.0.0",
     "copy-webpack-plugin": "^11.0.0",
     "css-loader": "^6.7.3",

From 032756deb8bb1ab69b555502dc1fde2e5da4d044 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 12 Jan 2024 16:41:02 +0100
Subject: [PATCH 002/282] Remove authentication test story

---
 .../Authentication/Authentication.stories.tsx |  52 ---
 front/build-storybook.log                     | 436 ++++++++++++++++++
 front/package.json                            |   2 +-
 3 files changed, 437 insertions(+), 53 deletions(-)
 delete mode 100644 front/app/containers/Authentication/Authentication.stories.tsx
 create mode 100644 front/build-storybook.log

diff --git a/front/app/containers/Authentication/Authentication.stories.tsx b/front/app/containers/Authentication/Authentication.stories.tsx
deleted file mode 100644
index c704f8c0f137..000000000000
--- a/front/app/containers/Authentication/Authentication.stories.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import React from 'react';
-import type { Meta, StoryObj } from '@storybook/react';
-
-// mocking
-import mockEndpoints from 'utils/storybook/mockEndpoints';
-import { loggedOutHandler } from 'api/me/__mocks__/_mockServer';
-
-// component
-import Authentication from '.';
-import { triggerAuthenticationFlow } from './events';
-
-const noop = () => {};
-
-// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
-const meta = {
-  title: 'Example/Authentication',
-  render: (props) => {
-    return (
-      <>
-        <button
-          style={{
-            backgroundColor: '#d3d3d3',
-            padding: '12px',
-            cursor: 'pointer',
-          }}
-          data-testid="open-modal-button"
-          onClick={() => triggerAuthenticationFlow()}
-        >
-          Open auth modal
-        </button>
-        <Authentication {...props} />
-      </>
-    );
-  },
-  parameters: {
-    layout: 'centered',
-  },
-  args: {
-    setModalOpen: noop,
-  },
-} satisfies Meta<typeof Authentication>;
-
-export default meta;
-type Story = StoryObj<typeof meta>;
-
-export const SignUp: Story = {
-  parameters: {
-    msw: mockEndpoints({
-      'GET users/me': loggedOutHandler,
-    }),
-  },
-};
diff --git a/front/build-storybook.log b/front/build-storybook.log
new file mode 100644
index 000000000000..b49ea9186030
--- /dev/null
+++ b/front/build-storybook.log
@@ -0,0 +1,436 @@
+
+> cl2-front@1.0.0 build-storybook
+> storybook build "--output-dir" "/var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91"
+
+@storybook/cli v7.5.1
+
+info => Cleaning outputDir: /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91
+info => Loading presets
+info => Building manager..
+WARN unable to find package.json for @citizenlab/cl2-component-library
+info => Manager built (288 ms)
+info => Building preview..
+info => Copying static files: /Users/work/Projects/citizenlab/front/node_modules/@storybook/manager/static at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91/sb-common-assets
+info Addon-docs: using MDX2
+info => Using implicit CSS loaders
+info => Using default Webpack5 setup
+<s> [webpack.Progress] 0% 
+
+<s> [webpack.Progress] 1% setup before run
+<s> [webpack.Progress] 1% setup before run NodeEnvironmentPlugin
+<s> [webpack.Progress] 1% setup before run
+<s> [webpack.Progress] 2% setup run
+<s> [webpack.Progress] 2% setup run
+<s> [webpack.Progress] 4% setup normal module factory
+<s> [webpack.Progress] 4% setup normal module factory CaseSensitivePathsPlugin
+<s> [webpack.Progress] 4% setup normal module factory
+<s> [webpack.Progress] 5% setup context module factory
+<s> [webpack.Progress] 5% setup context module factory
+<s> [webpack.Progress] 6% setup before compile
+<s> [webpack.Progress] 6% setup before compile ProgressPlugin
+<s> [webpack.Progress] 6% setup before compile
+<s> [webpack.Progress] 7% setup compile
+<s> [webpack.Progress] 7% setup compile ExternalsPlugin
+<s> [webpack.Progress] 7% setup compile ExternalsPlugin
+<s> [webpack.Progress] 7% setup compile
+<s> [webpack.Progress] 8% setup compilation
+<s> [webpack.Progress] 8% setup compilation unplugin-csf
+<s> [webpack.Progress] 8% setup compilation ArrayPushCallbackChunkFormatPlugin
+<s> [webpack.Progress] 8% setup compilation JsonpChunkLoadingPlugin
+<s> [webpack.Progress] 8% setup compilation StartupChunkDependenciesPlugin
+<s> [webpack.Progress] 8% setup compilation ImportScriptsChunkLoadingPlugin
+<s> [webpack.Progress] 8% setup compilation FetchCompileWasmPlugin
+<s> [webpack.Progress] 8% setup compilation FetchCompileAsyncWasmPlugin
+<s> [webpack.Progress] 8% setup compilation WorkerPlugin
+<s> [webpack.Progress] 8% setup compilation SplitChunksPlugin
+<s> [webpack.Progress] 8% setup compilation RuntimeChunkPlugin
+<s> [webpack.Progress] 8% setup compilation ResolverCachePlugin
+<s> [webpack.Progress] 8% setup compilation HtmlWebpackPlugin
+<s> [webpack.Progress] 8% setup compilation
+<s> [webpack.Progress] 9% setup compilation
+<s> [webpack.Progress] 9% setup compilation DefinePlugin
+<s> [webpack.Progress] 9% setup compilation ProvidePlugin
+<s> [webpack.Progress] 9% setup compilation ProgressPlugin
+<s> [webpack.Progress] 9% setup compilation DocGenPlugin
+<s> [webpack.Progress] 9% setup compilation ProvidePlugin
+<s> [webpack.Progress] 9% setup compilation ChunkPrefetchPreloadPlugin
+<s> [webpack.Progress] 9% setup compilation SourceMapDevToolPlugin
+<s> [webpack.Progress] 9% setup compilation JavascriptModulesPlugin
+<s> [webpack.Progress] 9% setup compilation JsonModulesPlugin
+<s> [webpack.Progress] 9% setup compilation AssetModulesPlugin
+<s> [webpack.Progress] 9% setup compilation EntryPlugin
+<s> [webpack.Progress] 9% setup compilation RuntimePlugin
+<s> [webpack.Progress] 9% setup compilation InferAsyncModulesPlugin
+<s> [webpack.Progress] 9% setup compilation DataUriPlugin
+<s> [webpack.Progress] 9% setup compilation FileUriPlugin
+<s> [webpack.Progress] 9% setup compilation CompatibilityPlugin
+<s> [webpack.Progress] 9% setup compilation HarmonyModulesPlugin
+<s> [webpack.Progress] 9% setup compilation AMDPlugin
+<s> [webpack.Progress] 9% setup compilation RequireJsStuffPlugin
+<s> [webpack.Progress] 9% setup compilation CommonJsPlugin
+<s> [webpack.Progress] 9% setup compilation LoaderPlugin
+<s> [webpack.Progress] 9% setup compilation LoaderPlugin
+<s> [webpack.Progress] 9% setup compilation NodeStuffPlugin
+<s> [webpack.Progress] 9% setup compilation APIPlugin
+<s> [webpack.Progress] 9% setup compilation ExportsInfoApiPlugin
+<s> [webpack.Progress] 9% setup compilation WebpackIsIncludedPlugin
+<s> [webpack.Progress] 9% setup compilation ConstPlugin
+<s> [webpack.Progress] 9% setup compilation UseStrictPlugin
+<s> [webpack.Progress] 9% setup compilation RequireIncludePlugin
+<s> [webpack.Progress] 9% setup compilation RequireEnsurePlugin
+<s> [webpack.Progress] 9% setup compilation RequireContextPlugin
+<s> [webpack.Progress] 9% setup compilation ImportPlugin
+<s> [webpack.Progress] 9% setup compilation ImportMetaContextPlugin
+<s> [webpack.Progress] 9% setup compilation SystemPlugin
+<s> [webpack.Progress] 9% setup compilation ImportMetaPlugin
+<s> [webpack.Progress] 9% setup compilation URLPlugin
+<s> [webpack.Progress] 9% setup compilation DefaultStatsFactoryPlugin
+<s> [webpack.Progress] 9% setup compilation DefaultStatsPresetPlugin
+<s> [webpack.Progress] 9% setup compilation DefaultStatsPrinterPlugin
+<s> [webpack.Progress] 9% setup compilation JavascriptMetaInfoPlugin
+<s> [webpack.Progress] 9% setup compilation EnsureChunkConditionsPlugin
+<s> [webpack.Progress] 9% setup compilation RemoveEmptyChunksPlugin
+<s> [webpack.Progress] 9% setup compilation MergeDuplicateChunksPlugin
+<s> [webpack.Progress] 9% setup compilation FlagIncludedChunksPlugin
+<s> [webpack.Progress] 9% setup compilation SideEffectsFlagPlugin
+<s> [webpack.Progress] 9% setup compilation FlagDependencyExportsPlugin
+<s> [webpack.Progress] 9% setup compilation FlagDependencyUsagePlugin
+<s> [webpack.Progress] 9% setup compilation InnerGraphPlugin
+<s> [webpack.Progress] 9% setup compilation MangleExportsPlugin
+<s> [webpack.Progress] 9% setup compilation ModuleConcatenationPlugin
+<s> [webpack.Progress] 9% setup compilation NoEmitOnErrorsPlugin
+<s> [webpack.Progress] 9% setup compilation RealContentHashPlugin
+<s> [webpack.Progress] 9% setup compilation WasmFinalizeExportsPlugin
+<s> [webpack.Progress] 9% setup compilation NamedModuleIdsPlugin
+<s> [webpack.Progress] 9% setup compilation DeterministicChunkIdsPlugin
+<s> [webpack.Progress] 9% setup compilation DefinePlugin
+<s> [webpack.Progress] 9% setup compilation TerserPlugin
+<s> [webpack.Progress] 9% setup compilation TemplatedPathPlugin
+<s> [webpack.Progress] 9% setup compilation RecordIdsPlugin
+<s> [webpack.Progress] 9% setup compilation WarnCaseSensitiveModulesPlugin
+<s> [webpack.Progress] 9% setup compilation IgnoreWarningsPlugin
+<s> [webpack.Progress] 9% setup compilation
+<s> [webpack.Progress] 10% building
+<s> [webpack.Progress] 10% building 0/1 entries 0/0 dependencies 0/0 modules
+<s> [webpack.Progress] 25% building import loader ./node_modules/@storybook/builder-webpack5/node_modules/babel-loader/lib/index.js
+<s> [webpack.Progress] 25% building 0/1 entries 11/18 dependencies 3/11 modules
+info => Copying static files: /Users/work/Projects/citizenlab/front/.storybook/public at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91/
+info => Copying static files: /Users/work/Projects/citizenlab/front/.storybook/static at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91/
+<s> [webpack.Progress] 14% building 0/1 entries 188/245 dependencies 12/133 modules
+<s> [webpack.Progress] 14% building import loader ./node_modules/unplugin/dist/webpack/loaders/load.js
+<s> [webpack.Progress] 14% building 0/1 entries 216/245 dependencies 12/159 modules
+<s> [webpack.Progress] 39% building 0/1 entries 243/300 dependencies 95/178 modules
+<s> [webpack.Progress] 29% building import loader ./node_modules/style-loader/dist/cjs.js
+<s> [webpack.Progress] 29% building import loader ./node_modules/css-loader/dist/cjs.js
+<s> [webpack.Progress] 29% building 0/1 entries 581/645 dependencies 118/329 modules
+WARN No story files found for the specified pattern: app/**/*.mdx
+<s> [webpack.Progress] 30% building 0/1 entries 892/1000 dependencies 168/451 modules
+<s> [webpack.Progress] 29% building 0/1 entries 1236/1632 dependencies 209/600 modules
+<s> [webpack.Progress] 29% building 0/1 entries 1277/2000 dependencies 221/625 modules
+<s> [webpack.Progress] 23% building 0/1 entries 2452/2500 dependencies 312/1243 modules
+<s> [webpack.Progress] 23% building 0/1 entries 3873/3900 dependencies 410/1685 modules
+<s> [webpack.Progress] 24% building 0/1 entries 4887/4922 dependencies 500/1846 modules
+<s> [webpack.Progress] 28% building 0/1 entries 6200/6284 dependencies 789/2407 modules
+<s> [webpack.Progress] 33% building 0/1 entries 6931/7000 dependencies 1056/2511 modules
+<s> [webpack.Progress] 34% building 0/1 entries 7900/7928 dependencies 1199/2648 modules
+<s> [webpack.Progress] 38% building 0/1 entries 9199/9300 dependencies 1537/2927 modules
+<s> [webpack.Progress] 43% building 0/1 entries 9831/9950 dependencies 1800/2965 modules
+<s> [webpack.Progress] 48% building 0/1 entries 11100/11144 dependencies 2273/3230 modules
+<s> [webpack.Progress] 52% building 0/1 entries 12140/12200 dependencies 2690/3511 modules
+<s> [webpack.Progress] 53% building 0/1 entries 13500/13713 dependencies 3158/3968 modules
+<s> [webpack.Progress] 54% building 0/1 entries 14491/14563 dependencies 3400/4167 modules
+<s> [webpack.Progress] 57% building 0/1 entries 15587/15600 dependencies 3779/4341 modules
+<s> [webpack.Progress] 65% building 1/1 entries 17041/17041 dependencies 4784/4784 modules
+<s> [webpack.Progress] 65% building
+<s> [webpack.Progress] 69% building finish
+<s> [webpack.Progress] 69% building finish
+<s> [webpack.Progress] 70% sealing finish module graph
+<s> [webpack.Progress] 70% sealing finish module graph ResolverCachePlugin
+<s> [webpack.Progress] 70% sealing finish module graph InferAsyncModulesPlugin
+<s> [webpack.Progress] 70% sealing finish module graph FlagDependencyExportsPlugin
+<s> [webpack.Progress] 70% sealing finish module graph InnerGraphPlugin
+<s> [webpack.Progress] 70% sealing finish module graph WasmFinalizeExportsPlugin
+<s> [webpack.Progress] 70% sealing finish module graph
+<s> [webpack.Progress] 70% sealing plugins
+<s> [webpack.Progress] 70% sealing plugins DocGenPlugin
+<s> [webpack.Progress] 70% sealing plugins WarnCaseSensitiveModulesPlugin
+<s> [webpack.Progress] 70% sealing plugins
+<s> [webpack.Progress] 71% sealing dependencies optimization
+<s> [webpack.Progress] 71% sealing dependencies optimization SideEffectsFlagPlugin
+<s> [webpack.Progress] 71% sealing dependencies optimization FlagDependencyUsagePlugin
+<s> [webpack.Progress] 71% sealing dependencies optimization
+<s> [webpack.Progress] 71% sealing after dependencies optimization
+<s> [webpack.Progress] 71% sealing after dependencies optimization
+<s> [webpack.Progress] 72% sealing chunk graph
+<s> [webpack.Progress] 72% sealing chunk graph
+<s> [webpack.Progress] 73% sealing after chunk graph
+<s> [webpack.Progress] 73% sealing after chunk graph
+<s> [webpack.Progress] 73% sealing optimizing
+<s> [webpack.Progress] 73% sealing optimizing
+<s> [webpack.Progress] 74% sealing module optimization
+<s> [webpack.Progress] 74% sealing module optimization
+<s> [webpack.Progress] 75% sealing after module optimization
+<s> [webpack.Progress] 75% sealing after module optimization
+<s> [webpack.Progress] 75% sealing chunk optimization
+<s> [webpack.Progress] 75% sealing chunk optimization EnsureChunkConditionsPlugin
+<s> [webpack.Progress] 75% sealing chunk optimization RemoveEmptyChunksPlugin
+<s> [webpack.Progress] 75% sealing chunk optimization MergeDuplicateChunksPlugin
+<s> [webpack.Progress] 75% sealing chunk optimization SplitChunksPlugin
+<s> [webpack.Progress] 75% sealing chunk optimization RemoveEmptyChunksPlugin
+<s> [webpack.Progress] 75% sealing chunk optimization
+<s> [webpack.Progress] 76% sealing after chunk optimization
+<s> [webpack.Progress] 76% sealing after chunk optimization
+<s> [webpack.Progress] 77% sealing module and chunk tree optimization
+<s> [webpack.Progress] 77% sealing module and chunk tree optimization PersistentChildCompilerSingletonPlugin
+<s> [webpack.Progress] 77% sealing module and chunk tree optimization
+<s> [webpack.Progress] 77% sealing after module and chunk tree optimization
+<s> [webpack.Progress] 77% sealing after module and chunk tree optimization
+<s> [webpack.Progress] 78% sealing chunk modules optimization
+<s> [webpack.Progress] 78% sealing chunk modules optimization ModuleConcatenationPlugin
+<s> [webpack.Progress] 78% sealing chunk modules optimization
+<s> [webpack.Progress] 78% sealing after chunk modules optimization
+<s> [webpack.Progress] 78% sealing after chunk modules optimization
+<s> [webpack.Progress] 79% sealing module reviving
+<s> [webpack.Progress] 79% sealing module reviving RecordIdsPlugin
+<s> [webpack.Progress] 79% sealing module reviving
+<s> [webpack.Progress] 80% sealing before module ids
+<s> [webpack.Progress] 80% sealing before module ids
+<s> [webpack.Progress] 80% sealing module ids
+<s> [webpack.Progress] 80% sealing module ids NamedModuleIdsPlugin
+<s> [webpack.Progress] 80% sealing module ids
+<s> [webpack.Progress] 81% sealing module id optimization
+<s> [webpack.Progress] 81% sealing module id optimization
+<s> [webpack.Progress] 82% sealing module id optimization
+<s> [webpack.Progress] 82% sealing module id optimization
+<s> [webpack.Progress] 82% sealing chunk reviving
+<s> [webpack.Progress] 82% sealing chunk reviving RecordIdsPlugin
+<s> [webpack.Progress] 82% sealing chunk reviving
+<s> [webpack.Progress] 83% sealing before chunk ids
+<s> [webpack.Progress] 83% sealing before chunk ids
+<s> [webpack.Progress] 84% sealing chunk ids
+<s> [webpack.Progress] 84% sealing chunk ids DeterministicChunkIdsPlugin
+<s> [webpack.Progress] 84% sealing chunk ids
+<s> [webpack.Progress] 84% sealing chunk id optimization
+<s> [webpack.Progress] 84% sealing chunk id optimization FlagIncludedChunksPlugin
+<s> [webpack.Progress] 84% sealing chunk id optimization
+<s> [webpack.Progress] 85% sealing after chunk id optimization
+<s> [webpack.Progress] 85% sealing after chunk id optimization
+<s> [webpack.Progress] 86% sealing record modules
+<s> [webpack.Progress] 86% sealing record modules RecordIdsPlugin
+<s> [webpack.Progress] 86% sealing record modules
+<s> [webpack.Progress] 86% sealing record chunks
+<s> [webpack.Progress] 86% sealing record chunks RecordIdsPlugin
+<s> [webpack.Progress] 86% sealing record chunks
+<s> [webpack.Progress] 87% sealing module hashing
+<s> [webpack.Progress] 87% sealing module hashing
+<s> [webpack.Progress] 87% sealing code generation
+<s> [webpack.Progress] 87% sealing code generation
+<s> [webpack.Progress] 88% sealing runtime requirements
+<s> [webpack.Progress] 88% sealing runtime requirements
+<s> [webpack.Progress] 89% sealing hashing
+<s> [webpack.Progress] 89% sealing hashing
+<s> [webpack.Progress] 89% sealing after hashing
+<s> [webpack.Progress] 89% sealing after hashing
+<s> [webpack.Progress] 90% sealing record hash
+<s> [webpack.Progress] 90% sealing record hash
+<s> [webpack.Progress] 91% sealing module assets processing
+<s> [webpack.Progress] 91% sealing module assets processing
+<s> [webpack.Progress] 91% sealing chunk assets processing
+<s> [webpack.Progress] 91% sealing chunk assets processing
+<s> [webpack.Progress] 92% sealing asset processing
+<s> [webpack.Progress] 92% sealing asset processing PersistentChildCompilerSingletonPlugin
+<s> [webpack.Progress] 92% sealing asset processing TerserPlugin
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.2294e253.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.2294e253.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin runtime~main.bacb8e07.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin runtime~main.bacb8e07.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.73061317.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.73061317.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.40070d30.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.40070d30.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.a6e18737.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.a6e18737.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-UI-Button-Button-stories.497c780d.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-UI-Button-Button-stories.497c780d.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Admin-reporting-containers-FullScreenReport-FullscreenReport-stories.ebd76cee.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Admin-reporting-containers-FullScreenReport-FullscreenReport-stories.ebd76cee.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Admin-reporting-containers-PrintReport-PrintReport-stories.70b46ac8.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Admin-reporting-containers-PrintReport-PrintReport-stories.70b46ac8.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Authentication-Authentication-stories.fe917a0a.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Authentication-Authentication-stories.fe917a0a.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.ddfefcd5.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.ddfefcd5.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 180.9a60aefb.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 180.9a60aefb.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 341.f9f4f8ae.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 341.f9f4f8ae.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 595.0b82fa44.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 595.0b82fa44.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 296.9e0211e0.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 296.9e0211e0.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 984.1b930f3f.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 984.1b930f3f.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 89.cfeb38ca.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 89.cfeb38ca.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 420.f037451c.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 420.f037451c.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 618.76a2abe1.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 618.76a2abe1.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 387.ecbcd7d2.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 387.ecbcd7d2.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 919.43e12414.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 919.43e12414.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 738.734a4844.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 738.734a4844.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 364.d0299004.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 364.d0299004.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 665.510edf03.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 665.510edf03.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 822.e84f566b.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 822.e84f566b.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 316.20acfb76.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 316.20acfb76.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.c209ac9c.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.c209ac9c.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 50.2140cf6b.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 50.2140cf6b.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 326.20eaa6ca.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 326.20eaa6ca.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 512.95d2b1c7.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 512.95d2b1c7.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 149.f074c6a5.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 149.f074c6a5.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 7.3f802551.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 7.3f802551.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin resolve sources
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.2294e253.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.2294e253.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.73061317.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.73061317.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.40070d30.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.40070d30.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Authentication-Authentication-stories.fe917a0a.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Authentication-Authentication-stories.fe917a0a.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.ddfefcd5.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.ddfefcd5.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 364.d0299004.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 364.d0299004.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 665.510edf03.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 665.510edf03.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.c209ac9c.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.c209ac9c.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 512.95d2b1c7.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 512.95d2b1c7.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 149.f074c6a5.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 149.f074c6a5.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 7.3f802551.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 7.3f802551.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin resolve sources
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
+<s> [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin
+<s> [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin
+<s> [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin resolve sources
+<s> [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin runtime~main.acbd3400.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin runtime~main.acbd3400.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin components-ProjectCard-ProjectCard-stories.fe6bceb2.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin components-ProjectCard-ProjectCard-stories.fe6bceb2.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin components-UI-Button-Button-stories.996e1b0d.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin components-UI-Button-Button-stories.996e1b0d.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin containers-Admin-reporting-containers-FullScreenReport-FullscreenReport-stories.75bc245d.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin containers-Admin-reporting-containers-FullScreenReport-FullscreenReport-stories.75bc245d.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin containers-Admin-reporting-containers-PrintReport-PrintReport-stories.df6fdb49.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin containers-Admin-reporting-containers-PrintReport-PrintReport-stories.df6fdb49.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 180.56c1561c.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 180.56c1561c.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 341.3e1b3d5d.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 341.3e1b3d5d.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 595.db9b2253.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 595.db9b2253.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 296.7a190b38.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 296.7a190b38.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 984.669e1bd6.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 984.669e1bd6.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 387.7ea5ef99.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 387.7ea5ef99.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 822.a989025b.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 822.a989025b.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 316.b155684f.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 316.b155684f.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 50.8e0ae8f4.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 50.8e0ae8f4.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 326.ebba72d9.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 326.ebba72d9.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 89.49ba2b9b.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 89.49ba2b9b.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 420.38a27e80.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 420.38a27e80.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 618.4ed43471.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 618.4ed43471.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 919.5720c4b7.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 919.5720c4b7.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 738.c9e6f2ee.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 738.c9e6f2ee.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin resolve sources
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin
+<s> [webpack.Progress] 92% sealing asset processing
+<s> [webpack.Progress] 93% sealing after asset optimization
+<s> [webpack.Progress] 93% sealing after asset optimization
+<s> [webpack.Progress] 93% sealing recording
+<s> [webpack.Progress] 93% sealing recording
+<s> [webpack.Progress] 94% sealing after seal
+<s> [webpack.Progress] 94% sealing after seal
+<s> [webpack.Progress] 95% emitting emit
+<s> [webpack.Progress] 95% emitting emit
+<s> [webpack.Progress] 98% emitting after emit
+<s> [webpack.Progress] 98% emitting after emit SizeLimitsPlugin
+<s> [webpack.Progress] 98% emitting after emit
+<s> [webpack.Progress] 99% done plugins
+<s> [webpack.Progress] 99% done plugins CaseSensitivePathsPlugin
+<s> [webpack.Progress] 99% done plugins
+<s> [webpack.Progress] 99% 
+
+<s> [webpack.Progress] 99% cache store build dependencies
+<s> [webpack.Progress] 99% cache store build dependencies
+<s> [webpack.Progress] 99% cache begin idle
+<s> [webpack.Progress] 99% cache begin idle
+<s> [webpack.Progress] 100% 
+
+WARN asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
+WARN This can impact web performance.
+WARN Assets: 
+WARN   180.56c1561c.iframe.bundle.js (803 KiB)
+WARN   main.6d9d7e07.iframe.bundle.js (13.7 MiB)
+WARN   containers-Authentication-Authentication-stories.c40faef3.iframe.bundle.js (665 KiB)
+WARN   921.ad2af97c.iframe.bundle.js (672 KiB)
+WARN   426.c9f8ef29.iframe.bundle.js (583 KiB)
+WARN   89.49ba2b9b.iframe.bundle.js (984 KiB)
+WARN   420.38a27e80.iframe.bundle.js (441 KiB)
+WARN   919.5720c4b7.iframe.bundle.js (801 KiB)
+WARN   738.c9e6f2ee.iframe.bundle.js (961 KiB)
+WARN   364.44b31536.iframe.bundle.js (2.44 MiB)
+WARN   665.748da23d.iframe.bundle.js (580 KiB)
+WARN   7.3c939a6a.iframe.bundle.js (631 KiB)
+WARN entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
+WARN Entrypoints:
+WARN   main (16.1 MiB)
+WARN       runtime~main.acbd3400.iframe.bundle.js
+WARN       364.44b31536.iframe.bundle.js
+WARN       main.6d9d7e07.iframe.bundle.js
+WARN 
+<s> [webpack.Progress] 99% cache shutdown
+<s> [webpack.Progress] 99% cache shutdown
+<s> [webpack.Progress] 100% 
+
+info => Preview built (33 s)
+info => Output directory: /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91
diff --git a/front/package.json b/front/package.json
index 550dd6f85685..74abee63ebe2 100644
--- a/front/package.json
+++ b/front/package.json
@@ -35,7 +35,7 @@
     "detect-deadcode": "ts-prune -p app/tsconfig.json -i '(node_modules|utils/testUtils/rtl.tsx|utils/permissions|i18n|/*/*/__mocks__)' | (! grep -v 'used in module')",
     "dependency-cruiser": "depcruise app  --validate",
     "storybook": "storybook dev -p 6006",
-    "storybook:build": "storybook build"
+    "build-storybook": "storybook build"
   },
   "jest-junit": {
     "addFileAttribute": "true"

From 8bdcfff91cf1cb6b7b4e5d85c4954c77c5713d31 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 12 Jan 2024 17:25:03 +0100
Subject: [PATCH 003/282] Delete report stories too

---
 .../FullscreenReport.stories.tsx              | 36 -------------------
 .../PrintReport/PrintReport.stories.tsx       | 35 ------------------
 2 files changed, 71 deletions(-)
 delete mode 100644 front/app/containers/Admin/reporting/containers/FullScreenReport/FullscreenReport.stories.tsx
 delete mode 100644 front/app/containers/Admin/reporting/containers/PrintReport/PrintReport.stories.tsx

diff --git a/front/app/containers/Admin/reporting/containers/FullScreenReport/FullscreenReport.stories.tsx b/front/app/containers/Admin/reporting/containers/FullScreenReport/FullscreenReport.stories.tsx
deleted file mode 100644
index 9c3975e0b030..000000000000
--- a/front/app/containers/Admin/reporting/containers/FullScreenReport/FullscreenReport.stories.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import React from 'react';
-import type { Meta, StoryObj } from '@storybook/react';
-import { FullScreenReport } from '.';
-
-const meta = {
-  title: 'Example/FullScreenReport',
-  render: (props) => {
-    return (
-      <div
-        style={{
-          position: 'absolute',
-          top: 0,
-          left: 0,
-          width: '100%',
-          display: 'flex',
-          justifyContent: 'center',
-        }}
-      >
-        <FullScreenReport {...props} />
-      </div>
-    );
-  },
-  parameters: {
-    layout: 'centered',
-  },
-} satisfies Meta<typeof FullScreenReport>;
-
-export default meta;
-type Story = StoryObj<typeof meta>;
-
-export const Ideation: Story = {
-  args: {
-    reportId: '1',
-  },
-  parameters: {},
-};
diff --git a/front/app/containers/Admin/reporting/containers/PrintReport/PrintReport.stories.tsx b/front/app/containers/Admin/reporting/containers/PrintReport/PrintReport.stories.tsx
deleted file mode 100644
index 07352d299210..000000000000
--- a/front/app/containers/Admin/reporting/containers/PrintReport/PrintReport.stories.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import type { Meta, StoryObj } from '@storybook/react';
-import mockEndpoints from 'utils/storybook/mockEndpoints';
-import { surveyReportHandler } from 'api/report_layout/__mocks__/_mockServer';
-import { PrintReport } from '.';
-
-const meta = {
-  title: 'Example/PrintReport',
-  component: PrintReport,
-  parameters: {
-    layout: 'centered',
-  },
-} satisfies Meta<typeof PrintReport>;
-
-export default meta;
-type Story = StoryObj<typeof meta>;
-
-export const Ideation: Story = {
-  args: {
-    reportId: '1',
-    _print: false,
-  },
-  parameters: {},
-};
-
-export const Survey: Story = {
-  args: {
-    reportId: '1',
-    _print: false,
-  },
-  parameters: {
-    msw: mockEndpoints({
-      'GET reports/:id/layout': surveyReportHandler,
-    }),
-  },
-};

From 1a409475c3ee457572d44856376150d1e8d5e271 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 12 Jan 2024 17:33:06 +0100
Subject: [PATCH 004/282] Remove button

---
 .../components/UI/Button/Button.stories.tsx   |  27 --
 front/build-storybook.log                     | 233 +++++++-----------
 front/package.json                            |  14 +-
 3 files changed, 96 insertions(+), 178 deletions(-)
 delete mode 100644 front/app/components/UI/Button/Button.stories.tsx

diff --git a/front/app/components/UI/Button/Button.stories.tsx b/front/app/components/UI/Button/Button.stories.tsx
deleted file mode 100644
index e5d511f75f92..000000000000
--- a/front/app/components/UI/Button/Button.stories.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import type { Meta, StoryObj } from '@storybook/react';
-import Button from '.';
-
-// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
-const meta = {
-  title: 'Example/Button',
-  component: Button,
-  parameters: {
-    // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/react/configure/story-layout
-    layout: 'centered',
-  },
-  // More on argTypes: https://storybook.js.org/docs/react/api/argtypes
-  argTypes: {
-    bgColor: { control: 'color' },
-  },
-  args: {
-    children: 'Button text',
-  },
-} satisfies Meta<typeof Button>;
-
-export default meta;
-type Story = StoryObj<typeof meta>;
-
-// More on writing stories with args: https://storybook.js.org/docs/react/writing-stories/args
-export const Primary: Story = {
-  args: {},
-};
diff --git a/front/build-storybook.log b/front/build-storybook.log
index b49ea9186030..f2cc86b88040 100644
--- a/front/build-storybook.log
+++ b/front/build-storybook.log
@@ -1,16 +1,16 @@
 
 > cl2-front@1.0.0 build-storybook
-> storybook build "--output-dir" "/var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91"
+> storybook build "--output-dir" "/var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m"
 
 @storybook/cli v7.5.1
 
-info => Cleaning outputDir: /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91
+info => Cleaning outputDir: /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m
 info => Loading presets
 info => Building manager..
 WARN unable to find package.json for @citizenlab/cl2-component-library
-info => Manager built (288 ms)
+info => Manager built (132 ms)
 info => Building preview..
-info => Copying static files: /Users/work/Projects/citizenlab/front/node_modules/@storybook/manager/static at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91/sb-common-assets
+info => Copying static files: /Users/work/Projects/citizenlab/front/node_modules/@storybook/manager/static at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m/sb-common-assets
 info Addon-docs: using MDX2
 info => Using implicit CSS loaders
 info => Using default Webpack5 setup
@@ -114,33 +114,22 @@ info => Using default Webpack5 setup
 <s> [webpack.Progress] 10% building 0/1 entries 0/0 dependencies 0/0 modules
 <s> [webpack.Progress] 25% building import loader ./node_modules/@storybook/builder-webpack5/node_modules/babel-loader/lib/index.js
 <s> [webpack.Progress] 25% building 0/1 entries 11/18 dependencies 3/11 modules
-info => Copying static files: /Users/work/Projects/citizenlab/front/.storybook/public at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91/
-info => Copying static files: /Users/work/Projects/citizenlab/front/.storybook/static at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91/
-<s> [webpack.Progress] 14% building 0/1 entries 188/245 dependencies 12/133 modules
-<s> [webpack.Progress] 14% building import loader ./node_modules/unplugin/dist/webpack/loaders/load.js
-<s> [webpack.Progress] 14% building 0/1 entries 216/245 dependencies 12/159 modules
-<s> [webpack.Progress] 39% building 0/1 entries 243/300 dependencies 95/178 modules
-<s> [webpack.Progress] 29% building import loader ./node_modules/style-loader/dist/cjs.js
-<s> [webpack.Progress] 29% building import loader ./node_modules/css-loader/dist/cjs.js
-<s> [webpack.Progress] 29% building 0/1 entries 581/645 dependencies 118/329 modules
+info => Copying static files: /Users/work/Projects/citizenlab/front/.storybook/public at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m/
+info => Copying static files: /Users/work/Projects/citizenlab/front/.storybook/static at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m/
+<s> [webpack.Progress] 15% building import loader ./node_modules/unplugin/dist/webpack/loaders/load.js
+<s> [webpack.Progress] 15% building 0/1 entries 191/242 dependencies 14/135 modules
+<s> [webpack.Progress] 39% building 0/1 entries 253/300 dependencies 99/184 modules
+<s> [webpack.Progress] 32% building import loader ./node_modules/style-loader/dist/cjs.js
+<s> [webpack.Progress] 32% building import loader ./node_modules/css-loader/dist/cjs.js
+<s> [webpack.Progress] 32% building 0/1 entries 606/654 dependencies 136/337 modules
 WARN No story files found for the specified pattern: app/**/*.mdx
-<s> [webpack.Progress] 30% building 0/1 entries 892/1000 dependencies 168/451 modules
-<s> [webpack.Progress] 29% building 0/1 entries 1236/1632 dependencies 209/600 modules
-<s> [webpack.Progress] 29% building 0/1 entries 1277/2000 dependencies 221/625 modules
-<s> [webpack.Progress] 23% building 0/1 entries 2452/2500 dependencies 312/1243 modules
-<s> [webpack.Progress] 23% building 0/1 entries 3873/3900 dependencies 410/1685 modules
-<s> [webpack.Progress] 24% building 0/1 entries 4887/4922 dependencies 500/1846 modules
-<s> [webpack.Progress] 28% building 0/1 entries 6200/6284 dependencies 789/2407 modules
-<s> [webpack.Progress] 33% building 0/1 entries 6931/7000 dependencies 1056/2511 modules
-<s> [webpack.Progress] 34% building 0/1 entries 7900/7928 dependencies 1199/2648 modules
-<s> [webpack.Progress] 38% building 0/1 entries 9199/9300 dependencies 1537/2927 modules
-<s> [webpack.Progress] 43% building 0/1 entries 9831/9950 dependencies 1800/2965 modules
-<s> [webpack.Progress] 48% building 0/1 entries 11100/11144 dependencies 2273/3230 modules
-<s> [webpack.Progress] 52% building 0/1 entries 12140/12200 dependencies 2690/3511 modules
-<s> [webpack.Progress] 53% building 0/1 entries 13500/13713 dependencies 3158/3968 modules
-<s> [webpack.Progress] 54% building 0/1 entries 14491/14563 dependencies 3400/4167 modules
-<s> [webpack.Progress] 57% building 0/1 entries 15587/15600 dependencies 3779/4341 modules
-<s> [webpack.Progress] 65% building 1/1 entries 17041/17041 dependencies 4784/4784 modules
+<s> [webpack.Progress] 33% building 0/1 entries 900/1046 dependencies 186/432 modules
+<s> [webpack.Progress] 34% building 0/1 entries 1282/1941 dependencies 272/600 modules
+<s> [webpack.Progress] 26% building 0/1 entries 2324/2400 dependencies 371/1216 modules
+<s> [webpack.Progress] 27% building 0/1 entries 4378/4471 dependencies 535/1700 modules
+<s> [webpack.Progress] 36% building 0/1 entries 6368/6400 dependencies 1108/2309 modules
+<s> [webpack.Progress] 49% building 0/1 entries 8557/8624 dependencies 1948/2700 modules
+<s> [webpack.Progress] 65% building 1/1 entries 11222/11222 dependencies 3372/3372 modules
 <s> [webpack.Progress] 65% building
 <s> [webpack.Progress] 69% building finish
 <s> [webpack.Progress] 69% building finish
@@ -242,95 +231,65 @@ WARN No story files found for the specified pattern: app/**/*.mdx
 <s> [webpack.Progress] 92% sealing asset processing TerserPlugin
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.2294e253.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.2294e253.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin runtime~main.bacb8e07.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin runtime~main.bacb8e07.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.73061317.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.73061317.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.40070d30.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.40070d30.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.a6e18737.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.a6e18737.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-UI-Button-Button-stories.497c780d.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-UI-Button-Button-stories.497c780d.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Admin-reporting-containers-FullScreenReport-FullscreenReport-stories.ebd76cee.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Admin-reporting-containers-FullScreenReport-FullscreenReport-stories.ebd76cee.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Admin-reporting-containers-PrintReport-PrintReport-stories.70b46ac8.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Admin-reporting-containers-PrintReport-PrintReport-stories.70b46ac8.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Authentication-Authentication-stories.fe917a0a.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Authentication-Authentication-stories.fe917a0a.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.ddfefcd5.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.ddfefcd5.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 180.9a60aefb.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 180.9a60aefb.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 341.f9f4f8ae.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 341.f9f4f8ae.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 595.0b82fa44.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 595.0b82fa44.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.62975a8d.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.62975a8d.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin runtime~main.14c53d21.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin runtime~main.14c53d21.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.35c7e18f.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.35c7e18f.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.6184407e.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.6184407e.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.ac4e41d8.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.ac4e41d8.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-UI-Button-Button-stories.472927b1.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-UI-Button-Button-stories.472927b1.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.b2bb1700.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.b2bb1700.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 341.054adc48.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 341.054adc48.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 595.518ac58f.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 595.518ac58f.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 296.9e0211e0.iframe.bundle.js generate SourceMap
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 296.9e0211e0.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js generate SourceMap
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 984.1b930f3f.iframe.bundle.js generate SourceMap
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 984.1b930f3f.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 89.cfeb38ca.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 89.cfeb38ca.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 420.f037451c.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 420.f037451c.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 618.76a2abe1.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 618.76a2abe1.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 387.ecbcd7d2.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 387.ecbcd7d2.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 919.43e12414.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 919.43e12414.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 738.734a4844.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 738.734a4844.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 364.d0299004.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 364.d0299004.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 665.510edf03.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 665.510edf03.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 822.e84f566b.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 822.e84f566b.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 316.20acfb76.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 316.20acfb76.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.c209ac9c.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.c209ac9c.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 50.2140cf6b.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 50.2140cf6b.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 326.20eaa6ca.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 326.20eaa6ca.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 512.95d2b1c7.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 512.95d2b1c7.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 149.f074c6a5.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 149.f074c6a5.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 7.3f802551.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 7.3f802551.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 89.b1006dc0.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 89.b1006dc0.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 658.2c4d103e.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 658.2c4d103e.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 618.79060e8c.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 618.79060e8c.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 187.f04cbf6f.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 187.f04cbf6f.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 822.e8259551.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 822.e8259551.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 316.f4ee42ff.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 316.f4ee42ff.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.4b787044.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.4b787044.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 154.8c565515.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 154.8c565515.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 17.9d9eb9f8.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 17.9d9eb9f8.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin resolve sources
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.2294e253.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.2294e253.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.73061317.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.73061317.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.40070d30.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.40070d30.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Authentication-Authentication-stories.fe917a0a.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin containers-Authentication-Authentication-stories.fe917a0a.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.ddfefcd5.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.ddfefcd5.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.62975a8d.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.62975a8d.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.35c7e18f.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.35c7e18f.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.6184407e.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.6184407e.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.ac4e41d8.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.ac4e41d8.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.b2bb1700.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.b2bb1700.iframe.bundle.js attached SourceMap
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js attach SourceMap
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 364.d0299004.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 364.d0299004.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 665.510edf03.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 665.510edf03.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.c209ac9c.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.c209ac9c.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 512.95d2b1c7.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 512.95d2b1c7.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 149.f074c6a5.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 149.f074c6a5.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 7.3f802551.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 7.3f802551.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 187.f04cbf6f.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 187.f04cbf6f.iframe.bundle.js attached SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.4b787044.iframe.bundle.js attach SourceMap
+<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.4b787044.iframe.bundle.js attached SourceMap
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
 <s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin resolve sources
@@ -341,18 +300,10 @@ WARN No story files found for the specified pattern: app/**/*.mdx
 <s> [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin runtime~main.acbd3400.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin runtime~main.acbd3400.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin components-ProjectCard-ProjectCard-stories.fe6bceb2.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin components-ProjectCard-ProjectCard-stories.fe6bceb2.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin runtime~main.28b76233.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin runtime~main.28b76233.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin components-UI-Button-Button-stories.996e1b0d.iframe.bundle.js generate SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin components-UI-Button-Button-stories.996e1b0d.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin containers-Admin-reporting-containers-FullScreenReport-FullscreenReport-stories.75bc245d.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin containers-Admin-reporting-containers-FullScreenReport-FullscreenReport-stories.75bc245d.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin containers-Admin-reporting-containers-PrintReport-PrintReport-stories.df6fdb49.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin containers-Admin-reporting-containers-PrintReport-PrintReport-stories.df6fdb49.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 180.56c1561c.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 180.56c1561c.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 341.3e1b3d5d.iframe.bundle.js generate SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 341.3e1b3d5d.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 595.db9b2253.iframe.bundle.js generate SourceMap
@@ -361,26 +312,20 @@ WARN No story files found for the specified pattern: app/**/*.mdx
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 296.7a190b38.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 984.669e1bd6.iframe.bundle.js generate SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 984.669e1bd6.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 387.7ea5ef99.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 387.7ea5ef99.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 822.a989025b.iframe.bundle.js generate SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 822.a989025b.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 316.b155684f.iframe.bundle.js generate SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 316.b155684f.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 50.8e0ae8f4.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 50.8e0ae8f4.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 326.ebba72d9.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 326.ebba72d9.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 154.dd5cbaca.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 154.dd5cbaca.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 17.7aa950fc.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 17.7aa950fc.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 89.49ba2b9b.iframe.bundle.js generate SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 89.49ba2b9b.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 420.38a27e80.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 420.38a27e80.iframe.bundle.js generated SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 658.f4114154.iframe.bundle.js generate SourceMap
+<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 658.f4114154.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 618.4ed43471.iframe.bundle.js generate SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 618.4ed43471.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 919.5720c4b7.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 919.5720c4b7.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 738.c9e6f2ee.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 738.c9e6f2ee.iframe.bundle.js generated SourceMap
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin resolve sources
 <s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin
 <s> [webpack.Progress] 92% sealing asset processing
@@ -409,28 +354,22 @@ WARN No story files found for the specified pattern: app/**/*.mdx
 WARN asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
 WARN This can impact web performance.
 WARN Assets: 
-WARN   180.56c1561c.iframe.bundle.js (803 KiB)
-WARN   main.6d9d7e07.iframe.bundle.js (13.7 MiB)
-WARN   containers-Authentication-Authentication-stories.c40faef3.iframe.bundle.js (665 KiB)
-WARN   921.ad2af97c.iframe.bundle.js (672 KiB)
+WARN   main.1aa9f768.iframe.bundle.js (13.7 MiB)
+WARN   921.f1183820.iframe.bundle.js (685 KiB)
 WARN   426.c9f8ef29.iframe.bundle.js (583 KiB)
 WARN   89.49ba2b9b.iframe.bundle.js (984 KiB)
-WARN   420.38a27e80.iframe.bundle.js (441 KiB)
-WARN   919.5720c4b7.iframe.bundle.js (801 KiB)
-WARN   738.c9e6f2ee.iframe.bundle.js (961 KiB)
-WARN   364.44b31536.iframe.bundle.js (2.44 MiB)
-WARN   665.748da23d.iframe.bundle.js (580 KiB)
-WARN   7.3c939a6a.iframe.bundle.js (631 KiB)
+WARN   658.f4114154.iframe.bundle.js (438 KiB)
+WARN   187.08e58d7f.iframe.bundle.js (2.43 MiB)
 WARN entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
 WARN Entrypoints:
 WARN   main (16.1 MiB)
-WARN       runtime~main.acbd3400.iframe.bundle.js
-WARN       364.44b31536.iframe.bundle.js
-WARN       main.6d9d7e07.iframe.bundle.js
+WARN       runtime~main.28b76233.iframe.bundle.js
+WARN       187.08e58d7f.iframe.bundle.js
+WARN       main.1aa9f768.iframe.bundle.js
 WARN 
 <s> [webpack.Progress] 99% cache shutdown
 <s> [webpack.Progress] 99% cache shutdown
 <s> [webpack.Progress] 100% 
 
-info => Preview built (33 s)
-info => Output directory: /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--9156-EQimLcAZ7w91
+info => Preview built (21 s)
+info => Output directory: /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m
diff --git a/front/package.json b/front/package.json
index 74abee63ebe2..f068bc524e0b 100644
--- a/front/package.json
+++ b/front/package.json
@@ -9,7 +9,9 @@
     "node": "16.15.0",
     "npm": ">=8"
   },
-  "author": "CitizenLab",
+  "author": {
+    "name": "CitizenLab"
+  },
   "scripts": {
     "extract-intl": "tsc --skipLibCheck app/containers/App/constants && babel-node --presets @babel/env -- ./internals/scripts/extract-intl.js",
     "prebuild": "npm run build:clean",
@@ -35,7 +37,8 @@
     "detect-deadcode": "ts-prune -p app/tsconfig.json -i '(node_modules|utils/testUtils/rtl.tsx|utils/permissions|i18n|/*/*/__mocks__)' | (! grep -v 'used in module')",
     "dependency-cruiser": "depcruise app  --validate",
     "storybook": "storybook dev -p 6006",
-    "build-storybook": "storybook build"
+    "build-storybook": "storybook build",
+    "chromatic": "npx chromatic --project-token=chpt_899ad5671ea1dce"
   },
   "jest-junit": {
     "addFileAttribute": "true"
@@ -143,7 +146,8 @@
     "util": "^0.12.5",
     "webfontloader": "1.6.28",
     "xlsx": "https://cdn.sheetjs.com/xlsx-0.18.10/xlsx-0.18.10.tgz",
-    "yup": "^0.32.11"
+    "yup": "^0.32.11",
+    "fsevents": "^2"
   },
   "devDependencies": {
     "@babel/cli": "7.x",
@@ -263,5 +267,7 @@
   },
   "msw": {
     "workerDirectory": ".storybook/public"
-  }
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "cl2-front@1.0.0"
 }

From dcec7b7976206d946d80fd10a78178a82b71f97f Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 12 Jan 2024 17:43:37 +0100
Subject: [PATCH 005/282] Delete log

---
 front/build-storybook.log | 375 --------------------------------------
 1 file changed, 375 deletions(-)
 delete mode 100644 front/build-storybook.log

diff --git a/front/build-storybook.log b/front/build-storybook.log
deleted file mode 100644
index f2cc86b88040..000000000000
--- a/front/build-storybook.log
+++ /dev/null
@@ -1,375 +0,0 @@
-
-> cl2-front@1.0.0 build-storybook
-> storybook build "--output-dir" "/var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m"
-
-@storybook/cli v7.5.1
-
-info => Cleaning outputDir: /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m
-info => Loading presets
-info => Building manager..
-WARN unable to find package.json for @citizenlab/cl2-component-library
-info => Manager built (132 ms)
-info => Building preview..
-info => Copying static files: /Users/work/Projects/citizenlab/front/node_modules/@storybook/manager/static at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m/sb-common-assets
-info Addon-docs: using MDX2
-info => Using implicit CSS loaders
-info => Using default Webpack5 setup
-<s> [webpack.Progress] 0% 
-
-<s> [webpack.Progress] 1% setup before run
-<s> [webpack.Progress] 1% setup before run NodeEnvironmentPlugin
-<s> [webpack.Progress] 1% setup before run
-<s> [webpack.Progress] 2% setup run
-<s> [webpack.Progress] 2% setup run
-<s> [webpack.Progress] 4% setup normal module factory
-<s> [webpack.Progress] 4% setup normal module factory CaseSensitivePathsPlugin
-<s> [webpack.Progress] 4% setup normal module factory
-<s> [webpack.Progress] 5% setup context module factory
-<s> [webpack.Progress] 5% setup context module factory
-<s> [webpack.Progress] 6% setup before compile
-<s> [webpack.Progress] 6% setup before compile ProgressPlugin
-<s> [webpack.Progress] 6% setup before compile
-<s> [webpack.Progress] 7% setup compile
-<s> [webpack.Progress] 7% setup compile ExternalsPlugin
-<s> [webpack.Progress] 7% setup compile ExternalsPlugin
-<s> [webpack.Progress] 7% setup compile
-<s> [webpack.Progress] 8% setup compilation
-<s> [webpack.Progress] 8% setup compilation unplugin-csf
-<s> [webpack.Progress] 8% setup compilation ArrayPushCallbackChunkFormatPlugin
-<s> [webpack.Progress] 8% setup compilation JsonpChunkLoadingPlugin
-<s> [webpack.Progress] 8% setup compilation StartupChunkDependenciesPlugin
-<s> [webpack.Progress] 8% setup compilation ImportScriptsChunkLoadingPlugin
-<s> [webpack.Progress] 8% setup compilation FetchCompileWasmPlugin
-<s> [webpack.Progress] 8% setup compilation FetchCompileAsyncWasmPlugin
-<s> [webpack.Progress] 8% setup compilation WorkerPlugin
-<s> [webpack.Progress] 8% setup compilation SplitChunksPlugin
-<s> [webpack.Progress] 8% setup compilation RuntimeChunkPlugin
-<s> [webpack.Progress] 8% setup compilation ResolverCachePlugin
-<s> [webpack.Progress] 8% setup compilation HtmlWebpackPlugin
-<s> [webpack.Progress] 8% setup compilation
-<s> [webpack.Progress] 9% setup compilation
-<s> [webpack.Progress] 9% setup compilation DefinePlugin
-<s> [webpack.Progress] 9% setup compilation ProvidePlugin
-<s> [webpack.Progress] 9% setup compilation ProgressPlugin
-<s> [webpack.Progress] 9% setup compilation DocGenPlugin
-<s> [webpack.Progress] 9% setup compilation ProvidePlugin
-<s> [webpack.Progress] 9% setup compilation ChunkPrefetchPreloadPlugin
-<s> [webpack.Progress] 9% setup compilation SourceMapDevToolPlugin
-<s> [webpack.Progress] 9% setup compilation JavascriptModulesPlugin
-<s> [webpack.Progress] 9% setup compilation JsonModulesPlugin
-<s> [webpack.Progress] 9% setup compilation AssetModulesPlugin
-<s> [webpack.Progress] 9% setup compilation EntryPlugin
-<s> [webpack.Progress] 9% setup compilation RuntimePlugin
-<s> [webpack.Progress] 9% setup compilation InferAsyncModulesPlugin
-<s> [webpack.Progress] 9% setup compilation DataUriPlugin
-<s> [webpack.Progress] 9% setup compilation FileUriPlugin
-<s> [webpack.Progress] 9% setup compilation CompatibilityPlugin
-<s> [webpack.Progress] 9% setup compilation HarmonyModulesPlugin
-<s> [webpack.Progress] 9% setup compilation AMDPlugin
-<s> [webpack.Progress] 9% setup compilation RequireJsStuffPlugin
-<s> [webpack.Progress] 9% setup compilation CommonJsPlugin
-<s> [webpack.Progress] 9% setup compilation LoaderPlugin
-<s> [webpack.Progress] 9% setup compilation LoaderPlugin
-<s> [webpack.Progress] 9% setup compilation NodeStuffPlugin
-<s> [webpack.Progress] 9% setup compilation APIPlugin
-<s> [webpack.Progress] 9% setup compilation ExportsInfoApiPlugin
-<s> [webpack.Progress] 9% setup compilation WebpackIsIncludedPlugin
-<s> [webpack.Progress] 9% setup compilation ConstPlugin
-<s> [webpack.Progress] 9% setup compilation UseStrictPlugin
-<s> [webpack.Progress] 9% setup compilation RequireIncludePlugin
-<s> [webpack.Progress] 9% setup compilation RequireEnsurePlugin
-<s> [webpack.Progress] 9% setup compilation RequireContextPlugin
-<s> [webpack.Progress] 9% setup compilation ImportPlugin
-<s> [webpack.Progress] 9% setup compilation ImportMetaContextPlugin
-<s> [webpack.Progress] 9% setup compilation SystemPlugin
-<s> [webpack.Progress] 9% setup compilation ImportMetaPlugin
-<s> [webpack.Progress] 9% setup compilation URLPlugin
-<s> [webpack.Progress] 9% setup compilation DefaultStatsFactoryPlugin
-<s> [webpack.Progress] 9% setup compilation DefaultStatsPresetPlugin
-<s> [webpack.Progress] 9% setup compilation DefaultStatsPrinterPlugin
-<s> [webpack.Progress] 9% setup compilation JavascriptMetaInfoPlugin
-<s> [webpack.Progress] 9% setup compilation EnsureChunkConditionsPlugin
-<s> [webpack.Progress] 9% setup compilation RemoveEmptyChunksPlugin
-<s> [webpack.Progress] 9% setup compilation MergeDuplicateChunksPlugin
-<s> [webpack.Progress] 9% setup compilation FlagIncludedChunksPlugin
-<s> [webpack.Progress] 9% setup compilation SideEffectsFlagPlugin
-<s> [webpack.Progress] 9% setup compilation FlagDependencyExportsPlugin
-<s> [webpack.Progress] 9% setup compilation FlagDependencyUsagePlugin
-<s> [webpack.Progress] 9% setup compilation InnerGraphPlugin
-<s> [webpack.Progress] 9% setup compilation MangleExportsPlugin
-<s> [webpack.Progress] 9% setup compilation ModuleConcatenationPlugin
-<s> [webpack.Progress] 9% setup compilation NoEmitOnErrorsPlugin
-<s> [webpack.Progress] 9% setup compilation RealContentHashPlugin
-<s> [webpack.Progress] 9% setup compilation WasmFinalizeExportsPlugin
-<s> [webpack.Progress] 9% setup compilation NamedModuleIdsPlugin
-<s> [webpack.Progress] 9% setup compilation DeterministicChunkIdsPlugin
-<s> [webpack.Progress] 9% setup compilation DefinePlugin
-<s> [webpack.Progress] 9% setup compilation TerserPlugin
-<s> [webpack.Progress] 9% setup compilation TemplatedPathPlugin
-<s> [webpack.Progress] 9% setup compilation RecordIdsPlugin
-<s> [webpack.Progress] 9% setup compilation WarnCaseSensitiveModulesPlugin
-<s> [webpack.Progress] 9% setup compilation IgnoreWarningsPlugin
-<s> [webpack.Progress] 9% setup compilation
-<s> [webpack.Progress] 10% building
-<s> [webpack.Progress] 10% building 0/1 entries 0/0 dependencies 0/0 modules
-<s> [webpack.Progress] 25% building import loader ./node_modules/@storybook/builder-webpack5/node_modules/babel-loader/lib/index.js
-<s> [webpack.Progress] 25% building 0/1 entries 11/18 dependencies 3/11 modules
-info => Copying static files: /Users/work/Projects/citizenlab/front/.storybook/public at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m/
-info => Copying static files: /Users/work/Projects/citizenlab/front/.storybook/static at /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m/
-<s> [webpack.Progress] 15% building import loader ./node_modules/unplugin/dist/webpack/loaders/load.js
-<s> [webpack.Progress] 15% building 0/1 entries 191/242 dependencies 14/135 modules
-<s> [webpack.Progress] 39% building 0/1 entries 253/300 dependencies 99/184 modules
-<s> [webpack.Progress] 32% building import loader ./node_modules/style-loader/dist/cjs.js
-<s> [webpack.Progress] 32% building import loader ./node_modules/css-loader/dist/cjs.js
-<s> [webpack.Progress] 32% building 0/1 entries 606/654 dependencies 136/337 modules
-WARN No story files found for the specified pattern: app/**/*.mdx
-<s> [webpack.Progress] 33% building 0/1 entries 900/1046 dependencies 186/432 modules
-<s> [webpack.Progress] 34% building 0/1 entries 1282/1941 dependencies 272/600 modules
-<s> [webpack.Progress] 26% building 0/1 entries 2324/2400 dependencies 371/1216 modules
-<s> [webpack.Progress] 27% building 0/1 entries 4378/4471 dependencies 535/1700 modules
-<s> [webpack.Progress] 36% building 0/1 entries 6368/6400 dependencies 1108/2309 modules
-<s> [webpack.Progress] 49% building 0/1 entries 8557/8624 dependencies 1948/2700 modules
-<s> [webpack.Progress] 65% building 1/1 entries 11222/11222 dependencies 3372/3372 modules
-<s> [webpack.Progress] 65% building
-<s> [webpack.Progress] 69% building finish
-<s> [webpack.Progress] 69% building finish
-<s> [webpack.Progress] 70% sealing finish module graph
-<s> [webpack.Progress] 70% sealing finish module graph ResolverCachePlugin
-<s> [webpack.Progress] 70% sealing finish module graph InferAsyncModulesPlugin
-<s> [webpack.Progress] 70% sealing finish module graph FlagDependencyExportsPlugin
-<s> [webpack.Progress] 70% sealing finish module graph InnerGraphPlugin
-<s> [webpack.Progress] 70% sealing finish module graph WasmFinalizeExportsPlugin
-<s> [webpack.Progress] 70% sealing finish module graph
-<s> [webpack.Progress] 70% sealing plugins
-<s> [webpack.Progress] 70% sealing plugins DocGenPlugin
-<s> [webpack.Progress] 70% sealing plugins WarnCaseSensitiveModulesPlugin
-<s> [webpack.Progress] 70% sealing plugins
-<s> [webpack.Progress] 71% sealing dependencies optimization
-<s> [webpack.Progress] 71% sealing dependencies optimization SideEffectsFlagPlugin
-<s> [webpack.Progress] 71% sealing dependencies optimization FlagDependencyUsagePlugin
-<s> [webpack.Progress] 71% sealing dependencies optimization
-<s> [webpack.Progress] 71% sealing after dependencies optimization
-<s> [webpack.Progress] 71% sealing after dependencies optimization
-<s> [webpack.Progress] 72% sealing chunk graph
-<s> [webpack.Progress] 72% sealing chunk graph
-<s> [webpack.Progress] 73% sealing after chunk graph
-<s> [webpack.Progress] 73% sealing after chunk graph
-<s> [webpack.Progress] 73% sealing optimizing
-<s> [webpack.Progress] 73% sealing optimizing
-<s> [webpack.Progress] 74% sealing module optimization
-<s> [webpack.Progress] 74% sealing module optimization
-<s> [webpack.Progress] 75% sealing after module optimization
-<s> [webpack.Progress] 75% sealing after module optimization
-<s> [webpack.Progress] 75% sealing chunk optimization
-<s> [webpack.Progress] 75% sealing chunk optimization EnsureChunkConditionsPlugin
-<s> [webpack.Progress] 75% sealing chunk optimization RemoveEmptyChunksPlugin
-<s> [webpack.Progress] 75% sealing chunk optimization MergeDuplicateChunksPlugin
-<s> [webpack.Progress] 75% sealing chunk optimization SplitChunksPlugin
-<s> [webpack.Progress] 75% sealing chunk optimization RemoveEmptyChunksPlugin
-<s> [webpack.Progress] 75% sealing chunk optimization
-<s> [webpack.Progress] 76% sealing after chunk optimization
-<s> [webpack.Progress] 76% sealing after chunk optimization
-<s> [webpack.Progress] 77% sealing module and chunk tree optimization
-<s> [webpack.Progress] 77% sealing module and chunk tree optimization PersistentChildCompilerSingletonPlugin
-<s> [webpack.Progress] 77% sealing module and chunk tree optimization
-<s> [webpack.Progress] 77% sealing after module and chunk tree optimization
-<s> [webpack.Progress] 77% sealing after module and chunk tree optimization
-<s> [webpack.Progress] 78% sealing chunk modules optimization
-<s> [webpack.Progress] 78% sealing chunk modules optimization ModuleConcatenationPlugin
-<s> [webpack.Progress] 78% sealing chunk modules optimization
-<s> [webpack.Progress] 78% sealing after chunk modules optimization
-<s> [webpack.Progress] 78% sealing after chunk modules optimization
-<s> [webpack.Progress] 79% sealing module reviving
-<s> [webpack.Progress] 79% sealing module reviving RecordIdsPlugin
-<s> [webpack.Progress] 79% sealing module reviving
-<s> [webpack.Progress] 80% sealing before module ids
-<s> [webpack.Progress] 80% sealing before module ids
-<s> [webpack.Progress] 80% sealing module ids
-<s> [webpack.Progress] 80% sealing module ids NamedModuleIdsPlugin
-<s> [webpack.Progress] 80% sealing module ids
-<s> [webpack.Progress] 81% sealing module id optimization
-<s> [webpack.Progress] 81% sealing module id optimization
-<s> [webpack.Progress] 82% sealing module id optimization
-<s> [webpack.Progress] 82% sealing module id optimization
-<s> [webpack.Progress] 82% sealing chunk reviving
-<s> [webpack.Progress] 82% sealing chunk reviving RecordIdsPlugin
-<s> [webpack.Progress] 82% sealing chunk reviving
-<s> [webpack.Progress] 83% sealing before chunk ids
-<s> [webpack.Progress] 83% sealing before chunk ids
-<s> [webpack.Progress] 84% sealing chunk ids
-<s> [webpack.Progress] 84% sealing chunk ids DeterministicChunkIdsPlugin
-<s> [webpack.Progress] 84% sealing chunk ids
-<s> [webpack.Progress] 84% sealing chunk id optimization
-<s> [webpack.Progress] 84% sealing chunk id optimization FlagIncludedChunksPlugin
-<s> [webpack.Progress] 84% sealing chunk id optimization
-<s> [webpack.Progress] 85% sealing after chunk id optimization
-<s> [webpack.Progress] 85% sealing after chunk id optimization
-<s> [webpack.Progress] 86% sealing record modules
-<s> [webpack.Progress] 86% sealing record modules RecordIdsPlugin
-<s> [webpack.Progress] 86% sealing record modules
-<s> [webpack.Progress] 86% sealing record chunks
-<s> [webpack.Progress] 86% sealing record chunks RecordIdsPlugin
-<s> [webpack.Progress] 86% sealing record chunks
-<s> [webpack.Progress] 87% sealing module hashing
-<s> [webpack.Progress] 87% sealing module hashing
-<s> [webpack.Progress] 87% sealing code generation
-<s> [webpack.Progress] 87% sealing code generation
-<s> [webpack.Progress] 88% sealing runtime requirements
-<s> [webpack.Progress] 88% sealing runtime requirements
-<s> [webpack.Progress] 89% sealing hashing
-<s> [webpack.Progress] 89% sealing hashing
-<s> [webpack.Progress] 89% sealing after hashing
-<s> [webpack.Progress] 89% sealing after hashing
-<s> [webpack.Progress] 90% sealing record hash
-<s> [webpack.Progress] 90% sealing record hash
-<s> [webpack.Progress] 91% sealing module assets processing
-<s> [webpack.Progress] 91% sealing module assets processing
-<s> [webpack.Progress] 91% sealing chunk assets processing
-<s> [webpack.Progress] 91% sealing chunk assets processing
-<s> [webpack.Progress] 92% sealing asset processing
-<s> [webpack.Progress] 92% sealing asset processing PersistentChildCompilerSingletonPlugin
-<s> [webpack.Progress] 92% sealing asset processing TerserPlugin
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.62975a8d.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.62975a8d.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin runtime~main.14c53d21.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin runtime~main.14c53d21.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.35c7e18f.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.35c7e18f.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.6184407e.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.6184407e.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.ac4e41d8.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.ac4e41d8.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-UI-Button-Button-stories.472927b1.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-UI-Button-Button-stories.472927b1.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.b2bb1700.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.b2bb1700.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 341.054adc48.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 341.054adc48.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 595.518ac58f.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 595.518ac58f.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 296.9e0211e0.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 296.9e0211e0.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 984.1b930f3f.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 984.1b930f3f.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 89.b1006dc0.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 89.b1006dc0.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 658.2c4d103e.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 658.2c4d103e.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 618.79060e8c.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 618.79060e8c.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 187.f04cbf6f.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 187.f04cbf6f.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 822.e8259551.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 822.e8259551.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 316.f4ee42ff.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 316.f4ee42ff.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.4b787044.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.4b787044.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 154.8c565515.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 154.8c565515.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 17.9d9eb9f8.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 17.9d9eb9f8.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin resolve sources
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.62975a8d.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.62975a8d.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.35c7e18f.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-IdeaCard-IdeaCard-stories.35c7e18f.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.6184407e.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-InitiativeCard-InitiativeCard-stories.6184407e.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.ac4e41d8.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin components-ProjectCard-ProjectCard-stories.ac4e41d8.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.b2bb1700.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 921.b2bb1700.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 426.d167bd00.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 187.f04cbf6f.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 187.f04cbf6f.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.4b787044.iframe.bundle.js attach SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 945.4b787044.iframe.bundle.js attached SourceMap
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin resolve sources
-<s> [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin
-<s> [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin
-<s> [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin
-<s> [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin resolve sources
-<s> [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin runtime~main.28b76233.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin runtime~main.28b76233.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin components-UI-Button-Button-stories.996e1b0d.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin components-UI-Button-Button-stories.996e1b0d.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 341.3e1b3d5d.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 341.3e1b3d5d.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 595.db9b2253.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 595.db9b2253.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 296.7a190b38.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 296.7a190b38.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 984.669e1bd6.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 984.669e1bd6.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 822.a989025b.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 822.a989025b.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 316.b155684f.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 316.b155684f.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 154.dd5cbaca.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 154.dd5cbaca.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 17.7aa950fc.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 17.7aa950fc.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 89.49ba2b9b.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 89.49ba2b9b.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 658.f4114154.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 658.f4114154.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 618.4ed43471.iframe.bundle.js generate SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 618.4ed43471.iframe.bundle.js generated SourceMap
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin resolve sources
-<s> [webpack.Progress] 92% sealing asset processing RealContentHashPlugin
-<s> [webpack.Progress] 92% sealing asset processing
-<s> [webpack.Progress] 93% sealing after asset optimization
-<s> [webpack.Progress] 93% sealing after asset optimization
-<s> [webpack.Progress] 93% sealing recording
-<s> [webpack.Progress] 93% sealing recording
-<s> [webpack.Progress] 94% sealing after seal
-<s> [webpack.Progress] 94% sealing after seal
-<s> [webpack.Progress] 95% emitting emit
-<s> [webpack.Progress] 95% emitting emit
-<s> [webpack.Progress] 98% emitting after emit
-<s> [webpack.Progress] 98% emitting after emit SizeLimitsPlugin
-<s> [webpack.Progress] 98% emitting after emit
-<s> [webpack.Progress] 99% done plugins
-<s> [webpack.Progress] 99% done plugins CaseSensitivePathsPlugin
-<s> [webpack.Progress] 99% done plugins
-<s> [webpack.Progress] 99% 
-
-<s> [webpack.Progress] 99% cache store build dependencies
-<s> [webpack.Progress] 99% cache store build dependencies
-<s> [webpack.Progress] 99% cache begin idle
-<s> [webpack.Progress] 99% cache begin idle
-<s> [webpack.Progress] 100% 
-
-WARN asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
-WARN This can impact web performance.
-WARN Assets: 
-WARN   main.1aa9f768.iframe.bundle.js (13.7 MiB)
-WARN   921.f1183820.iframe.bundle.js (685 KiB)
-WARN   426.c9f8ef29.iframe.bundle.js (583 KiB)
-WARN   89.49ba2b9b.iframe.bundle.js (984 KiB)
-WARN   658.f4114154.iframe.bundle.js (438 KiB)
-WARN   187.08e58d7f.iframe.bundle.js (2.43 MiB)
-WARN entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
-WARN Entrypoints:
-WARN   main (16.1 MiB)
-WARN       runtime~main.28b76233.iframe.bundle.js
-WARN       187.08e58d7f.iframe.bundle.js
-WARN       main.1aa9f768.iframe.bundle.js
-WARN 
-<s> [webpack.Progress] 99% cache shutdown
-<s> [webpack.Progress] 99% cache shutdown
-<s> [webpack.Progress] 100% 
-
-info => Preview built (21 s)
-info => Output directory: /var/folders/2n/rp48lc0d45d4h_t44jhtwgvm0000gn/T/chromatic--10410-rs0Vtde9Je1m

From 16c591219eccb3a6fd6e3470f3338859b03f7f51 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 26 Jan 2024 13:36:20 +0100
Subject: [PATCH 006/282] Remove weird attributes from package.json

---
 front/package.json | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/front/package.json b/front/package.json
index 89401801e4b0..b29a3921967a 100644
--- a/front/package.json
+++ b/front/package.json
@@ -267,7 +267,5 @@
   },
   "msw": {
     "workerDirectory": ".storybook/public"
-  },
-  "readme": "ERROR: No README data found!",
-  "_id": "cl2-front@1.0.0"
+  }
 }

From 4bfc254f431cc0797c4e6d19e3a50ed9dff8dde2 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 26 Jan 2024 14:04:54 +0100
Subject: [PATCH 007/282] Fix voting card

---
 front/app/api/phases/__mocks__/_mockServer.ts | 65 +++++++++++++++++++
 .../components/IdeaCard/IdeaCard.stories.tsx  |  3 +
 front/app/components/IdeaCard/index.tsx       |  1 +
 3 files changed, 69 insertions(+)

diff --git a/front/app/api/phases/__mocks__/_mockServer.ts b/front/app/api/phases/__mocks__/_mockServer.ts
index 9c173ceb391d..e6b36deb5dba 100644
--- a/front/app/api/phases/__mocks__/_mockServer.ts
+++ b/front/app/api/phases/__mocks__/_mockServer.ts
@@ -305,4 +305,69 @@ const endpoints = {
   ),
 };
 
+const votingPhase: any = {
+  id: 'voting-phase',
+  type: 'phase',
+  attributes: {
+    allow_anonymous_participation: false,
+    title_multiloc: { en: 'A Mock voting phase' },
+    description_multiloc: { en: 'For testing purposes' },
+    participation_method: 'voting',
+    voting_method: 'single_voting',
+    poll_anonymous: false,
+    survey_embed_url: null,
+    survey_service: null,
+    document_annotation_embed_url: null,
+    start_at: '2023-11-12',
+    end_at: '2025-11-19',
+    created_at: '2023-11-12T11:05:43.934Z',
+    updated_at: '2024-01-25T17:29:22.242Z',
+    ideas_count: 0,
+    campaigns_settings: {
+      project_phase_started: true,
+    },
+    posting_enabled: true,
+    posting_method: 'unlimited',
+    posting_limited_max: 1,
+    commenting_enabled: true,
+    reacting_enabled: true,
+    reacting_like_method: 'unlimited',
+    reacting_like_limited_max: 10,
+    reacting_dislike_enabled: true,
+    reacting_dislike_method: 'unlimited',
+    reacting_dislike_limited_max: 10,
+    presentation_mode: 'card',
+    ideas_order: 'random',
+    input_term: 'idea',
+    voting_max_total: 1,
+    voting_min_total: 0,
+    voting_max_votes_per_idea: 1,
+    baskets_count: 0,
+    voting_term_singular_multiloc: {
+      en: 'vote',
+      'nl-BE': 'stem',
+      'fr-BE': 'vote',
+      'de-DE': 'Stimme',
+      'es-CL': 'votar',
+      'sr-Latn': 'vote',
+      'da-DK': 'stem',
+    },
+    voting_term_plural_multiloc: {
+      en: 'votes',
+      'nl-BE': 'stemmen',
+      'fr-BE': 'votes',
+      'de-DE': 'Stimmen',
+      'es-CL': 'votos',
+      'sr-Latn': 'votes',
+      'da-DK': 'afstemninger',
+    },
+    votes_count: 0,
+    previous_phase_end_at_updated: false,
+  },
+};
+
+export const votingPhaseHandler = rest.get(apiPathPhase, (_req, res, ctx) => {
+  return res(ctx.status(200), ctx.json({ data: votingPhase }));
+});
+
 export default endpoints;
diff --git a/front/app/components/IdeaCard/IdeaCard.stories.tsx b/front/app/components/IdeaCard/IdeaCard.stories.tsx
index 8f560ee4a290..dc74ff426177 100644
--- a/front/app/components/IdeaCard/IdeaCard.stories.tsx
+++ b/front/app/components/IdeaCard/IdeaCard.stories.tsx
@@ -4,6 +4,7 @@ import mockEndpoints from 'utils/storybook/mockEndpoints';
 import { votingProjectHandler } from 'api/projects/__mocks__/_mockServer';
 import { votingIdeaHandler } from 'api/ideas/__mocks__/_mockServer';
 import { VotingContext } from 'api/baskets_ideas/useVoting';
+import { votingPhaseHandler } from 'api/phases/__mocks__/_mockServer';
 
 import IdeaCard from '.';
 
@@ -42,6 +43,7 @@ export const Voting: Story = {
   ),
   args: {
     ideaId: '1',
+    phaseId: 'ph1',
     hideImage: false,
     hideImagePlaceholder: false,
   },
@@ -49,6 +51,7 @@ export const Voting: Story = {
     msw: mockEndpoints({
       'GET projects/:id': votingProjectHandler,
       'GET ideas/:id': votingIdeaHandler,
+      'GET phases/:id': votingPhaseHandler,
     }),
   },
 };
diff --git a/front/app/components/IdeaCard/index.tsx b/front/app/components/IdeaCard/index.tsx
index a36b0af5a0a1..3bcb6503e227 100644
--- a/front/app/components/IdeaCard/index.tsx
+++ b/front/app/components/IdeaCard/index.tsx
@@ -105,6 +105,7 @@ const IdeaCard = ({
   const { data: project } = useProjectById(
     idea.data.relationships.project.data.id
   );
+
   const { data: phase } = usePhase(phaseId);
 
   const phaseData = phase?.data;

From 524451bc2c489317352689582a3bdda910222f08 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 26 Jan 2024 14:23:24 +0100
Subject: [PATCH 008/282] Fix types and ignore storybook build log

---
 front/.gitignore                              |  1 +
 front/app/api/phases/__mocks__/_mockServer.ts | 16 ++++++++++++----
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/front/.gitignore b/front/.gitignore
index b4a554692419..ac863fde8e2a 100644
--- a/front/.gitignore
+++ b/front/.gitignore
@@ -25,6 +25,7 @@ browserstack.err
 .babel-cache/*
 .cache-loader/*
 app/tsconfig.tsbuildinfo
+build-storybook.log
 
 cypress/videos/
 cypress/screenshots/
diff --git a/front/app/api/phases/__mocks__/_mockServer.ts b/front/app/api/phases/__mocks__/_mockServer.ts
index e6b36deb5dba..dedeeab3385a 100644
--- a/front/app/api/phases/__mocks__/_mockServer.ts
+++ b/front/app/api/phases/__mocks__/_mockServer.ts
@@ -305,7 +305,7 @@ const endpoints = {
   ),
 };
 
-const votingPhase: any = {
+const votingPhase: IPhaseData = {
   id: 'voting-phase',
   type: 'phase',
   attributes: {
@@ -327,8 +327,6 @@ const votingPhase: any = {
       project_phase_started: true,
     },
     posting_enabled: true,
-    posting_method: 'unlimited',
-    posting_limited_max: 1,
     commenting_enabled: true,
     reacting_enabled: true,
     reacting_like_method: 'unlimited',
@@ -362,7 +360,17 @@ const votingPhase: any = {
       'da-DK': 'afstemninger',
     },
     votes_count: 0,
-    previous_phase_end_at_updated: false,
+  },
+  relationships: {
+    permissions: {
+      data: [],
+    },
+    project: {
+      data: {
+        id: 'projectId',
+        type: 'project',
+      },
+    },
   },
 };
 

From 9d12a52ffe18e592d2bf683fb536143194eb8b0d Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Mon, 29 Jan 2024 09:58:46 +0000
Subject: [PATCH 009/282] _

---
 front/package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/package.json b/front/package.json
index b29a3921967a..e536a0d083d5 100644
--- a/front/package.json
+++ b/front/package.json
@@ -38,7 +38,7 @@
     "dependency-cruiser": "depcruise app  --validate",
     "storybook": "storybook dev -p 6006",
     "build-storybook": "storybook build",
-    "chromatic": "npx chromatic --project-token=chpt_899ad5671ea1dce"
+    "chromatic": "chromatic --exit-zero-on-changes"
   },
   "jest-junit": {
     "addFileAttribute": "true"

From afd731fd9e2cd20613889aa649894c456489b069 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Thu, 30 Nov 2023 11:47:49 +0100
Subject: [PATCH 010/282] Add WhinyOpenStruct and use it for email campaigns

---
 back/app/mailers/application_mailer.rb       |  2 +-
 back/app/services/whiny_open_struct.rb       | 27 ++++++++++++++
 back/spec/services/whiny_open_struct_spec.rb | 37 ++++++++++++++++++++
 3 files changed, 65 insertions(+), 1 deletion(-)
 create mode 100644 back/app/services/whiny_open_struct.rb
 create mode 100644 back/spec/services/whiny_open_struct_spec.rb

diff --git a/back/app/mailers/application_mailer.rb b/back/app/mailers/application_mailer.rb
index 0bb70e43cb76..49fd4a4942a4 100644
--- a/back/app/mailers/application_mailer.rb
+++ b/back/app/mailers/application_mailer.rb
@@ -203,7 +203,7 @@ def text_direction
 
   def to_deep_struct(obj)
     case obj
-    when Hash  then OpenStruct.new(obj.transform_values { |nested_object| to_deep_struct(nested_object) })
+    when Hash  then WhinyOpenStruct.new(obj.transform_values { |nested_object| to_deep_struct(nested_object) })
     when Array then obj.map { |nested_object| to_deep_struct(nested_object) }
     else            obj
     end
diff --git a/back/app/services/whiny_open_struct.rb b/back/app/services/whiny_open_struct.rb
new file mode 100644
index 000000000000..ea283cde93ff
--- /dev/null
+++ b/back/app/services/whiny_open_struct.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+# rubocop:disable Style/OpenStructUse
+
+# Latest OpenStruct implementation doesn't define `respond_to_missing?` method
+# https://github.com/ruby/ruby/blob/v3_2_0/lib/ostruct.rb
+# rubocop:disable Style/MissingRespondToMissing
+
+# Inspired by https://stackoverflow.com/a/16905766
+class WhinyOpenStruct < OpenStruct
+  def initialize(hash, raise_exception: true)
+    @raise_exception = raise_exception
+    super(hash)
+  end
+
+  # See https://github.com/ruby/ruby/blob/v2_7_6/lib/ostruct.rb#L99
+  def method_missing(meth, *args)
+    if !meth.to_s.end_with?('=') && !@table.key?(meth)
+      msg = "No '#{meth}' member set yet"
+      @raise_exception ? raise(NoMethodError, msg) : ErrorReporter.report_msg(msg)
+    end
+
+    super
+  end
+end
+# rubocop:enable Style/OpenStructUse
+# rubocop:enable Style/MissingRespondToMissing
diff --git a/back/spec/services/whiny_open_struct_spec.rb b/back/spec/services/whiny_open_struct_spec.rb
new file mode 100644
index 000000000000..e98a587974a7
--- /dev/null
+++ b/back/spec/services/whiny_open_struct_spec.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe WhinyOpenStruct do
+  describe '#method_missing' do
+    context 'when raise_exception is true' do
+      it 'raises error when unknown method is called' do
+        hash = { qwe: 123 }
+        whiny_open_struct = described_class.new(hash)
+        expect { whiny_open_struct.unknown_method }.to raise_error(NoMethodError)
+      end
+
+      it 'does not raise error when trying to access existing member' do
+        hash = { key: 'value' }
+        whiny_open_struct = described_class.new(hash)
+        expect { whiny_open_struct.key }.not_to raise_error
+        expect(whiny_open_struct.key).to eq('value')
+      end
+    end
+
+    context 'when raise_exception is false' do
+      it 'does not raise error when unknown method is called' do
+        hash = {}
+        whiny_open_struct = described_class.new(hash, raise_exception: false)
+        expect { whiny_open_struct.unknown_method }.not_to raise_error
+      end
+
+      it 'does not raise error when trying to access existing member' do
+        hash = { key: 'value' }
+        whiny_open_struct = described_class.new(hash)
+        expect { whiny_open_struct.key }.not_to raise_error
+        expect(whiny_open_struct.key).to eq('value')
+      end
+    end
+  end
+end

From 5ee02202b4c4ab5edf543f06cc8c188e452f293b Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Thu, 30 Nov 2023 11:50:17 +0100
Subject: [PATCH 011/282] Do not raise exception in email campaigns
 WhinyOpenStruct for now

---
 back/app/mailers/application_mailer.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/back/app/mailers/application_mailer.rb b/back/app/mailers/application_mailer.rb
index 49fd4a4942a4..2d4acff95771 100644
--- a/back/app/mailers/application_mailer.rb
+++ b/back/app/mailers/application_mailer.rb
@@ -203,7 +203,7 @@ def text_direction
 
   def to_deep_struct(obj)
     case obj
-    when Hash  then WhinyOpenStruct.new(obj.transform_values { |nested_object| to_deep_struct(nested_object) })
+    when Hash  then WhinyOpenStruct.new(obj.transform_values { |nested_object| to_deep_struct(nested_object) }, raise_exception: false)
     when Array then obj.map { |nested_object| to_deep_struct(nested_object) }
     else            obj
     end

From 92353ef306066eb60a9366e8e91a8efdb63fa222 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Thu, 30 Nov 2023 12:04:44 +0100
Subject: [PATCH 012/282] Add ErrorReporter.report_msg expectations

---
 back/spec/services/whiny_open_struct_spec.rb | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/back/spec/services/whiny_open_struct_spec.rb b/back/spec/services/whiny_open_struct_spec.rb
index e98a587974a7..6ce264e3fc98 100644
--- a/back/spec/services/whiny_open_struct_spec.rb
+++ b/back/spec/services/whiny_open_struct_spec.rb
@@ -8,12 +8,14 @@
       it 'raises error when unknown method is called' do
         hash = { qwe: 123 }
         whiny_open_struct = described_class.new(hash)
+        expect(ErrorReporter).not_to receive(:report_msg)
         expect { whiny_open_struct.unknown_method }.to raise_error(NoMethodError)
       end
 
       it 'does not raise error when trying to access existing member' do
         hash = { key: 'value' }
         whiny_open_struct = described_class.new(hash)
+        expect(ErrorReporter).not_to receive(:report_msg)
         expect { whiny_open_struct.key }.not_to raise_error
         expect(whiny_open_struct.key).to eq('value')
       end
@@ -23,12 +25,14 @@
       it 'does not raise error when unknown method is called' do
         hash = {}
         whiny_open_struct = described_class.new(hash, raise_exception: false)
+        expect(ErrorReporter).to receive(:report_msg).and_call_original
         expect { whiny_open_struct.unknown_method }.not_to raise_error
       end
 
       it 'does not raise error when trying to access existing member' do
         hash = { key: 'value' }
         whiny_open_struct = described_class.new(hash)
+        expect(ErrorReporter).not_to receive(:report_msg)
         expect { whiny_open_struct.key }.not_to raise_error
         expect(whiny_open_struct.key).to eq('value')
       end

From 57ee850b5d830a271d7e895d5e049185d059b485 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Wed, 31 Jan 2024 13:58:15 +0100
Subject: [PATCH 013/282] Ignore some absent fields (mostly used in shared
 partials)

---
 back/app/mailers/application_mailer.rb             | 14 +++++++++-----
 .../mention_in_official_feedback_mailer.rb         |  2 +-
 .../email_campaigns/official_feedbacks/_card.mjml  |  2 +-
 .../email_campaigns/posts/_post_with_image.mjml    |  4 ++--
 4 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/back/app/mailers/application_mailer.rb b/back/app/mailers/application_mailer.rb
index 2d4acff95771..89091632c434 100644
--- a/back/app/mailers/application_mailer.rb
+++ b/back/app/mailers/application_mailer.rb
@@ -134,7 +134,7 @@ def default_from_email
   end
 
   def raw_from_email
-    app_settings.core.from_email.presence || default_from_email
+    app_settings.core['from_email'].presence || default_from_email
   end
 
   def to_email
@@ -142,7 +142,7 @@ def to_email
   end
 
   def reply_to_email
-    app_settings.core.reply_to_email.presence || default_from_email
+    app_settings.core['reply_to_email'].presence || default_from_email
   end
 
   def domain
@@ -203,9 +203,13 @@ def text_direction
 
   def to_deep_struct(obj)
     case obj
-    when Hash  then WhinyOpenStruct.new(obj.transform_values { |nested_object| to_deep_struct(nested_object) }, raise_exception: false)
-    when Array then obj.map { |nested_object| to_deep_struct(nested_object) }
-    else            obj
+    when Hash
+      struct_obj = obj.transform_values { |nested_object| to_deep_struct(nested_object) }
+      WhinyOpenStruct.new(struct_obj, raise_exception: false)
+    when Array
+      obj.map { |nested_object| to_deep_struct(nested_object) }
+    else
+      obj
     end
   end
 end
diff --git a/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb b/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb
index 5f04c3f90b9d..c4ac7c0fe49c 100644
--- a/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb
+++ b/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb
@@ -29,7 +29,7 @@ def header_message
     end
 
     def preheader
-      format_message('preheader', values: { commentAuthor: event.initiating_user_first_name })
+      format_message('preheader', values: { commentAuthor: event['initiating_user_first_name'] })
     end
   end
 end
diff --git a/back/engines/free/email_campaigns/app/views/email_campaigns/official_feedbacks/_card.mjml b/back/engines/free/email_campaigns/app/views/email_campaigns/official_feedbacks/_card.mjml
index 6f93a851a1b3..15f370b4827c 100644
--- a/back/engines/free/email_campaigns/app/views/email_campaigns/official_feedbacks/_card.mjml
+++ b/back/engines/free/email_campaigns/app/views/email_campaigns/official_feedbacks/_card.mjml
@@ -8,7 +8,7 @@
         <%= localize_for_recipient(event.post_title_multiloc) %>
       </h2>
       <p style="margin-top: 10px; color: #84939E;">
-        <%= localize_for_recipient(event.post_body_multiloc) %>
+        <%= localize_for_recipient(event['post_body_multiloc']) %>
       </p>
       <p style="margin-top: 10px; color: #84939E;">
         <%= format_message('by_author', component: 'general', values: { authorName: event.post_author_name }) %>
diff --git a/back/engines/free/email_campaigns/app/views/email_campaigns/posts/_post_with_image.mjml b/back/engines/free/email_campaigns/app/views/email_campaigns/posts/_post_with_image.mjml
index fb8c6edf2a42..be4b0ab0c269 100644
--- a/back/engines/free/email_campaigns/app/views/email_campaigns/posts/_post_with_image.mjml
+++ b/back/engines/free/email_campaigns/app/views/email_campaigns/posts/_post_with_image.mjml
@@ -18,8 +18,8 @@
       <p style="margin-top: 10px; color: #84939E;">
         <%= localize_for_recipient(post_body_multiloc)&.html_safe %>
       </p>
-      <% if event.post_author_name %>
-        <p style="color:#8D8D8D;"><%= "by #{event.post_author_name}" %></p>
+      <% if event['post_author_name'] %>
+        <p style="color:#8D8D8D;"><%= "by #{event['post_author_name']}" %></p>
       <% end %>
     </mj-text>
   </mj-column>

From 7e0669c5c74f5a0a44cafce1af76bba87100ed39 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Thu, 1 Feb 2024 11:17:16 +0100
Subject: [PATCH 014/282] Add comments about absent event attributes

---
 .../email_campaigns/mention_in_official_feedback_mailer.rb    | 4 +++-
 .../app/mailers/email_campaigns/project_published_mailer.rb   | 1 +
 .../official_feedback_on_idea_you_follow_mailer_preview.rb    | 1 +
 3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb b/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb
index c4ac7c0fe49c..b39c696c3507 100644
--- a/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb
+++ b/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb
@@ -29,7 +29,9 @@ def header_message
     end
 
     def preheader
-      format_message('preheader', values: { commentAuthor: event['initiating_user_first_name'] })
+      # initiating_user_first_name is never present.
+      # TODO: fix. We previously removed this field from the event https://github.com/CitizenLabDotCo/citizenlab/commit/72a778f#diff-f9b809a7dcedf9fd13177f3b9b05ac24ddde8f5f36d197d65e256c20b22ae62aL25
+      format_message('preheader', values: { commentAuthor: event.initiating_user_first_name })
     end
   end
 end
diff --git a/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb b/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb
index 0c268a43100e..cbb7b22d033c 100644
--- a/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb
+++ b/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb
@@ -16,6 +16,7 @@ def header_message
       format_message(
         'header_message',
         values: {
+          # TODO: fix. We previously removed this field from the event https://github.com/CitizenLabDotCo/citizenlab/pull/5556/files#diff-ade4ca4ef24ba6dab628047c521bfc1addf2e0255d401c931124ec7fea5a07f0L78
           ideaTitle: localize_for_recipient(event.post_title_multiloc),
           organizationName: organization_name
         }
diff --git a/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/official_feedback_on_idea_you_follow_mailer_preview.rb b/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/official_feedback_on_idea_you_follow_mailer_preview.rb
index 84b02042e301..42a44c72b30b 100644
--- a/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/official_feedback_on_idea_you_follow_mailer_preview.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/official_feedback_on_idea_you_follow_mailer_preview.rb
@@ -7,6 +7,7 @@ class OfficialFeedbackOnIdeaYouFollowMailerPreview < ActionMailer::Preview
     def campaign_mail
       campaign = EmailCampaigns::Campaigns::OfficialFeedbackOnIdeaYouFollow.first
 
+      # TODO: generate commands with campaign#generate_commands method
       command = {
         recipient: recipient_user,
         event_payload: {

From 452eb484977d9fe2e59d47f03e0684815d9bc3c4 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Thu, 1 Feb 2024 11:34:26 +0100
Subject: [PATCH 015/282] Add comment about always absent post_title_multiloc

---
 .../app/mailers/email_campaigns/project_published_mailer.rb      | 1 +
 1 file changed, 1 insertion(+)

diff --git a/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb b/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb
index cbb7b22d033c..1c6cff1a4ac1 100644
--- a/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb
+++ b/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb
@@ -16,6 +16,7 @@ def header_message
       format_message(
         'header_message',
         values: {
+          # post_title_multiloc is never present.
           # TODO: fix. We previously removed this field from the event https://github.com/CitizenLabDotCo/citizenlab/pull/5556/files#diff-ade4ca4ef24ba6dab628047c521bfc1addf2e0255d401c931124ec7fea5a07f0L78
           ideaTitle: localize_for_recipient(event.post_title_multiloc),
           organizationName: organization_name

From 83700c3bc904efab27c03dc155b728b809310d85 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 14:44:24 +0000
Subject: [PATCH 016/282] Trigger storybook manually

---
 .circleci/config.yml | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 93b291ba325e..4b87bac03376 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -60,6 +60,10 @@ parameters:
     type: boolean
     default: false
 
+  storybook:
+    type: boolean
+    default: false
+
 executors:
   cl2-back:
     parameters:
@@ -659,6 +663,26 @@ jobs:
           path: /tmp/report.html
           destination: lighthouse
 
+  front-storybook:
+    docker:
+      - image: citizenlabdotco/cl2-devops-front-buildenv
+    resource_class: large
+    working_directory: ~/citizenlab/front
+    steps:
+      - shallow-clone
+      - copy_secrets_from_lastpass
+      # Download and cache dependencies
+      - restore_cache:
+          keys:
+            - v2-npm-cache-{{ checksum "package-lock.json" }}
+      - <<: *install-front-dependencies
+      - save_cache:
+          paths:
+            - /root/.npm
+          key: v2-npm-cache-{{ checksum "package-lock.json" }}
+      - run:
+          command: npm run chromatic
+
   # E2E TESTS
   e2e-tests:
     docker:
@@ -1284,3 +1308,14 @@ workflows:
             - "Canada"
             - "US West"
       #     - "UK"
+
+  manual-storybook:
+    when: << pipeline.parameters.storybook >>
+    jobs:
+      - front-storybook:
+          context:
+            - docker-hub-access
+            - lastpass
+
+  # nightly-storybook:
+    # TODO

From 790bc0ac0fc83235f215f38a1b9984570d1907a1 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 15:12:35 +0000
Subject: [PATCH 017/282] Try using circleci container instead

---
 .circleci/config.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 4b87bac03376..291beb289e13 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -665,7 +665,7 @@ jobs:
 
   front-storybook:
     docker:
-      - image: citizenlabdotco/cl2-devops-front-buildenv
+      - image: circleci/node:16
     resource_class: large
     working_directory: ~/citizenlab/front
     steps:

From e4cf026c1f04a0e22e8a8461f44f3a2b32ee2a30 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 15:15:41 +0000
Subject: [PATCH 018/282] Add correct working dir

---
 .circleci/config.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 291beb289e13..397672d3dd76 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -667,7 +667,7 @@ jobs:
     docker:
       - image: circleci/node:16
     resource_class: large
-    working_directory: ~/citizenlab/front
+    working_directory: ~/citizenlab
     steps:
       - shallow-clone
       - copy_secrets_from_lastpass
@@ -681,7 +681,7 @@ jobs:
             - /root/.npm
           key: v2-npm-cache-{{ checksum "package-lock.json" }}
       - run:
-          command: npm run chromatic
+          command: cd front && npm run chromatic
 
   # E2E TESTS
   e2e-tests:

From 064ae60de30be982e7afed596a5ac9bbc31a6dcf Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 15:24:06 +0000
Subject: [PATCH 019/282] Execute LP commands in correct folder

---
 .circleci/config.yml | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 397672d3dd76..5d194fc20393 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -667,11 +667,13 @@ jobs:
     docker:
       - image: circleci/node:16
     resource_class: large
-    working_directory: ~/citizenlab
+    working_directory: ~/citizenlab/front
     steps:
       - shallow-clone
-      - copy_secrets_from_lastpass
-      # Download and cache dependencies
+      - run: cd .. && sudo .circleci/install_lpass.sh v1.3.5
+      - run: echo $LASTPASS_PASSWORD | LPASS_DISABLE_PINENTRY=1 lpass login ${LASTPASS_EMAIL}
+      - run: cd .. && lpass show --notes 'citizenlab back-secret.env' > env_files/back-secret.env
+      - run: cd .. && lpass show --notes 'citizenlab front-secret.env' > env_files/front-secret.env
       - restore_cache:
           keys:
             - v2-npm-cache-{{ checksum "package-lock.json" }}
@@ -681,7 +683,7 @@ jobs:
             - /root/.npm
           key: v2-npm-cache-{{ checksum "package-lock.json" }}
       - run:
-          command: cd front && npm run chromatic
+          command: npm run chromatic
 
   # E2E TESTS
   e2e-tests:

From df5ce3bdf194243da08098e972914d3bb73762b9 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 15:34:01 +0000
Subject: [PATCH 020/282] Try installing lastpass without sudo

---
 .circleci/config.yml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 5d194fc20393..71ebd8967cf1 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -665,12 +665,12 @@ jobs:
 
   front-storybook:
     docker:
-      - image: circleci/node:16
-    resource_class: large
+      - image: citizenlabdotco/cl2-devops-front-buildenv
+    resource_class: medium
     working_directory: ~/citizenlab/front
     steps:
       - shallow-clone
-      - run: cd .. && sudo .circleci/install_lpass.sh v1.3.5
+      - run: cd .. && .circleci/install_lpass.sh v1.3.5
       - run: echo $LASTPASS_PASSWORD | LPASS_DISABLE_PINENTRY=1 lpass login ${LASTPASS_EMAIL}
       - run: cd .. && lpass show --notes 'citizenlab back-secret.env' > env_files/back-secret.env
       - run: cd .. && lpass show --notes 'citizenlab front-secret.env' > env_files/front-secret.env

From c73f694c38a719f8b32cb6535984a91b02d9896c Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 15:42:08 +0000
Subject: [PATCH 021/282] Apply environment variables

---
 .circleci/config.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 71ebd8967cf1..0e90d524fc36 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -672,8 +672,8 @@ jobs:
       - shallow-clone
       - run: cd .. && .circleci/install_lpass.sh v1.3.5
       - run: echo $LASTPASS_PASSWORD | LPASS_DISABLE_PINENTRY=1 lpass login ${LASTPASS_EMAIL}
-      - run: cd .. && lpass show --notes 'citizenlab back-secret.env' > env_files/back-secret.env
       - run: cd .. && lpass show --notes 'citizenlab front-secret.env' > env_files/front-secret.env
+      - run: cd .. && set -a && source env_files/front-secret.env  && set +a
       - restore_cache:
           keys:
             - v2-npm-cache-{{ checksum "package-lock.json" }}

From 8bfba9b56f24957286ba67d97aeba9628e6af702 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 15:48:47 +0000
Subject: [PATCH 022/282] _

---
 .circleci/config.yml | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 0e90d524fc36..1d691d105300 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -673,7 +673,6 @@ jobs:
       - run: cd .. && .circleci/install_lpass.sh v1.3.5
       - run: echo $LASTPASS_PASSWORD | LPASS_DISABLE_PINENTRY=1 lpass login ${LASTPASS_EMAIL}
       - run: cd .. && lpass show --notes 'citizenlab front-secret.env' > env_files/front-secret.env
-      - run: cd .. && set -a && source env_files/front-secret.env  && set +a
       - restore_cache:
           keys:
             - v2-npm-cache-{{ checksum "package-lock.json" }}
@@ -682,8 +681,15 @@ jobs:
           paths:
             - /root/.npm
           key: v2-npm-cache-{{ checksum "package-lock.json" }}
-      - run:
-          command: npm run chromatic
+      # - run:
+          # command: npm run chromatic
+      - run: |
+          cd ..
+          set -a
+          source env_files/front-secret.env
+          set +a
+          cd ./front
+          npm run chromatic
 
   # E2E TESTS
   e2e-tests:

From 769e03d2724105cc16d28c0128aea09e9ca3768e Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 15:55:31 +0000
Subject: [PATCH 023/282] Make non-shallow clone

---
 .circleci/config.yml | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 1d691d105300..9fd56a0ab5cb 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -669,10 +669,19 @@ jobs:
     resource_class: medium
     working_directory: ~/citizenlab/front
     steps:
-      - shallow-clone
+      # Non-shallow clone
+      - run: mkdir -p ~/.ssh
+      - run: ssh-keyscan github.com >> ~/.ssh/known_hosts
+      - run: |
+          cd ~
+          rm -rf ~/$(echo $CIRCLE_REPOSITORY_URL | cut -d '/' -f 2 | cut -d '.' -f 1)
+          git clone -b "$CIRCLE_BRANCH" "$CIRCLE_REPOSITORY_URL"
+
+      # Install lastpass and copy secrets, without sudo and from different working dir
       - run: cd .. && .circleci/install_lpass.sh v1.3.5
       - run: echo $LASTPASS_PASSWORD | LPASS_DISABLE_PINENTRY=1 lpass login ${LASTPASS_EMAIL}
       - run: cd .. && lpass show --notes 'citizenlab front-secret.env' > env_files/front-secret.env
+
       - restore_cache:
           keys:
             - v2-npm-cache-{{ checksum "package-lock.json" }}

From a5341212c561460f1486431d6861cee8f832123a Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 16:07:51 +0000
Subject: [PATCH 024/282] _

---
 .circleci/config.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 9fd56a0ab5cb..76fb21d851ff 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -669,7 +669,7 @@ jobs:
     resource_class: medium
     working_directory: ~/citizenlab/front
     steps:
-      # Non-shallow clone
+      # Non-shallow clone (required for chromatic)
       - run: mkdir -p ~/.ssh
       - run: ssh-keyscan github.com >> ~/.ssh/known_hosts
       - run: |

From 5fcaff463434cd6ab3816dc8d58e388cc89fe150 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 16:40:23 +0000
Subject: [PATCH 025/282] Replace hardcoded localhost origin for images in mock
 server

---
 .../__mocks__/_mockServer.ts                  |  9 ++++++---
 .../app/api/avatars/__mocks__/_mockServer.ts  |  9 ++++++---
 .../api/idea_images/__mocks__/_mockServer.ts  | 19 +++++++++++--------
 .../__mocks__/_mockServer.ts                  | 19 +++++++++++--------
 .../project_images/__mocks__/_mockServer.ts   | 19 +++++++++++--------
 front/app/utils/storybook/getOrigin.ts        |  7 +++++++
 6 files changed, 52 insertions(+), 30 deletions(-)
 create mode 100644 front/app/utils/storybook/getOrigin.ts

diff --git a/front/app/api/app_configuration/__mocks__/_mockServer.ts b/front/app/api/app_configuration/__mocks__/_mockServer.ts
index 4b612339ac31..90895c0eac94 100644
--- a/front/app/api/app_configuration/__mocks__/_mockServer.ts
+++ b/front/app/api/app_configuration/__mocks__/_mockServer.ts
@@ -1,6 +1,9 @@
 import { rest } from 'msw';
+import { getOrigin } from 'utils/storybook/getOrigin';
 import { IAppConfigurationData } from '../types';
 
+const image = `${getOrigin()}/images/logo.png`;
+
 export const getAppConfigurationData = (
   attributes = {}
 ): IAppConfigurationData => ({
@@ -64,9 +67,9 @@ export const getAppConfigurationData = (
       },
     },
     logo: {
-      small: 'http://localhost:6006/images/logo.png',
-      medium: 'http://localhost:6006/images/logo.png',
-      large: 'http://localhost:6006/images/logo.png',
+      small: image,
+      medium: image,
+      large: image,
     },
     ...attributes,
   },
diff --git a/front/app/api/avatars/__mocks__/_mockServer.ts b/front/app/api/avatars/__mocks__/_mockServer.ts
index 70e8947ed9c1..8035caf337aa 100644
--- a/front/app/api/avatars/__mocks__/_mockServer.ts
+++ b/front/app/api/avatars/__mocks__/_mockServer.ts
@@ -1,16 +1,19 @@
 import { rest } from 'msw';
 import { API_PATH } from 'containers/App/constants';
+import { getOrigin } from 'utils/storybook/getOrigin';
 import { IAvatarData } from '../types';
 
+const image = `${getOrigin()}/images/female_avatar_5`;
+
 export const avatarsData: IAvatarData[] = [
   {
     id: '1',
     type: 'avatar',
     attributes: {
       avatar: {
-        small: 'http://localhost:6006/images/female_avatar_5.jpg',
-        medium: 'http://localhost:6006/images/female_avatar_5.jpg',
-        large: 'http://localhost:6006/images/female_avatar_5.jpg',
+        small: image,
+        medium: image,
+        large: image,
       },
     },
   },
diff --git a/front/app/api/idea_images/__mocks__/_mockServer.ts b/front/app/api/idea_images/__mocks__/_mockServer.ts
index 733eea151892..f7d065aa4cae 100644
--- a/front/app/api/idea_images/__mocks__/_mockServer.ts
+++ b/front/app/api/idea_images/__mocks__/_mockServer.ts
@@ -1,6 +1,9 @@
 import { IIdeaImageData } from '../types';
+import { getOrigin } from 'utils/storybook/getOrigin';
 import { rest } from 'msw';
 
+const image = `${getOrigin()}/images/image16.png`;
+
 export const ideaImagesData: IIdeaImageData[] = [
   {
     id: '30c1b604-71fd-4ac4-9cd7-3e5601d9cb0f',
@@ -10,10 +13,10 @@ export const ideaImagesData: IIdeaImageData[] = [
       created_at: '2023-02-28T05:56:37.762Z',
       updated_at: '2023-02-28T05:56:37.762Z',
       versions: {
-        small: 'http://localhost:6006/images/image16.png',
-        medium: 'http://localhost:6006/images/image16.png',
-        large: 'http://localhost:6006/images/image16.png',
-        fb: 'http://localhost:6006/images/image16.png',
+        small: image,
+        medium: image,
+        large: image,
+        fb: image,
       },
     },
   },
@@ -25,10 +28,10 @@ export const ideaImagesData: IIdeaImageData[] = [
       created_at: '2021-02-28T05:56:37.762Z',
       updated_at: '2020-02-28T05:56:37.762Z',
       versions: {
-        small: 'http://localhost:6006/images/image16.png',
-        medium: 'http://localhost:6006/images/image16.png',
-        large: 'http://localhost:6006/images/image16.png',
-        fb: 'http://localhost:6006/images/image16.png',
+        small: image,
+        medium: image,
+        large: image,
+        fb: image,
       },
     },
   },
diff --git a/front/app/api/initiative_images/__mocks__/_mockServer.ts b/front/app/api/initiative_images/__mocks__/_mockServer.ts
index 9bdca00b3c26..2a0a3b733fa5 100644
--- a/front/app/api/initiative_images/__mocks__/_mockServer.ts
+++ b/front/app/api/initiative_images/__mocks__/_mockServer.ts
@@ -1,6 +1,9 @@
 import { rest } from 'msw';
+import { getOrigin } from 'utils/storybook/getOrigin';
 import { IInitiativeImageData } from '../types';
 
+const image = `${getOrigin()}/images/image16.png`;
+
 export const initiativeImagesData: IInitiativeImageData[] = [
   {
     id: '30c1b604-71fd-4ac4-9cd7-3e5601d9cb0f',
@@ -10,10 +13,10 @@ export const initiativeImagesData: IInitiativeImageData[] = [
       created_at: '2023-02-28T05:56:37.762Z',
       updated_at: '2023-02-28T05:56:37.762Z',
       versions: {
-        small: 'http://localhost:6006/images/image16.png',
-        medium: 'http://localhost:6006/images/image16.png',
-        large: 'http://localhost:6006/images/image16.png',
-        fb: 'http://localhost:6006/images/image16.png',
+        small: image,
+        medium: image,
+        large: image,
+        fb: image,
       },
     },
   },
@@ -25,10 +28,10 @@ export const initiativeImagesData: IInitiativeImageData[] = [
       created_at: '2021-02-28T05:56:37.762Z',
       updated_at: '2020-02-28T05:56:37.762Z',
       versions: {
-        small: 'http://localhost:6006/images/image16.png',
-        medium: 'http://localhost:6006/images/image16.png',
-        large: 'http://localhost:6006/images/image16.png',
-        fb: 'http://localhost:6006/images/image16.png',
+        small: image,
+        medium: image,
+        large: image,
+        fb: image,
       },
     },
   },
diff --git a/front/app/api/project_images/__mocks__/_mockServer.ts b/front/app/api/project_images/__mocks__/_mockServer.ts
index 88fedc2b8a4e..fca6afb32841 100644
--- a/front/app/api/project_images/__mocks__/_mockServer.ts
+++ b/front/app/api/project_images/__mocks__/_mockServer.ts
@@ -1,5 +1,8 @@
 import { rest } from 'msw';
 import { API_PATH } from 'containers/App/constants';
+import { getOrigin } from 'utils/storybook/getOrigin';
+
+const image = `${getOrigin()}/images/image16.png`;
 
 export const projectImagesData = [
   {
@@ -10,10 +13,10 @@ export const projectImagesData = [
       created_at: '2023-02-28T05:56:37.762Z',
       updated_at: '2023-02-28T05:56:37.762Z',
       versions: {
-        small: 'http://localhost:6006/images/image16.png',
-        medium: 'http://localhost:6006/images/image16.png',
-        large: 'http://localhost:6006/images/image16.png',
-        fb: 'http://localhost:6006/images/image16.png',
+        small: image,
+        medium: image,
+        large: image,
+        fb: image,
       },
     },
   },
@@ -25,10 +28,10 @@ export const projectImagesData = [
       created_at: '2021-02-28T05:56:37.762Z',
       updated_at: '2020-02-28T05:56:37.762Z',
       versions: {
-        small: 'http://localhost:6006/images/image16.png',
-        medium: 'http://localhost:6006/images/image16.png',
-        large: 'http://localhost:6006/images/image16.png',
-        fb: 'http://localhost:6006/images/image16.png',
+        small: image,
+        medium: image,
+        large: image,
+        fb: image,
       },
     },
   },
diff --git a/front/app/utils/storybook/getOrigin.ts b/front/app/utils/storybook/getOrigin.ts
new file mode 100644
index 000000000000..45f451d2ed75
--- /dev/null
+++ b/front/app/utils/storybook/getOrigin.ts
@@ -0,0 +1,7 @@
+export const getOrigin = () => {
+  if (typeof window !== 'undefined') {
+    return window.location.origin;
+  }
+
+  return 'http://localhost:6006';
+};

From f606cdbc395845ab166f1a51ce20ff57efdd9d88 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 2 Feb 2024 16:48:29 +0000
Subject: [PATCH 026/282] Return empty origin if no window

---
 front/app/utils/storybook/getOrigin.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/utils/storybook/getOrigin.ts b/front/app/utils/storybook/getOrigin.ts
index 45f451d2ed75..c9cd70f99a3b 100644
--- a/front/app/utils/storybook/getOrigin.ts
+++ b/front/app/utils/storybook/getOrigin.ts
@@ -3,5 +3,5 @@ export const getOrigin = () => {
     return window.location.origin;
   }
 
-  return 'http://localhost:6006';
+  return '';
 };

From 6f114f9b8b81b1cc8058f0ede57abd92b8fe49fe Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 8 Feb 2024 16:01:20 +0000
Subject: [PATCH 027/282] Make title red by accident

---
 front/app/components/IdeaCard/index.tsx | 1 +
 1 file changed, 1 insertion(+)

diff --git a/front/app/components/IdeaCard/index.tsx b/front/app/components/IdeaCard/index.tsx
index 3bcb6503e227..8552bedd4c95 100644
--- a/front/app/components/IdeaCard/index.tsx
+++ b/front/app/components/IdeaCard/index.tsx
@@ -180,6 +180,7 @@ const IdeaCard = ({
             mt="4px"
             mb="16px"
             className="e2e-idea-card-title"
+            color="red600"
           >
             {ideaTitle}
           </Title>

From ddcad4923739acebaa65cfbf46848f249f7c6e1f Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 8 Feb 2024 16:47:51 +0000
Subject: [PATCH 028/282] Undo title color

---
 front/app/components/IdeaCard/index.tsx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/components/IdeaCard/index.tsx b/front/app/components/IdeaCard/index.tsx
index 8552bedd4c95..3bcb6503e227 100644
--- a/front/app/components/IdeaCard/index.tsx
+++ b/front/app/components/IdeaCard/index.tsx
@@ -180,7 +180,6 @@ const IdeaCard = ({
             mt="4px"
             mb="16px"
             className="e2e-idea-card-title"
-            color="red600"
           >
             {ideaTitle}
           </Title>

From 1e8d2ee257b2239ba06448cacc4c7deab2ea4279 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 9 Feb 2024 14:32:06 +0000
Subject: [PATCH 029/282] Set chromatic up to run every Monday morning

---
 .circleci/config.yml | 39 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 37 insertions(+), 2 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index b138a9c97370..12895409d1df 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1339,5 +1339,40 @@ workflows:
             - docker-hub-access
             - lastpass
 
-  # nightly-storybook:
-    # TODO
+  weekly-storybook:
+    triggers:
+      - schedule:
+        cron: 0 5 * * 1 # Every Monday at 5am: https://crontab.guru/
+        filters:
+          branches:
+            only:
+              - master
+    jobs:
+      - front-storybook:
+          context:
+            - docker-hub-access
+            - lastpass
+          
+
+  # nightly-e2e-tests:
+  #   triggers:
+  #     - schedule:
+  #         cron: "0 2,14 * * 1-5" # https://crontab.guru/
+  #         filters:
+  #           branches:
+  #             only:
+  #               - master
+  #   jobs:
+  #     - e2e-tests:
+  #         context:
+  #           - docker-hub-access
+  #           - slack-dev-notifications-e2e
+  #           - lastpass
+  #         post-steps:
+  #           - slack/notify:
+  #               event: pass
+  #               template: basic_success_1
+  #           - slack/notify:
+  #               event: fail
+  #               mentions: ":boom: FAILURE: Some tests failed."
+  #               template: basic_fail_1

From 8cd8f6f49d3aaf17329ef3aa287da97da7d44949 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 9 Feb 2024 14:37:27 +0000
Subject: [PATCH 030/282] Simplify chromatic setup by using circle ci context

---
 .circleci/config.yml | 19 +++----------------
 1 file changed, 3 insertions(+), 16 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 12895409d1df..daae82c13bda 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -682,11 +682,6 @@ jobs:
           rm -rf ~/$(echo $CIRCLE_REPOSITORY_URL | cut -d '/' -f 2 | cut -d '.' -f 1)
           git clone -b "$CIRCLE_BRANCH" "$CIRCLE_REPOSITORY_URL"
 
-      # Install lastpass and copy secrets, without sudo and from different working dir
-      - run: cd .. && .circleci/install_lpass.sh v1.3.5
-      - run: echo $LASTPASS_PASSWORD | LPASS_DISABLE_PINENTRY=1 lpass login ${LASTPASS_EMAIL}
-      - run: cd .. && lpass show --notes 'citizenlab front-secret.env' > env_files/front-secret.env
-
       - restore_cache:
           keys:
             - v2-npm-cache-{{ checksum "package-lock.json" }}
@@ -695,15 +690,7 @@ jobs:
           paths:
             - /root/.npm
           key: v2-npm-cache-{{ checksum "package-lock.json" }}
-      # - run:
-          # command: npm run chromatic
-      - run: |
-          cd ..
-          set -a
-          source env_files/front-secret.env
-          set +a
-          cd ./front
-          npm run chromatic
+      - run: npm run chromatic
 
   # E2E TESTS
   e2e-tests:
@@ -1337,7 +1324,7 @@ workflows:
       - front-storybook:
           context:
             - docker-hub-access
-            - lastpass
+            - chromatic
 
   weekly-storybook:
     triggers:
@@ -1351,7 +1338,7 @@ workflows:
       - front-storybook:
           context:
             - docker-hub-access
-            - lastpass
+            - chromatic
           
 
   # nightly-e2e-tests:

From e8da167819d31b2f9a9421fa4721af987c12a3d5 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 9 Feb 2024 14:38:22 +0000
Subject: [PATCH 031/282] Fix yml schema error

---
 .circleci/config.yml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index daae82c13bda..480e58c3e32a 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1329,11 +1329,11 @@ workflows:
   weekly-storybook:
     triggers:
       - schedule:
-        cron: 0 5 * * 1 # Every Monday at 5am: https://crontab.guru/
-        filters:
-          branches:
-            only:
-              - master
+          cron: 0 5 * * 1 # Every Monday at 5am: https://crontab.guru/
+          filters:
+            branches:
+              only:
+                - master
     jobs:
       - front-storybook:
           context:

From 8340534409455ed15cb990bf06c3e0a9c2f7fd7a Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 9 Feb 2024 14:55:13 +0000
Subject: [PATCH 032/282] Add slack notifications (hope it works)

---
 .circleci/config.yml | 32 ++++++++------------------------
 1 file changed, 8 insertions(+), 24 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 480e58c3e32a..ffa26093f3e3 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1339,27 +1339,11 @@ workflows:
           context:
             - docker-hub-access
             - chromatic
-          
-
-  # nightly-e2e-tests:
-  #   triggers:
-  #     - schedule:
-  #         cron: "0 2,14 * * 1-5" # https://crontab.guru/
-  #         filters:
-  #           branches:
-  #             only:
-  #               - master
-  #   jobs:
-  #     - e2e-tests:
-  #         context:
-  #           - docker-hub-access
-  #           - slack-dev-notifications-e2e
-  #           - lastpass
-  #         post-steps:
-  #           - slack/notify:
-  #               event: pass
-  #               template: basic_success_1
-  #           - slack/notify:
-  #               event: fail
-  #               mentions: ":boom: FAILURE: Some tests failed."
-  #               template: basic_fail_1
+          post-steps:
+            - slack/notify:
+                event: pass
+                template: basic_success_1
+            - slack/notify:
+                event: fail
+                mentions: ":boom: FAILURE: Some stories failed."
+                template: basic_fail_1

From 885469f2b33a551aa0a87345aa7bba4aaf120534 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 9 Feb 2024 16:03:49 +0000
Subject: [PATCH 033/282] Add modes

---
 front/.storybook/modes.ts    | 20 ++++++++++++++++++++
 front/.storybook/preview.tsx |  9 +++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 front/.storybook/modes.ts

diff --git a/front/.storybook/modes.ts b/front/.storybook/modes.ts
new file mode 100644
index 000000000000..e2103f5c4603
--- /dev/null
+++ b/front/.storybook/modes.ts
@@ -0,0 +1,20 @@
+export const allModes = {
+  default: {
+    viewport: {
+      width: 1280
+    }
+  },
+
+  tablet: {
+    viewport: {
+      width: 1200
+    }
+  },
+
+  mobile: {
+    viewport: {
+      width: 769,
+      height: 1280
+    }
+  }
+};
diff --git a/front/.storybook/preview.tsx b/front/.storybook/preview.tsx
index 1668e7e27561..506c767b1c35 100644
--- a/front/.storybook/preview.tsx
+++ b/front/.storybook/preview.tsx
@@ -5,6 +5,7 @@ import { initialize, mswDecorator } from 'msw-storybook-addon';
 import mockServer from './mockServer';
 import { reactIntl } from './reactIntl';
 import { MemoryRouter } from 'react-router-dom';
+import { allModes } from './modes';
 
 initialize();
 
@@ -17,6 +18,7 @@ const routerDecorator = (Story) => (
 const preview: Preview = {
   parameters: {
     actions: { argTypesRegex: '^on[A-Z].*' },
+
     controls: {
       matchers: {
         color: /(background|color)$/i,
@@ -25,7 +27,14 @@ const preview: Preview = {
     },
 
     msw: Object.values(mockServer),
+
     reactIntl,
+
+    chromatic: {
+      modes: {
+        ...allModes
+      }
+    }
   },
 
   decorators: [mswDecorator, routerDecorator, contexts],

From 72994c39521ddd765e195a8a81120a8ca4c7c43e Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 9 Feb 2024 16:33:25 +0000
Subject: [PATCH 034/282] Modify viewports and change to exit once uploaded

---
 front/.storybook/modes.ts | 6 +++---
 front/package.json        | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/front/.storybook/modes.ts b/front/.storybook/modes.ts
index e2103f5c4603..a884fca45821 100644
--- a/front/.storybook/modes.ts
+++ b/front/.storybook/modes.ts
@@ -7,14 +7,14 @@ export const allModes = {
 
   tablet: {
     viewport: {
-      width: 1200
+      width: 1000
     }
   },
 
   mobile: {
     viewport: {
-      width: 769,
-      height: 1280
+      width: 500,
+      height: 1000
     }
   }
 };
diff --git a/front/package.json b/front/package.json
index b45f8f0d63da..136f7ded42f1 100644
--- a/front/package.json
+++ b/front/package.json
@@ -38,7 +38,7 @@
     "dependency-cruiser": "depcruise app  --validate",
     "storybook": "storybook dev -p 6006",
     "build-storybook": "storybook build",
-    "chromatic": "chromatic --exit-zero-on-changes"
+    "chromatic": "chromatic --exit-once-uploaded"
   },
   "jest-junit": {
     "addFileAttribute": "true"

From fbd3e150b713e9be4c3b7f0b2b0fb3777e1869fb Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 9 Feb 2024 16:40:20 +0000
Subject: [PATCH 035/282] Add slack notifications to manual trigger for testing
 purposes

---
 .circleci/config.yml | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index ffa26093f3e3..fcf66f8f2de2 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1325,6 +1325,14 @@ workflows:
           context:
             - docker-hub-access
             - chromatic
+          post-steps:
+            - slack/notify:
+                event: pass
+                template: basic_success_1
+            - slack/notify:
+                event: fail
+                mentions: ":boom: FAILURE: Some stories failed."
+                template: basic_fail_1
 
   weekly-storybook:
     triggers:

From bb50e8a2a6d364eb80b128a85fa9b3c1bf2e40ee Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 9 Feb 2024 17:47:41 +0100
Subject: [PATCH 036/282] Rename votes to reactions

---
 .../campaign_mail.mjml                                        | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/back/engines/free/email_campaigns/app/views/email_campaigns/your_proposed_initiatives_digest_mailer/campaign_mail.mjml b/back/engines/free/email_campaigns/app/views/email_campaigns/your_proposed_initiatives_digest_mailer/campaign_mail.mjml
index 74480dc9eedf..6353fbe63078 100644
--- a/back/engines/free/email_campaigns/app/views/email_campaigns/your_proposed_initiatives_digest_mailer/campaign_mail.mjml
+++ b/back/engines/free/email_campaigns/app/views/email_campaigns/your_proposed_initiatives_digest_mailer/campaign_mail.mjml
@@ -46,10 +46,10 @@
             <span style="font-size: 14px; font-weight: 700; color: rgb(111, 119, 125);"><%= initiatives.likes_count %></span>
           </td>
           <td style="width: 70px;">
-            <span style="font-size: 14px; font-weight: 700; color: rgb(111, 119, 125);"><%= initiatives.votes_this_week %></span>
+            <span style="font-size: 14px; font-weight: 700; color: rgb(111, 119, 125);"><%= initiatives.reactions_this_week %></span>
           </td>
           <td style="width: 70px;">
-            <span style="font-size: 14px; font-weight: 700; color: rgb(111, 119, 125);"><%= initiatives.votes_needed %></span>
+            <span style="font-size: 14px; font-weight: 700; color: rgb(111, 119, 125);"><%= initiatives.reactions_needed %></span>
           </td>
           <td style="width: 70px;">
             <span style="font-size: 14px; font-weight: 700; color: rgb(111, 119, 125);"><%= (Time.zone.today - initiatives.expires_at.to_date).to_i %></span>

From 4e8f81632d7cf85398c5e0031ca9f18313138b3c Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 9 Feb 2024 17:54:02 +0100
Subject: [PATCH 037/282] Update event fields in status change mailer preview
 and specs

---
 ...hange_on_idea_you_follow_mailer_preview.rb | 24 +++----------------
 ...on_initiative_you_follow_mailer_preview.rb | 24 +++----------------
 ...s_change_on_idea_you_follow_mailer_spec.rb | 23 +++---------------
 ...ge_on_initiative_you_follow_mailer_spec.rb | 23 +++---------------
 4 files changed, 12 insertions(+), 82 deletions(-)

diff --git a/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/status_change_on_idea_you_follow_mailer_preview.rb b/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/status_change_on_idea_you_follow_mailer_preview.rb
index 28a6eb10958b..4fe59f844968 100644
--- a/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/status_change_on_idea_you_follow_mailer_preview.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/status_change_on_idea_you_follow_mailer_preview.rb
@@ -7,28 +7,10 @@ class StatusChangeOnIdeaYouFollowMailerPreview < ActionMailer::Preview
     def campaign_mail
       campaign = EmailCampaigns::Campaigns::StatusChangeOnIdeaYouFollow.first
 
-      command = {
+      command = campaign.generate_commands(
         recipient: recipient_user,
-        event_payload: {
-          post_title_multiloc: { 'en' => 'Fence around the park' },
-          post_body_multiloc: { 'en' => 'Good morning, I have children with autism and they like to run and have no sense of danger, since the park is near where the cars are parked and near the avenue, it would be good if at least one of the play areas was fenced off. I have been to several parks in various states and that fence has been a blessing for us' },
-          post_url: 'http://localhost:4000/en/ideas/fence-around-the-park',
-          post_images: [
-            {
-              ordering: 0,
-              versions: {
-                small: 'http://localhost:4000/uploads/small_image.jpeg',
-                medium: 'http://localhost:4000/uploads/medium_image.jpeg',
-                large: 'http://localhost:4000/uploads/large_image.jpeg',
-                fb: 'http://localhost:4000/uploads/fb_image.jpeg'
-              }
-            }
-          ],
-          idea_status_title_multiloc: { 'en' => 'rejected' },
-          idea_status_code: 'rejected',
-          idea_status_color: '#E52516'
-        }
-      }
+        activity: Activity.new(item: Notification.new(post: Idea.first))
+      ).first.merge({ recipient: recipient_user })
 
       campaign.mailer_class.with(campaign: campaign, command: command).campaign_mail
     end
diff --git a/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/status_change_on_initiative_you_follow_mailer_preview.rb b/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/status_change_on_initiative_you_follow_mailer_preview.rb
index 927bfbb1d2ea..d864c049650c 100644
--- a/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/status_change_on_initiative_you_follow_mailer_preview.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/previews/email_campaigns/status_change_on_initiative_you_follow_mailer_preview.rb
@@ -7,28 +7,10 @@ class StatusChangeOnInitiativeYouFollowMailerPreview < ActionMailer::Preview
     def campaign_mail
       campaign = EmailCampaigns::Campaigns::StatusChangeOnInitiativeYouFollow.first
 
-      command = {
+      command = campaign.generate_commands(
         recipient: recipient_user,
-        event_payload: {
-          post_title_multiloc: { 'en' => 'Fence around the park' },
-          post_body_multiloc: { 'en' => 'Good morning, I have children with autism and they like to run and have no sense of danger, since the park is near where the cars are parked and near the avenue, it would be good if at least one of the play areas was fenced off. I have been to several parks in various states and that fence has been a blessing for us' },
-          post_url: 'http://localhost:4000/en/initiatives/fence-around-the-park',
-          post_images: [
-            {
-              ordering: 0,
-              versions: {
-                small: 'http://localhost:4000/uploads/small_image.jpeg',
-                medium: 'http://localhost:4000/uploads/medium_image.jpeg',
-                large: 'http://localhost:4000/uploads/large_image.jpeg',
-                fb: 'http://localhost:4000/uploads/fb_image.jpeg'
-              }
-            }
-          ],
-          initiative_status_title_multiloc: { 'en' => 'threshold reached' },
-          initiative_status_code: 'threshold_reached',
-          initiative_status_color: '#04884C'
-        }
-      }
+        activity: Activity.new(item: Notification.new(post: Initiative.first))
+      ).first.merge({ recipient: recipient_user })
 
       campaign.mailer_class.with(campaign: campaign, command: command).campaign_mail
     end
diff --git a/back/engines/free/email_campaigns/spec/mailers/status_change_on_idea_you_follow_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/status_change_on_idea_you_follow_mailer_spec.rb
index be888004f4dc..2e9b653d7635 100644
--- a/back/engines/free/email_campaigns/spec/mailers/status_change_on_idea_you_follow_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/status_change_on_idea_you_follow_mailer_spec.rb
@@ -8,27 +8,10 @@
     let(:campaign) { EmailCampaigns::Campaigns::StatusChangeOnIdeaYouFollow.create! }
     let(:idea) { create(:idea) }
     let(:command) do
-      status = idea.idea_status
-
-      {
+      campaign.generate_commands(
         recipient: recipient,
-        event_payload: {
-          post_id: idea.id,
-          post_title_multiloc: idea.title_multiloc,
-          post_body_multiloc: idea.body_multiloc,
-          post_url: Frontend::UrlService.new.model_to_url(idea, locale: recipient.locale),
-          post_images: idea.idea_images.map do |image|
-            {
-              ordering: image.ordering,
-              versions: image.image.versions.to_h { |k, v| [k.to_s, v.url] }
-            }
-          end,
-          idea_status_id: status.id,
-          idea_status_title_multiloc: status.title_multiloc,
-          idea_status_code: status.code,
-          idea_status_color: status.color
-        }
-      }
+        activity: build(:activity, item: build(:notification, post: idea))
+      ).first.merge({ recipient: recipient })
     end
 
     let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
diff --git a/back/engines/free/email_campaigns/spec/mailers/status_change_on_initiative_you_follow_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/status_change_on_initiative_you_follow_mailer_spec.rb
index fa020981e112..e9c8804a982f 100644
--- a/back/engines/free/email_campaigns/spec/mailers/status_change_on_initiative_you_follow_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/status_change_on_initiative_you_follow_mailer_spec.rb
@@ -8,27 +8,10 @@
     let(:campaign) { EmailCampaigns::Campaigns::StatusChangeOnInitiativeYouFollow.create! }
     let(:initiative) { create(:initiative) }
     let(:command) do
-      status = initiative.initiative_status
-
-      {
+      campaign.generate_commands(
         recipient: recipient,
-        event_payload: {
-          post_id: initiative.id,
-          post_title_multiloc: initiative.title_multiloc,
-          post_body_multiloc: initiative.body_multiloc,
-          post_url: Frontend::UrlService.new.model_to_url(initiative, locale: recipient.locale),
-          post_images: initiative.initiative_images.map do |image|
-            {
-              ordering: image.ordering,
-              versions: image.image.versions.to_h { |k, v| [k.to_s, v.url] }
-            }
-          end,
-          initiative_status_id: status.id,
-          initiative_status_title_multiloc: status.title_multiloc,
-          initiative_status_code: status.code,
-          initiative_status_color: status.color
-        }
-      }
+        activity: Activity.new(item: Notification.new(post: initiative))
+      ).first.merge({ recipient: recipient })
     end
 
     let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }

From 8bb7d877a2182f723279065b51950fd77174845b Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 9 Feb 2024 16:59:04 +0000
Subject: [PATCH 038/282] Disable slack notifications for now

---
 .circleci/config.yml | 18 +-----------------
 1 file changed, 1 insertion(+), 17 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index fcf66f8f2de2..e82e07eae033 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1325,14 +1325,6 @@ workflows:
           context:
             - docker-hub-access
             - chromatic
-          post-steps:
-            - slack/notify:
-                event: pass
-                template: basic_success_1
-            - slack/notify:
-                event: fail
-                mentions: ":boom: FAILURE: Some stories failed."
-                template: basic_fail_1
 
   weekly-storybook:
     triggers:
@@ -1346,12 +1338,4 @@ workflows:
       - front-storybook:
           context:
             - docker-hub-access
-            - chromatic
-          post-steps:
-            - slack/notify:
-                event: pass
-                template: basic_success_1
-            - slack/notify:
-                event: fail
-                mentions: ":boom: FAILURE: Some stories failed."
-                template: basic_fail_1
+            - chromatic
\ No newline at end of file

From ae2c149c6ed8243d0aaa701e6d5852fba7e6cc3a Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 9 Feb 2024 18:20:49 +0100
Subject: [PATCH 039/282] Replace let with let_it_be in some mailer specs

---
 .../inappropriate_content_flagged_mailer_spec.rb | 15 ++++++++-------
 .../comment_on_idea_you_follow_mailer_spec.rb    | 16 ++++++++--------
 ...mment_on_initiative_you_follow_mailer_spec.rb | 16 ++++++++--------
 ...al_feedback_on_idea_you_follow_mailer_spec.rb | 14 +++++++-------
 ...dback_on_initiative_you_follow_mailer_spec.rb | 14 +++++++-------
 ...der_moderation_rights_received_mailer_spec.rb | 12 ++++++------
 .../mailers/project_phase_started_mailer_spec.rb | 14 +++++++-------
 .../mailers/project_published_mailer_spec.rb     | 10 +++++-----
 ...atus_change_on_idea_you_follow_mailer_spec.rb | 10 +++++-----
 ...hange_on_initiative_you_follow_mailer_spec.rb | 10 +++++-----
 back/spec/mailers/application_mailer_spec.rb     |  4 ++--
 back/spec/mailers/confirmations_mailer_spec.rb   | 15 ++++++++++-----
 back/spec/mailers/user_blocked_mailer_spec.rb    |  7 +++++--
 13 files changed, 83 insertions(+), 74 deletions(-)

diff --git a/back/engines/commercial/flag_inappropriate_content/spec/mailers/inappropriate_content_flagged_mailer_spec.rb b/back/engines/commercial/flag_inappropriate_content/spec/mailers/inappropriate_content_flagged_mailer_spec.rb
index f4331eb7fc2f..ea39c62e6adb 100644
--- a/back/engines/commercial/flag_inappropriate_content/spec/mailers/inappropriate_content_flagged_mailer_spec.rb
+++ b/back/engines/commercial/flag_inappropriate_content/spec/mailers/inappropriate_content_flagged_mailer_spec.rb
@@ -4,13 +4,10 @@
 
 RSpec.describe FlagInappropriateContent::EmailCampaigns::InappropriateContentFlaggedMailer do
   describe 'campaign_mail' do
-    let!(:recipient) { create(:user, locale: 'en') }
-    let!(:campaign) { FlagInappropriateContent::EmailCampaigns::Campaigns::InappropriateContentFlagged.create! }
-    let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
-
-    let(:flaggable) { create(:idea) }
-
-    let(:command) do
+    let_it_be(:recipient) { create(:user, locale: 'en') }
+    let_it_be(:campaign) { FlagInappropriateContent::EmailCampaigns::Campaigns::InappropriateContentFlagged.create! }
+    let_it_be(:flaggable) { create(:idea) }
+    let_it_be(:command) do
       {
         recipient: recipient,
         event_payload: {
@@ -24,6 +21,8 @@
       }
     end
 
+    let_it_be(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+
     before do
       EmailCampaigns::UnsubscriptionToken.create!(user_id: recipient.id)
     end
@@ -58,6 +57,8 @@
         command[:event_payload][:flag_automatically_detected] = true
       end
 
+      let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+
       it 'includes the explanation note about automatic flagging' do
         expect(mail.body.encoded).to include('This post was automatically detected')
       end
diff --git a/back/engines/free/email_campaigns/spec/mailers/comment_on_idea_you_follow_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/comment_on_idea_you_follow_mailer_spec.rb
index 7ac51bb1113a..e3aac2ee9cb3 100644
--- a/back/engines/free/email_campaigns/spec/mailers/comment_on_idea_you_follow_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/comment_on_idea_you_follow_mailer_spec.rb
@@ -4,13 +4,13 @@
 
 RSpec.describe EmailCampaigns::CommentOnIdeaYouFollowMailer do
   describe 'CommentOnIdeaYouFollow' do
-    let(:recipient) { create(:user, locale: 'en') }
-    let(:campaign) { EmailCampaigns::Campaigns::CommentOnIdeaYouFollow.create! }
-    let(:idea) { create(:idea) }
-    let(:initiator) { create(:user, first_name: 'Marion') }
-    let(:comment) { create(:comment, post: idea, body_multiloc: { 'en' => 'I agree' }, author: initiator) }
-    let(:notification) { create(:comment_on_idea_you_follow, recipient: recipient, post: idea, comment: comment) }
-    let(:command) do
+    let_it_be(:recipient) { create(:user, locale: 'en') }
+    let_it_be(:campaign) { EmailCampaigns::Campaigns::CommentOnIdeaYouFollow.create! }
+    let_it_be(:idea) { create(:idea) }
+    let_it_be(:initiator) { create(:user, first_name: 'Marion') }
+    let_it_be(:comment) { create(:comment, post: idea, body_multiloc: { 'en' => 'I agree' }, author: initiator) }
+    let_it_be(:notification) { create(:comment_on_idea_you_follow, recipient: recipient, post: idea, comment: comment) }
+    let_it_be(:command) do
       activity = create(:activity, item: notification, action: 'created')
       create(:comment_on_idea_you_follow_campaign).generate_commands(
         activity: activity,
@@ -18,7 +18,7 @@
       ).first.merge({ recipient: recipient })
     end
 
-    let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+    let_it_be(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
 
     before { EmailCampaigns::UnsubscriptionToken.create!(user_id: recipient.id) }
 
diff --git a/back/engines/free/email_campaigns/spec/mailers/comment_on_initiative_you_follow_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/comment_on_initiative_you_follow_mailer_spec.rb
index d292addb7b1c..2042e403a333 100644
--- a/back/engines/free/email_campaigns/spec/mailers/comment_on_initiative_you_follow_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/comment_on_initiative_you_follow_mailer_spec.rb
@@ -4,13 +4,13 @@
 
 RSpec.describe EmailCampaigns::CommentOnInitiativeYouFollowMailer do
   describe 'CommentOnInitiativeYouFollow' do
-    let(:recipient) { create(:user, locale: 'en') }
-    let(:campaign) { EmailCampaigns::Campaigns::CommentOnInitiativeYouFollow.create! }
-    let(:initiative) { create(:initiative) }
-    let(:initiator) { create(:user, first_name: 'Dries') }
-    let(:comment) { create(:comment, post: initiative, body_multiloc: { 'en' => 'I agree' }, author: initiator) }
-    let(:notification) { create(:comment_on_initiative_you_follow, recipient: recipient, post: initiative, comment: comment) }
-    let(:command) do
+    let_it_be(:recipient) { create(:user, locale: 'en') }
+    let_it_be(:campaign) { EmailCampaigns::Campaigns::CommentOnInitiativeYouFollow.create! }
+    let_it_be(:initiative) { create(:initiative) }
+    let_it_be(:initiator) { create(:user, first_name: 'Dries') }
+    let_it_be(:comment) { create(:comment, post: initiative, body_multiloc: { 'en' => 'I agree' }, author: initiator) }
+    let_it_be(:notification) { create(:comment_on_initiative_you_follow, recipient: recipient, post: initiative, comment: comment) }
+    let_it_be(:command) do
       activity = create(:activity, item: notification, action: 'created')
       create(:comment_on_initiative_you_follow_campaign).generate_commands(
         activity: activity,
@@ -18,7 +18,7 @@
       ).first.merge({ recipient: recipient })
     end
 
-    let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+    let_it_be(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
 
     before { EmailCampaigns::UnsubscriptionToken.create!(user_id: recipient.id) }
 
diff --git a/back/engines/free/email_campaigns/spec/mailers/official_feedback_on_idea_you_follow_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/official_feedback_on_idea_you_follow_mailer_spec.rb
index 5672c4c68ee0..991b92e85e2e 100644
--- a/back/engines/free/email_campaigns/spec/mailers/official_feedback_on_idea_you_follow_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/official_feedback_on_idea_you_follow_mailer_spec.rb
@@ -4,12 +4,12 @@
 
 RSpec.describe EmailCampaigns::OfficialFeedbackOnIdeaYouFollowMailer do
   describe 'campaign_mail' do
-    let(:recipient) { create(:user, locale: 'en') }
-    let(:idea) { create(:idea, title_multiloc: { 'en' => 'Idea title' }) }
-    let(:feedback) { create(:official_feedback, body_multiloc: { 'en' => 'We appreciate your participation' }, post: idea) }
-    let(:campaign) { EmailCampaigns::Campaigns::OfficialFeedbackOnIdeaYouFollow.create! }
-    let(:notification) { create(:official_feedback_on_idea_you_follow, recipient: recipient, post: idea, official_feedback: feedback) }
-    let(:command) do
+    let_it_be(:recipient) { create(:user, locale: 'en') }
+    let_it_be(:idea) { create(:idea, title_multiloc: { 'en' => 'Idea title' }) }
+    let_it_be(:feedback) { create(:official_feedback, body_multiloc: { 'en' => 'We appreciate your participation' }, post: idea) }
+    let_it_be(:campaign) { EmailCampaigns::Campaigns::OfficialFeedbackOnIdeaYouFollow.create! }
+    let_it_be(:notification) { create(:official_feedback_on_idea_you_follow, recipient: recipient, post: idea, official_feedback: feedback) }
+    let_it_be(:command) do
       activity = create(:activity, item: notification, action: 'created')
       create(:official_feedback_on_idea_you_follow_campaign).generate_commands(
         activity: activity,
@@ -17,7 +17,7 @@
       ).first.merge({ recipient: recipient })
     end
 
-    let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+    let_it_be(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
 
     before { EmailCampaigns::UnsubscriptionToken.create!(user_id: recipient.id) }
 
diff --git a/back/engines/free/email_campaigns/spec/mailers/official_feedback_on_initiative_you_follow_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/official_feedback_on_initiative_you_follow_mailer_spec.rb
index 11cd0cfbb1d2..bd1ace30947c 100644
--- a/back/engines/free/email_campaigns/spec/mailers/official_feedback_on_initiative_you_follow_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/official_feedback_on_initiative_you_follow_mailer_spec.rb
@@ -4,12 +4,12 @@
 
 RSpec.describe EmailCampaigns::OfficialFeedbackOnInitiativeYouFollowMailer do
   describe 'campaign_mail' do
-    let(:recipient) { create(:user, locale: 'en') }
-    let(:initiative) { create(:initiative, title_multiloc: { 'en' => 'Initiative title' }) }
-    let(:feedback) { create(:official_feedback, body_multiloc: { 'en' => 'We appreciate your participation' }, post: initiative) }
-    let(:campaign) { EmailCampaigns::Campaigns::OfficialFeedbackOnInitiativeYouFollow.create! }
-    let(:notification) { create(:official_feedback_on_initiative_you_follow, recipient: recipient, post: initiative, official_feedback: feedback) }
-    let(:command) do
+    let_it_be(:recipient) { create(:user, locale: 'en') }
+    let_it_be(:initiative) { create(:initiative, title_multiloc: { 'en' => 'Initiative title' }) }
+    let_it_be(:feedback) { create(:official_feedback, body_multiloc: { 'en' => 'We appreciate your participation' }, post: initiative) }
+    let_it_be(:campaign) { EmailCampaigns::Campaigns::OfficialFeedbackOnInitiativeYouFollow.create! }
+    let_it_be(:notification) { create(:official_feedback_on_initiative_you_follow, recipient: recipient, post: initiative, official_feedback: feedback) }
+    let_it_be(:command) do
       activity = create(:activity, item: notification, action: 'created')
       create(:official_feedback_on_initiative_you_follow_campaign).generate_commands(
         activity: activity,
@@ -17,7 +17,7 @@
       ).first.merge({ recipient: recipient })
     end
 
-    let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+    let_it_be(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
 
     before { EmailCampaigns::UnsubscriptionToken.create!(user_id: recipient.id) }
 
diff --git a/back/engines/free/email_campaigns/spec/mailers/project_folder_moderation_rights_received_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/project_folder_moderation_rights_received_mailer_spec.rb
index 5e60a90a3806..55d9bd1503d2 100644
--- a/back/engines/free/email_campaigns/spec/mailers/project_folder_moderation_rights_received_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/project_folder_moderation_rights_received_mailer_spec.rb
@@ -4,12 +4,10 @@
 
 RSpec.describe ProjectFolders::EmailCampaigns::ProjectFolderModerationRightsReceivedMailer do
   describe 'campaign_mail' do
-    let(:project_folder) { create(:project_folder) }
-    let!(:recipient) { create(:project_folder_moderator, locale: 'en', project_folders: [project_folder]) }
-    let!(:campaign) { EmailCampaigns::Campaigns::ProjectFolderModerationRightsReceived.create! }
-    let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
-
-    let(:command) do
+    let_it_be(:project_folder) { create(:project_folder) }
+    let_it_be(:recipient) { create(:project_folder_moderator, locale: 'en', project_folders: [project_folder]) }
+    let_it_be(:campaign) { EmailCampaigns::Campaigns::ProjectFolderModerationRightsReceived.create! }
+    let_it_be(:command) do
       {
         recipient: recipient,
         event_payload: {
@@ -21,6 +19,8 @@
       }
     end
 
+    let_it_be(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+
     before do
       EmailCampaigns::UnsubscriptionToken.create!(user_id: recipient.id)
     end
diff --git a/back/engines/free/email_campaigns/spec/mailers/project_phase_started_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/project_phase_started_mailer_spec.rb
index 6b7c227f8b20..903f3595e2e3 100644
--- a/back/engines/free/email_campaigns/spec/mailers/project_phase_started_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/project_phase_started_mailer_spec.rb
@@ -4,12 +4,12 @@
 
 RSpec.describe EmailCampaigns::ProjectPhaseStartedMailer do
   describe 'campaign_mail' do
-    let(:recipient) { create(:user, locale: 'en') }
-    let(:project) { create(:project_with_phases) }
-    let(:phase) { project.phases.first }
-    let(:campaign) { EmailCampaigns::Campaigns::ProjectPhaseStarted.create! }
-    let(:notification) { create(:project_phase_started, recipient: recipient, project: project, phase: phase) }
-    let(:command) do
+    let_it_be(:recipient) { create(:user, locale: 'en') }
+    let_it_be(:project) { create(:project_with_phases) }
+    let_it_be(:phase) { project.phases.first }
+    let_it_be(:campaign) { EmailCampaigns::Campaigns::ProjectPhaseStarted.create! }
+    let_it_be(:notification) { create(:project_phase_started, recipient: recipient, project: project, phase: phase) }
+    let_it_be(:command) do
       activity = create(:activity, item: notification, action: 'created')
       create(:project_phase_started_campaign).generate_commands(
         activity: activity,
@@ -17,7 +17,7 @@
       ).first.merge({ recipient: recipient })
     end
 
-    let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+    let_it_be(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
 
     before { EmailCampaigns::UnsubscriptionToken.create!(user_id: recipient.id) }
 
diff --git a/back/engines/free/email_campaigns/spec/mailers/project_published_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/project_published_mailer_spec.rb
index 13ca7d356c9e..7740ec8deadc 100644
--- a/back/engines/free/email_campaigns/spec/mailers/project_published_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/project_published_mailer_spec.rb
@@ -4,10 +4,10 @@
 
 RSpec.describe EmailCampaigns::ProjectPublishedMailer do
   describe 'campaign_mail' do
-    let(:recipient) { create(:user, locale: 'en') }
-    let(:campaign) { EmailCampaigns::Campaigns::ProjectPublished.create! }
-    let(:project) { create(:project) }
-    let(:command) do
+    let_it_be(:recipient) { create(:user, locale: 'en') }
+    let_it_be(:campaign) { EmailCampaigns::Campaigns::ProjectPublished.create! }
+    let_it_be(:project) { create(:project) }
+    let_it_be(:command) do
       activity = create(:activity, item: project, action: 'published')
       create(:project_published_campaign).generate_commands(
         activity: activity,
@@ -15,7 +15,7 @@
       ).first.merge({ recipient: recipient })
     end
 
-    let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+    let_it_be(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
 
     before { EmailCampaigns::UnsubscriptionToken.create!(user_id: recipient.id) }
 
diff --git a/back/engines/free/email_campaigns/spec/mailers/status_change_on_idea_you_follow_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/status_change_on_idea_you_follow_mailer_spec.rb
index 2e9b653d7635..942d47bc4356 100644
--- a/back/engines/free/email_campaigns/spec/mailers/status_change_on_idea_you_follow_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/status_change_on_idea_you_follow_mailer_spec.rb
@@ -4,17 +4,17 @@
 
 RSpec.describe EmailCampaigns::StatusChangeOnIdeaYouFollowMailer do
   describe 'campaign_mail' do
-    let(:recipient) { create(:user, locale: 'en') }
-    let(:campaign) { EmailCampaigns::Campaigns::StatusChangeOnIdeaYouFollow.create! }
-    let(:idea) { create(:idea) }
-    let(:command) do
+    let_it_be(:recipient) { create(:user, locale: 'en') }
+    let_it_be(:campaign) { EmailCampaigns::Campaigns::StatusChangeOnIdeaYouFollow.create! }
+    let_it_be(:idea) { create(:idea) }
+    let_it_be(:command) do
       campaign.generate_commands(
         recipient: recipient,
         activity: build(:activity, item: build(:notification, post: idea))
       ).first.merge({ recipient: recipient })
     end
 
-    let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+    let_it_be(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
 
     before { EmailCampaigns::UnsubscriptionToken.create!(user_id: recipient.id) }
 
diff --git a/back/engines/free/email_campaigns/spec/mailers/status_change_on_initiative_you_follow_mailer_spec.rb b/back/engines/free/email_campaigns/spec/mailers/status_change_on_initiative_you_follow_mailer_spec.rb
index e9c8804a982f..1624a76761c4 100644
--- a/back/engines/free/email_campaigns/spec/mailers/status_change_on_initiative_you_follow_mailer_spec.rb
+++ b/back/engines/free/email_campaigns/spec/mailers/status_change_on_initiative_you_follow_mailer_spec.rb
@@ -4,17 +4,17 @@
 
 RSpec.describe EmailCampaigns::StatusChangeOnInitiativeYouFollowMailer do
   describe 'campaign_mail' do
-    let(:recipient) { create(:user, locale: 'en') }
-    let(:campaign) { EmailCampaigns::Campaigns::StatusChangeOnInitiativeYouFollow.create! }
-    let(:initiative) { create(:initiative) }
-    let(:command) do
+    let_it_be(:recipient) { create(:user, locale: 'en') }
+    let_it_be(:campaign) { EmailCampaigns::Campaigns::StatusChangeOnInitiativeYouFollow.create! }
+    let_it_be(:initiative) { create(:initiative) }
+    let_it_be(:command) do
       campaign.generate_commands(
         recipient: recipient,
         activity: Activity.new(item: Notification.new(post: initiative))
       ).first.merge({ recipient: recipient })
     end
 
-    let(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
+    let_it_be(:mail) { described_class.with(command: command, campaign: campaign).campaign_mail.deliver_now }
 
     before { EmailCampaigns::UnsubscriptionToken.create!(user_id: recipient.id) }
 
diff --git a/back/spec/mailers/application_mailer_spec.rb b/back/spec/mailers/application_mailer_spec.rb
index a7d0edc72264..3b2de85a73d4 100644
--- a/back/spec/mailers/application_mailer_spec.rb
+++ b/back/spec/mailers/application_mailer_spec.rb
@@ -4,8 +4,8 @@
 
 RSpec.describe ApplicationMailer do
   describe 'localize_for_recipient_and_truncate' do
-    let!(:user) { create(:user, locale: 'en') }
-    let(:multiloc) { { 'en' => "Some test content text. A link is included here to test links when text is truncated: <a href=\"https://en.wikipedia.org/wiki/Ada_Lovelace\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">https://en.wikipedia.org/wiki/Ada_Lovelace</a>\nThis is a newline." } }
+    let_it_be(:user) { create(:user, locale: 'en') }
+    let_it_be(:multiloc) { { 'en' => "Some test content text. A link is included here to test links when text is truncated: <a href=\"https://en.wikipedia.org/wiki/Ada_Lovelace\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">https://en.wikipedia.org/wiki/Ada_Lovelace</a>\nThis is a newline." } }
 
     # If we naively truncated the original string to 140 characters length, we would end up with a broken link,
     # so we test this case.
diff --git a/back/spec/mailers/confirmations_mailer_spec.rb b/back/spec/mailers/confirmations_mailer_spec.rb
index 79b89bb6a27a..06971ccd58f3 100644
--- a/back/spec/mailers/confirmations_mailer_spec.rb
+++ b/back/spec/mailers/confirmations_mailer_spec.rb
@@ -4,8 +4,8 @@
 
 RSpec.describe ConfirmationsMailer do
   describe 'send_confirmation_code' do
-    let!(:user) { create(:user_with_confirmation, email: 'some_email@email.com') }
-    let(:message) { described_class.with(user: user).send_confirmation_code.deliver_now }
+    let_it_be(:user) { create(:user_with_confirmation, email: 'some_email@email.com') }
+    let_it_be(:message) { described_class.with(user: user).send_confirmation_code.deliver_now }
 
     before do
       SettingsService.new.activate_feature! 'user_confirmation'
@@ -19,9 +19,14 @@
       expect(message.to).to eq(['some_email@email.com'])
     end
 
-    it "renders the receiver's new email address when present" do
-      user.update!(new_email: 'new@email.com')
-      expect(message.to).to eq(['new@email.com'])
+    context "when receiver's email address changes" do
+      let(:user) { create(:user_with_confirmation, email: 'just_some_email@email.com') }
+      let(:message) { described_class.with(user: user).send_confirmation_code.deliver_now }
+
+      it "renders the receiver's new email address when present" do
+        user.update!(new_email: 'new@email.com')
+        expect(message.to).to eq(['new@email.com'])
+      end
     end
 
     it 'renders the sender address' do
diff --git a/back/spec/mailers/user_blocked_mailer_spec.rb b/back/spec/mailers/user_blocked_mailer_spec.rb
index 8317aaf3e04b..1d600effcbbf 100644
--- a/back/spec/mailers/user_blocked_mailer_spec.rb
+++ b/back/spec/mailers/user_blocked_mailer_spec.rb
@@ -4,8 +4,8 @@
 
 RSpec.describe UserBlockedMailer do
   describe 'send_email_to_blocked_user' do
-    let!(:user) { create(:user, block_end_at: 5.days.from_now) }
-    let(:message) { described_class.with(user: user).send_user_blocked_email.deliver_now }
+    let_it_be(:user) { create(:user, block_end_at: 5.days.from_now) }
+    let_it_be(:message) { described_class.with(user: user).send_user_blocked_email.deliver_now }
 
     it 'renders the subject' do
       expect(message.subject).to start_with('Your account has been temporarily disabled')
@@ -29,6 +29,9 @@
     end
 
     context 'when reason for blocking is provided' do
+      let(:user) { create(:user, block_end_at: 5.days.from_now) }
+      let(:message) { described_class.with(user: user).send_user_blocked_email.deliver_now }
+
       it 'includes reason for being blocked' do
         user.update(block_reason: 'You were very naughty!')
 

From 8ea860d5cf03a066d9747f44405f000f54817bf6 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 21 Feb 2024 18:29:31 +0100
Subject: [PATCH 040/282] WIP initial handling for Esri feature layer uploads

---
 front/app/api/map_layers/types.ts             |   4 +-
 front/app/components/EsriMap/index.tsx        |   6 +
 front/app/components/IdeasMap/index.tsx       |  23 +-
 .../IdeationConfigurationMap.tsx              |  23 +-
 .../PostShowComponents/DropdownMap/Map.tsx    |  15 +-
 .../EsriImportOptions.tsx                     |  48 ++++
 .../FeatureLayerUpload.tsx                    | 160 +++++++++++++
 .../MapConfigOverview.tsx                     |   5 +-
 .../MapLayersList.tsx                         |  27 ++-
 .../ProjectCustomMapConfigPage/index.tsx      |  27 ++-
 .../ProjectCustomMapConfigPage/messages.ts    |  33 +++
 front/package-lock.json                       | 219 ++++++++++++++++++
 front/package.json                            |   1 +
 13 files changed, 561 insertions(+), 30 deletions(-)
 create mode 100644 front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
 create mode 100644 front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx

diff --git a/front/app/api/map_layers/types.ts b/front/app/api/map_layers/types.ts
index 35d02e8517b5..582b8f597cfa 100644
--- a/front/app/api/map_layers/types.ts
+++ b/front/app/api/map_layers/types.ts
@@ -3,6 +3,7 @@ import { Multiloc, UploadFile } from 'typings';
 export interface IMapLayerAttributes {
   id: string;
   type: 'CustomMaps::GeojsonLayer' | 'CustomMaps::EsriFeatureLayer';
+  layer_url?: string;
   title_multiloc: Multiloc;
   geojson?: GeoJSON.FeatureCollection;
   default_enabled: boolean;
@@ -13,8 +14,9 @@ export interface IMapLayerAttributes {
 export interface IMapLayerUpdateAttributes {
   id: string;
   projectId: string;
+  layer_url?: string;
   title_multiloc?: Multiloc;
-  geojson: GeoJSON.FeatureCollection;
+  geojson?: GeoJSON.FeatureCollection;
   default_enabled?: boolean;
   geojson_file?: UploadFile;
   marker_svg_url?: string;
diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index dd586702830a..1e7cc712e263 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -3,6 +3,7 @@ import '@arcgis/core/assets/esri/themes/light/main.css';
 
 // hooks
 import useAppConfiguration from 'api/app_configuration/useAppConfiguration';
+import useLocale from 'hooks/useLocale';
 
 // components
 import Map from '@arcgis/core/Map';
@@ -22,6 +23,7 @@ import { getDefaultBasemap } from './utils';
 import { isNil } from 'utils/helperUtils';
 import { debounce } from 'lodash-es';
 import styled from 'styled-components';
+import * as intl from '@arcgis/core/intl.js';
 
 // typings
 import { EsriUiElement } from './types';
@@ -78,6 +80,7 @@ const EsriMap = ({
   initialData,
   globalMapSettings,
 }: EsriMapProps) => {
+  const locale = useLocale();
   const isMobileOrSmaller = useBreakpoint('phone');
   const [map, setMap] = useState<Map | null>(null);
   const [mapView, setMapView] = useState<MapView | null>(null);
@@ -85,6 +88,9 @@ const EsriMap = ({
 
   const initialValuesLoaded = useRef(false);
 
+  // Sets the locale of the map
+  intl.setLocale(locale);
+
   // On initial render, create a new map and map view and save them to state variables
   useEffect(() => {
     if (mapRef.current) {
diff --git a/front/app/components/IdeasMap/index.tsx b/front/app/components/IdeasMap/index.tsx
index 678885420a24..40064af4b607 100644
--- a/front/app/components/IdeasMap/index.tsx
+++ b/front/app/components/IdeasMap/index.tsx
@@ -188,11 +188,20 @@ const IdeasMap = memo<Props>(({ projectId, phaseId, ideasList }: Props) => {
     );
   }, [windowWidth, containerWidth, tablet]);
 
-  // Create Esri GeoJSON layers from mapConfig layers
-  const geoJsonLayers = useMemo(() => {
-    const layers = mapConfig?.data?.attributes?.layers;
-    if (layers) {
-      return createEsriGeoJsonLayers(layers, localize);
+  // Create Esri layers from mapConfig layers
+  const mapLayers = useMemo(() => {
+    const layers = mapConfig?.data.attributes.layers;
+
+    // All layers are either of type Esri or GeoJSON, so we can check just the first layer
+    if (layers && layers[0].geojson?.features) {
+      return createEsriGeoJsonLayers(
+        mapConfig?.data.attributes.layers,
+        localize
+      );
+    } else if (layers) {
+      return layers.map((layer) => {
+        return new FeatureLayer({ url: layer.layer_url });
+      });
     }
     return [];
   }, [mapConfig, localize]);
@@ -262,8 +271,8 @@ const IdeasMap = memo<Props>(({ projectId, phaseId, ideasList }: Props) => {
   ]);
 
   const layers = useMemo(() => {
-    return ideasLayer ? [...geoJsonLayers, ideasLayer] : geoJsonLayers;
-  }, [ideasLayer, geoJsonLayers]);
+    return ideasLayer ? [...mapLayers, ideasLayer] : mapLayers;
+  }, [ideasLayer, mapLayers]);
 
   const onMapInit = useCallback(
     (mapView: MapView) => {
diff --git a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
index 5f29527fd4ff..72caed245590 100644
--- a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
+++ b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
@@ -17,6 +17,7 @@ import {
 
 // types
 import { IMapConfig } from 'api/map_config/types';
+import FeatureLayer from '@arcgis/core/layers/FeatureLayer';
 
 export interface Props {
   mapConfig: IMapConfig;
@@ -32,11 +33,21 @@ const IdeationConfigurationMap = memo<Props>(
     );
 
     // Create GeoJSON layers to add to Esri map
-    const geoJsonLayers = useMemo(() => {
-      return createEsriGeoJsonLayers(
-        mapConfig.data.attributes.layers,
-        localize
-      );
+    const mapLayers = useMemo(() => {
+      const layers = mapConfig.data.attributes.layers;
+
+      // All layers are either of type Esri or GeoJSON, so we can check just the first layer
+      if (layers && layers[0]?.geojson?.features) {
+        return createEsriGeoJsonLayers(
+          mapConfig.data.attributes.layers,
+          localize
+        );
+      } else if (layers) {
+        return layers.map((layer) => {
+          return new FeatureLayer({ url: layer.layer_url });
+        });
+      }
+      return [];
     }, [mapConfig, localize]);
 
     const onMapInit = useCallback((esriMapView: MapView) => {
@@ -73,7 +84,7 @@ const IdeationConfigurationMap = memo<Props>(
             onInit: onMapInit,
           }}
           height={'700px'}
-          layers={geoJsonLayers}
+          layers={mapLayers}
           onHover={onHover}
         />
         <LayerHoverLabel
diff --git a/front/app/components/PostShowComponents/DropdownMap/Map.tsx b/front/app/components/PostShowComponents/DropdownMap/Map.tsx
index ffa1e6e000d0..4e804dde8938 100644
--- a/front/app/components/PostShowComponents/DropdownMap/Map.tsx
+++ b/front/app/components/PostShowComponents/DropdownMap/Map.tsx
@@ -1,5 +1,5 @@
 import EsriMap from 'components/EsriMap';
-import React, { memo } from 'react';
+import React, { memo, useMemo } from 'react';
 import Graphic from '@arcgis/core/Graphic';
 import Point from '@arcgis/core/geometry/Point';
 import {
@@ -22,10 +22,15 @@ const MapComponent = memo<Props>(({ position, projectId }) => {
   const center = position.coordinates;
 
   // Load layers from project
-  const layers = createEsriGeoJsonLayers(
-    mapConfig?.data?.attributes?.layers || [],
-    localize
-  );
+
+  // Create GeoJSON layers to add to Esri map
+  const layers = useMemo(() => {
+    const mapConfigLayers = mapConfig?.data.attributes.layers;
+    if (mapConfigLayers && mapConfigLayers[0].geojson?.features) {
+      return createEsriGeoJsonLayers(mapConfigLayers, localize);
+    }
+    return [];
+  }, [mapConfig, localize]);
 
   // Create point graphic for idea location
   const pointGraphic = new Graphic({
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
new file mode 100644
index 000000000000..3aaa99af5ea4
--- /dev/null
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
@@ -0,0 +1,48 @@
+import React, { memo } from 'react';
+
+// components
+import { Box, Button } from '@citizenlab/cl2-component-library';
+
+// intl
+import { useIntl } from 'utils/cl-intl';
+import messages from './messages';
+
+// types
+import { ViewOptions } from '.';
+
+interface Props {
+  projectId: string;
+  mapConfigId: string;
+  setView: (view: ViewOptions) => void;
+}
+
+const EsriImportOptions = memo<Props>(({ setView }) => {
+  const { formatMessage } = useIntl();
+
+  return (
+    <Box mb="12px">
+      <Box display="flex" gap="12px" flexWrap="wrap">
+        <Button
+          icon="location-simple"
+          buttonStyle="secondary"
+          onClick={() => {
+            setView('featureLayerUpload');
+          }}
+        >
+          {formatMessage(messages.importEsriFeatureLayer)}
+        </Button>
+        <Button
+          icon="map"
+          buttonStyle="secondary"
+          onClick={() => {
+            setView('webMapUpload');
+          }}
+        >
+          {formatMessage(messages.importEsriWebMap)}
+        </Button>
+      </Box>
+    </Box>
+  );
+});
+
+export default EsriImportOptions;
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
new file mode 100644
index 000000000000..c28eb9270fb7
--- /dev/null
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
@@ -0,0 +1,160 @@
+import React, { useState } from 'react';
+
+// intl
+import { useIntl } from 'utils/cl-intl';
+import messages from './messages';
+
+// components
+import Error from 'components/UI/Error';
+import {
+  Box,
+  Title,
+  Text,
+  IconTooltip,
+  Input,
+  Button,
+} from '@citizenlab/cl2-component-library';
+
+// types
+import { ViewOptions } from '.';
+
+// utils
+import { isNilOrError } from 'utils/helperUtils';
+import { request, ErrorTypes, ApiKeyManager } from '@esri/arcgis-rest-request';
+
+// hooks
+import useAppConfigurationLocales from 'hooks/useAppConfigurationLocales';
+import useAddMapLayer from 'api/map_layers/useAddMapLayer';
+import useAppConfiguration from 'api/app_configuration/useAppConfiguration';
+
+type Props = {
+  projectId: string;
+  setView: (view: ViewOptions) => void;
+  mapConfigId: string;
+};
+
+const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
+  const { formatMessage } = useIntl();
+  const { data: appConfig } = useAppConfiguration();
+
+  const [url, setUrl] = useState('');
+  const [importError, setImportError] = useState(false);
+
+  const tenantLocales = useAppConfigurationLocales();
+  const { mutate: createProjectMapLayer } = useAddMapLayer();
+
+  const addEsriFeatureLayer = () => {
+    // First test if we have access to the Feature Layer URL
+    const apiKey =
+      appConfig?.data.attributes.settings.esri_integration?.api_key;
+    const esriAuthManager = apiKey ? ApiKeyManager.fromKey(apiKey) : undefined;
+
+    request(url, {
+      authentication: esriAuthManager,
+    })
+      .then(() => {
+        setImportError(false);
+
+        // Add the new map layer
+        if (mapConfigId && !isNilOrError(tenantLocales)) {
+          createProjectMapLayer(
+            {
+              type: 'CustomMaps::EsriFeatureLayer',
+              projectId,
+              layer_url: url,
+              id: mapConfigId,
+              title_multiloc: { en: 'Testing', 'nl-BE': 'Testing nl-BE' }, // TODO
+              default_enabled: true,
+            },
+            {
+              onError: () => {
+                setImportError(true);
+              },
+              onSuccess: () => {
+                setView('main');
+              },
+            }
+          );
+        }
+      })
+      .catch((e) => {
+        setImportError(true);
+
+        switch (e.name) {
+          case ErrorTypes.ArcGISRequestError:
+            console.log('A general error from the API');
+            break;
+
+          case ErrorTypes.ArcGISAuthError:
+            console.log('An authentication error');
+            break;
+
+          case ErrorTypes.ArcGISAccessDeniedError:
+            console.log(
+              'A user denying an authorization request in an oAuth workflow'
+            );
+            break;
+
+          case ErrorTypes.ArcGISTokenRequestError:
+            console.log(
+              'An error response trying to generate a new access token'
+            );
+            break;
+
+          default:
+            console.log('Default error from Esri - usually a network error.');
+        }
+      });
+  };
+
+  return (
+    <>
+      <Box mt="12px" display="flex" gap="8px" alignContent="center">
+        <Title my="4px" variant="h5" color={'coolGrey600'} fontWeight="bold">
+          {formatMessage(messages.addFeatureLayer)}
+        </Title>
+        <IconTooltip
+          mb="4px"
+          content={<p>TODO: Tooltip w image & link to support article</p>}
+        />
+      </Box>
+      <Text my="8px" color={'grey800'}>
+        {formatMessage(messages.addFeatureLayerInstruction)}
+      </Text>
+      <Input
+        type="text"
+        value={url}
+        onChange={(value) => {
+          setUrl(value);
+        }}
+        placeholder={
+          'E.g. https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Congressional_Districts/FeatureServer/0'
+        }
+      />
+
+      <Box display="flex" flexWrap="wrap" gap="12px" mt="16px">
+        <Button
+          buttonStyle="secondary"
+          onClick={() => {
+            setView('main');
+          }}
+        >
+          {formatMessage(messages.cancel2)}
+        </Button>
+        <Button onClick={addEsriFeatureLayer}>
+          {formatMessage(messages.import2)}
+        </Button>
+      </Box>
+
+      {importError && (
+        <Error
+          text={formatMessage(messages.importError)}
+          marginTop="10px"
+          showIcon={true}
+        />
+      )}
+    </>
+  );
+};
+
+export default FeatureLayerUpload;
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfigOverview.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfigOverview.tsx
index 02053bdabf32..1ac1d33e0ec4 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfigOverview.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfigOverview.tsx
@@ -14,6 +14,7 @@ import messages from './messages';
 
 // styling
 import styled from 'styled-components';
+import { ViewOptions } from '.';
 
 const Container = styled.div``;
 
@@ -45,9 +46,10 @@ const StyledMapCenterAndZoomConfig = styled(MapCenterAndZoomConfig)``;
 interface Props {
   projectId: string;
   className?: string;
+  setView: (view: ViewOptions) => void;
 }
 
-const MapConfigOverview = memo<Props>(({ projectId, className }) => {
+const MapConfigOverview = memo<Props>(({ projectId, className, setView }) => {
   const [editedMapLayerId, setEditedMapLayerId] = useState<string | null>(null);
 
   const openLayerConfig = (layerId: string) => {
@@ -79,6 +81,7 @@ const MapConfigOverview = memo<Props>(({ projectId, className }) => {
           <StyledMapLayersList
             projectId={projectId}
             onEditLayer={openLayerConfig}
+            setView={setView}
           />
           <StyledMapCenterAndZoomConfig projectId={projectId} />
         </>
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
index 98f5798e09b0..7ef7f15fdd3b 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
@@ -12,6 +12,7 @@ import Tippy from '@tippyjs/react';
 import { SubSectionTitle } from 'components/admin/Section';
 import { SortableList, SortableRow } from 'components/admin/ResourceList';
 import GeoJsonImportButton from './GeoJsonImportButton';
+import EsriImportOptions from './EsriImportOptions';
 
 // hooks
 import useDeleteMapLayer from 'api/map_layers/useDeleteMapLayer';
@@ -22,6 +23,7 @@ import { getLayerColor, getLayerIcon } from '../../../utils/mapUtils/map';
 import addOrderingToLayers, {
   IMapLayerAttributesWithOrdering,
 } from './addOrderingToLayers';
+import { ViewOptions } from '.';
 
 // i18n
 import { injectIntl, FormattedMessage } from 'utils/cl-intl';
@@ -32,6 +34,7 @@ import messages from './messages';
 // styling
 import styled from 'styled-components';
 import useMapConfig from 'api/map_config/useMapConfig';
+import useFeatureFlag from 'hooks/useFeatureFlag';
 
 const Container = styled.div``;
 
@@ -83,6 +86,7 @@ interface Props {
   projectId: string;
   onEditLayer: (layerId: string) => void;
   className?: string;
+  setView: (view: ViewOptions) => void;
 }
 
 const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
@@ -91,11 +95,15 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
     onEditLayer,
     className,
     intl: { formatMessage },
+    setView,
     localize,
   }) => {
     const { data: mapConfig } = useMapConfig(projectId);
     const { mutate: deleteProjectMapLayer } = useDeleteMapLayer();
     const { mutate: reorderProjectMapLayer } = useReorderMapLayer();
+    const isEsriIntegrationEnabled = useFeatureFlag({
+      name: 'esri_integration',
+    });
 
     const handleReorderLayers = (mapLayerId: string, newOrder: number) => {
       reorderProjectMapLayer({ projectId, id: mapLayerId, ordering: newOrder });
@@ -132,7 +140,7 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
     return (
       <Container className={className || ''}>
         <SubSectionTitle>
-          <FormattedMessage {...messages.layers} />
+          <FormattedMessage {...messages.mapData} />
           <StyledIconTooltip
             content={
               <FormattedMessage
@@ -222,10 +230,19 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
         )}
 
         {mapConfig?.data?.id && (
-          <GeoJsonImportButton
-            projectId={projectId}
-            mapConfigId={mapConfig.data.id}
-          />
+          <>
+            {isEsriIntegrationEnabled && (
+              <EsriImportOptions
+                projectId={projectId}
+                mapConfigId={mapConfig.data.id}
+                setView={setView}
+              />
+            )}
+            <GeoJsonImportButton
+              projectId={projectId}
+              mapConfigId={mapConfig.data.id}
+            />
+          </>
         )}
       </Container>
     );
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx
index 1df6eef7923f..93ecd536c768 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx
@@ -1,8 +1,8 @@
-import React, { memo, useEffect } from 'react';
+import React, { memo, useEffect, useState } from 'react';
 import { useParams } from 'react-router-dom';
 
 // components
-import { Spinner } from '@citizenlab/cl2-component-library';
+import { Box, Spinner } from '@citizenlab/cl2-component-library';
 import Centerer from 'components/UI/Centerer';
 import MapConfigOverview from './MapConfigOverview';
 
@@ -18,14 +18,15 @@ import { getCenter, getZoomLevel } from '../../../utils/mapUtils/map';
 // styling
 import styled from 'styled-components';
 import IdeationConfigurationMap from '../../../components/IdeationConfigurationMap/IdeationConfigurationMap';
+import FeatureLayerUpload from './FeatureLayerUpload';
 
 const Container = styled.div`
   display: flex;
 `;
 
 const StyledMapConfigOverview = styled(MapConfigOverview)`
-  flex: 0 0 400px;
-  width: 400px;
+  flex: 0 0 520px;
+  width: 520px;
 `;
 
 const MapWrapper = styled.div`
@@ -35,6 +36,8 @@ const MapWrapper = styled.div`
   height: 700px;
 `;
 
+export type ViewOptions = 'main' | 'featureLayerUpload' | 'webMapUpload';
+
 interface Props {
   className?: string;
 }
@@ -46,6 +49,7 @@ const ProjectCustomMapConfigPage = memo<Props>(({ className }) => {
   const { data: appConfig } = useAppConfiguration();
   const { mutate: createProjectMapConfig } = useAddMapConfig();
   const { data: mapConfig, isFetching } = useMapConfig(projectId);
+  const [view, setView] = useState<ViewOptions>('main');
 
   const defaultLatLng = getCenter(undefined, appConfig?.data, mapConfig?.data);
   const defaultLat = defaultLatLng[0];
@@ -84,7 +88,20 @@ const ProjectCustomMapConfigPage = memo<Props>(({ className }) => {
   if (projectId && mapConfig?.data?.id) {
     return (
       <Container className={className || ''}>
-        <StyledMapConfigOverview projectId={projectId} />
+        {view === 'main' && (
+          <StyledMapConfigOverview projectId={projectId} setView={setView} />
+        )}
+
+        {view === 'featureLayerUpload' && (
+          <Box flex="0 0 520px" width="520px">
+            <FeatureLayerUpload
+              projectId={projectId}
+              setView={setView}
+              mapConfigId={mapConfig?.data.id}
+            />
+          </Box>
+        )}
+
         <MapWrapper>
           <IdeationConfigurationMap
             mapConfig={mapConfig}
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
index cc751a25f970..3b3d7084fba8 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
@@ -168,4 +168,37 @@ export default defineMessages({
     id: 'app.components.admin.PostManager.saved',
     defaultMessage: `Saved`,
   },
+  mapData: {
+    id: 'app.components.admin.PostManager.mapData',
+    defaultMessage: 'Map data',
+  },
+  importEsriWebMap: {
+    id: 'app.components.admin.PostManager.importEsriWebMap',
+    defaultMessage: 'Import Esri Web Map',
+  },
+  importEsriFeatureLayer: {
+    id: 'app.components.admin.PostManager.importEsriFeatureLayer',
+    defaultMessage: 'Import Esri Feature Layer',
+  },
+  addFeatureLayer: {
+    id: 'app.components.admin.PostManager.addFeatureLayer',
+    defaultMessage: 'Add feature layer',
+  },
+  addFeatureLayerTooltip: {
+    id: 'app.components.admin.PostManager.addFeatureLayerTooltip',
+    defaultMessage: 'Add a new feature layer to the map',
+  },
+  addFeatureLayerInstruction: {
+    id: 'app.components.admin.PostManager.addFeatureLayerInstruction',
+    defaultMessage:
+      'Copy the URL of the feature layer hosted on ArcGIS Online and paste it in the input below:',
+  },
+  cancel2: {
+    id: 'app.components.admin.PostManager.cancel2',
+    defaultMessage: 'Cancel',
+  },
+  import2: {
+    id: 'app.components.admin.PostManager.import2',
+    defaultMessage: 'Import',
+  },
 });
diff --git a/front/package-lock.json b/front/package-lock.json
index a9c123b892e1..5709a2f01fba 100644
--- a/front/package-lock.json
+++ b/front/package-lock.json
@@ -13,6 +13,7 @@
         "@babel/runtime": "7.x",
         "@citizenlab/cl2-component-library": "file:../cl2-component-library/dist",
         "@craftjs/core": "^0.2.0-beta.5",
+        "@esri/arcgis-rest-request": "^4.2.0",
         "@hookform/resolvers": "^3.1.0",
         "@jsonforms/core": "3.0.0-beta.0",
         "@jsonforms/react": "3.0.0-beta.1",
@@ -3223,6 +3224,53 @@
         "xss": "1.0.13"
       }
     },
+    "node_modules/@esri/arcgis-rest-fetch": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-fetch/-/arcgis-rest-fetch-4.0.0.tgz",
+      "integrity": "sha512-ybsMO2L4cxx0IaIx0jv6/VbXidZmQIiGD3bvPF1/n1Y1ljHIhCvX+ti54cQSfg/HW2+VAVVnt8EPD/omVhNAyg==",
+      "dependencies": {
+        "node-fetch": "^3.0.0"
+      }
+    },
+    "node_modules/@esri/arcgis-rest-fetch/node_modules/node-fetch": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+      "dependencies": {
+        "data-uri-to-buffer": "^4.0.0",
+        "fetch-blob": "^3.1.4",
+        "formdata-polyfill": "^4.0.10"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/node-fetch"
+      }
+    },
+    "node_modules/@esri/arcgis-rest-form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-form-data/-/arcgis-rest-form-data-4.0.0.tgz",
+      "integrity": "sha512-cAS9HONIJgseCDdgRCIHBR4CE/OQXZIRP3FoNx/w+XyjVqK6yQiwCeXpYLfHeEZ6GEQqrA9XUBxifWG9UaJyXA==",
+      "dependencies": {
+        "formdata-node": "^4.1.0"
+      }
+    },
+    "node_modules/@esri/arcgis-rest-request": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-request/-/arcgis-rest-request-4.2.0.tgz",
+      "integrity": "sha512-2XLy0Ivar3BIr4ehe/5hYottIqiHnC8LDqhMPglufoLcsX9LFOr81X74aPXX0Ad3xVMaSy2HLLVNoNOkhwFGqQ==",
+      "dependencies": {
+        "@esri/arcgis-rest-fetch": "^4.0.0",
+        "@esri/arcgis-rest-form-data": "^4.0.0",
+        "mitt": "^3.0.0",
+        "tslib": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=12.20.0"
+      }
+    },
     "node_modules/@esri/calcite-colors": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/@esri/calcite-colors/-/calcite-colors-6.1.0.tgz",
@@ -16278,6 +16326,14 @@
         "node": ">=0.10"
       }
     },
+    "node_modules/data-uri-to-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
     "node_modules/data-urls": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
@@ -18709,6 +18765,28 @@
         "pend": "~1.2.0"
       }
     },
+    "node_modules/fetch-blob": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "dependencies": {
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
+      },
+      "engines": {
+        "node": "^12.20 || >= 14.13"
+      }
+    },
     "node_modules/fetch-retry": {
       "version": "5.0.6",
       "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz",
@@ -19198,6 +19276,37 @@
       "resolved": "https://registry.npmjs.org/formatcoords/-/formatcoords-1.1.3.tgz",
       "integrity": "sha1-dS8FarL+NMHUrooZBIzgw44W7QM="
     },
+    "node_modules/formdata-node": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
+      "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
+      "dependencies": {
+        "node-domexception": "1.0.0",
+        "web-streams-polyfill": "4.0.0-beta.3"
+      },
+      "engines": {
+        "node": ">= 12.20"
+      }
+    },
+    "node_modules/formdata-node/node_modules/web-streams-polyfill": {
+      "version": "4.0.0-beta.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
+      "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==",
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+      "dependencies": {
+        "fetch-blob": "^3.1.2"
+      },
+      "engines": {
+        "node": ">=12.20.0"
+      }
+    },
     "node_modules/forwarded": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -23519,6 +23628,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/mitt": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
+    },
     "node_modules/mkdirp": {
       "version": "0.5.6",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@@ -23902,6 +24016,24 @@
         "node": ">= 0.10.5"
       }
     },
+    "node_modules/node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "github",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "engines": {
+        "node": ">=10.5.0"
+      }
+    },
     "node_modules/node-environment-flags": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
@@ -32959,6 +33091,45 @@
         "xss": "1.0.13"
       }
     },
+    "@esri/arcgis-rest-fetch": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-fetch/-/arcgis-rest-fetch-4.0.0.tgz",
+      "integrity": "sha512-ybsMO2L4cxx0IaIx0jv6/VbXidZmQIiGD3bvPF1/n1Y1ljHIhCvX+ti54cQSfg/HW2+VAVVnt8EPD/omVhNAyg==",
+      "requires": {
+        "node-fetch": "^3.0.0"
+      },
+      "dependencies": {
+        "node-fetch": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+          "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+          "requires": {
+            "data-uri-to-buffer": "^4.0.0",
+            "fetch-blob": "^3.1.4",
+            "formdata-polyfill": "^4.0.10"
+          }
+        }
+      }
+    },
+    "@esri/arcgis-rest-form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-form-data/-/arcgis-rest-form-data-4.0.0.tgz",
+      "integrity": "sha512-cAS9HONIJgseCDdgRCIHBR4CE/OQXZIRP3FoNx/w+XyjVqK6yQiwCeXpYLfHeEZ6GEQqrA9XUBxifWG9UaJyXA==",
+      "requires": {
+        "formdata-node": "^4.1.0"
+      }
+    },
+    "@esri/arcgis-rest-request": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-request/-/arcgis-rest-request-4.2.0.tgz",
+      "integrity": "sha512-2XLy0Ivar3BIr4ehe/5hYottIqiHnC8LDqhMPglufoLcsX9LFOr81X74aPXX0Ad3xVMaSy2HLLVNoNOkhwFGqQ==",
+      "requires": {
+        "@esri/arcgis-rest-fetch": "^4.0.0",
+        "@esri/arcgis-rest-form-data": "^4.0.0",
+        "mitt": "^3.0.0",
+        "tslib": "^2.3.1"
+      }
+    },
     "@esri/calcite-colors": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/@esri/calcite-colors/-/calcite-colors-6.1.0.tgz",
@@ -42711,6 +42882,11 @@
         "assert-plus": "^1.0.0"
       }
     },
+    "data-uri-to-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="
+    },
     "data-urls": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
@@ -44473,6 +44649,15 @@
         "pend": "~1.2.0"
       }
     },
+    "fetch-blob": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+      "requires": {
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
+      }
+    },
     "fetch-retry": {
       "version": "5.0.6",
       "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz",
@@ -44848,6 +45033,30 @@
       "resolved": "https://registry.npmjs.org/formatcoords/-/formatcoords-1.1.3.tgz",
       "integrity": "sha1-dS8FarL+NMHUrooZBIzgw44W7QM="
     },
+    "formdata-node": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
+      "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
+      "requires": {
+        "node-domexception": "1.0.0",
+        "web-streams-polyfill": "4.0.0-beta.3"
+      },
+      "dependencies": {
+        "web-streams-polyfill": {
+          "version": "4.0.0-beta.3",
+          "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
+          "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="
+        }
+      }
+    },
+    "formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+      "requires": {
+        "fetch-blob": "^3.1.2"
+      }
+    },
     "forwarded": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -48077,6 +48286,11 @@
         }
       }
     },
+    "mitt": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
+    },
     "mkdirp": {
       "version": "0.5.6",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@@ -48350,6 +48564,11 @@
         "minimatch": "^3.0.2"
       }
     },
+    "node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
+    },
     "node-environment-flags": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
diff --git a/front/package.json b/front/package.json
index 611695c992bc..9b64a67507f4 100644
--- a/front/package.json
+++ b/front/package.json
@@ -54,6 +54,7 @@
     "@babel/runtime": "7.x",
     "@citizenlab/cl2-component-library": "file:../cl2-component-library/dist",
     "@craftjs/core": "^0.2.0-beta.5",
+    "@esri/arcgis-rest-request": "^4.2.0",
     "@hookform/resolvers": "^3.1.0",
     "@jsonforms/core": "3.0.0-beta.0",
     "@jsonforms/react": "3.0.0-beta.1",

From 908f8568978ca72efc61e3fc78b8d9c9f9466e75 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Wed, 21 Feb 2024 17:32:27 +0000
Subject: [PATCH 041/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/en.json | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 301ff02e0269..f8124ca55c6e 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -97,6 +97,9 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Reaction counts:",
   "app.components.admin.PostManager.PostPreview.save": "Save",
   "app.components.admin.PostManager.PostPreview.submitError": "Error",
+  "app.components.admin.PostManager.addFeatureLayer": "Add feature layer",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Copy the URL of the feature layer hosted on ArcGIS Online and paste it in the input below:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Add a new feature layer to the map",
   "app.components.admin.PostManager.allPhases": "All phases",
   "app.components.admin.PostManager.allProjects": "All projects",
   "app.components.admin.PostManager.allStatuses": "All statuses",
@@ -107,6 +110,7 @@
   "app.components.admin.PostManager.assignee": "Assignee",
   "app.components.admin.PostManager.automatic": "(automatic)",
   "app.components.admin.PostManager.bodyTitle": "Description",
+  "app.components.admin.PostManager.cancel2": "Cancel",
   "app.components.admin.PostManager.changeStatusModalTitle": "Change this proposal's status",
   "app.components.admin.PostManager.comments": "Comments",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "This means you will lose all data associated with these initiatives, like comments and votes. This action cannot be undone.",
@@ -153,7 +157,10 @@
   "app.components.admin.PostManager.hiddenFieldsLink": "hidden fields",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Tip: If you're using Typeform, add {hiddenFieldsLink} to keep track of who has responded to your survey.",
+  "app.components.admin.PostManager.import2": "Import",
   "app.components.admin.PostManager.importError": "The selected file could not be imported because it's not a valid GeoJSON file",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Import Esri Feature Layer",
+  "app.components.admin.PostManager.importEsriWebMap": "Import Esri Web Map",
   "app.components.admin.PostManager.imported": "Imported",
   "app.components.admin.PostManager.initiatives": "proposals",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "proposal_comments",
@@ -167,6 +174,7 @@
   "app.components.admin.PostManager.latestFeedbackMode": "Use the latest existing official update as an explanation",
   "app.components.admin.PostManager.likes": "Likes",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Moving this input away from its current project will lose the information about its assigned phases. Do you want to proceed?",
+  "app.components.admin.PostManager.mapData": "Map data",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} proposals",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} posts",
   "app.components.admin.PostManager.newFeedbackMode": "Write a new update to explain this change",

From 7a151107a5ff8f02964a407f3c2a58683bac4588 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Fri, 23 Feb 2024 12:54:07 +0100
Subject: [PATCH 042/282] WIP additional support for uploading feature layers

---
 front/app/api/map_config/types.ts             |  1 +
 front/app/components/IdeasMap/index.tsx       |  2 +-
 .../IdeationConfigurationMap.tsx              | 39 +++++---
 .../EsriImportOptions.tsx                     | 92 +++++++++++++++----
 .../FeatureLayerUpload.tsx                    | 52 ++++++-----
 .../GeoJsonImportButton.tsx                   | 42 +++++++--
 .../MapLayerConfig.tsx                        |  7 +-
 .../MapLayersList.tsx                         | 57 +++++++-----
 .../addOrderingToLayers.ts                    |  3 +-
 .../ProjectCustomMapConfigPage/messages.ts    | 62 ++++++++++++-
 .../ProjectCustomMapConfigPage/utils.tsx      | 22 +++++
 front/app/containers/App/index.tsx            |  8 ++
 front/app/utils/mapUtils/map.ts               |  8 +-
 13 files changed, 297 insertions(+), 98 deletions(-)
 create mode 100644 front/app/containers/Admin/ProjectCustomMapConfigPage/utils.tsx

diff --git a/front/app/api/map_config/types.ts b/front/app/api/map_config/types.ts
index 31e4db0fd288..e43c290471c2 100644
--- a/front/app/api/map_config/types.ts
+++ b/front/app/api/map_config/types.ts
@@ -9,6 +9,7 @@ export interface IMapConfigAttributes {
   zoom_level?: string;
   tile_provider?: string | null;
   center_geojson?: GeoJSON.Point;
+  esri_web_map_id?: string | null;
 }
 
 export interface IMapConfigRelationships {
diff --git a/front/app/components/IdeasMap/index.tsx b/front/app/components/IdeasMap/index.tsx
index 69b6ab2cfd4e..59257cfb20b9 100644
--- a/front/app/components/IdeasMap/index.tsx
+++ b/front/app/components/IdeasMap/index.tsx
@@ -194,7 +194,7 @@ const IdeasMap = memo<Props>(({ projectId, phaseId, ideasList }: Props) => {
     const layers = mapConfig?.data.attributes.layers;
 
     // All layers are either of type Esri or GeoJSON, so we can check just the first layer
-    if (layers && layers[0].geojson?.features) {
+    if (layers && layers[0]?.geojson?.features) {
       return createEsriGeoJsonLayers(
         mapConfig?.data.attributes.layers,
         localize
diff --git a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
index 72caed245590..f726033b7828 100644
--- a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
+++ b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
@@ -5,7 +5,7 @@ import EsriMap from 'components/EsriMap';
 import MapView from '@arcgis/core/views/MapView';
 import LayerHoverLabel from './components/LayerHoverLabel';
 import MapHelperOptions from './components/MapHelperOptions';
-
+import Layer from '@arcgis/core/layers/Layer';
 // hooks
 import useLocalize from 'hooks/useLocalize';
 
@@ -32,20 +32,35 @@ const IdeationConfigurationMap = memo<Props>(
       null
     );
 
-    // Create GeoJSON layers to add to Esri map
+    // Create layers from map config to add to Esri map
     const mapLayers = useMemo(() => {
       const layers = mapConfig.data.attributes.layers;
+      if (layers && layers.length > 0) {
+        // All layers are either of type Esri or GeoJSON, so we can check just the first layer
+        if (layers[0]?.type === 'CustomMaps::GeojsonLayer') {
+          return createEsriGeoJsonLayers(
+            mapConfig.data.attributes.layers,
+            localize
+          );
+        } else if (layers[0]?.type === 'CustomMaps::EsriFeatureLayer') {
+          const esriLayer: Layer[] = [];
+
+          // if (layer.layer_url) {
+          //   request(layer.layer_url).then((response) => {
+          //     if (response.layers.length > 1) {
+          //       console.log('Has sub layers...');
+          //     } else {
+          //       console.log('Has 1 layer. Adding...');
+          //       esriLayers.push(new FeatureLayer({ url: layer.layer_url }));
+          //     }
+          //     return esriLayers;
+          //   });
+          // }
 
-      // All layers are either of type Esri or GeoJSON, so we can check just the first layer
-      if (layers && layers[0]?.geojson?.features) {
-        return createEsriGeoJsonLayers(
-          mapConfig.data.attributes.layers,
-          localize
-        );
-      } else if (layers) {
-        return layers.map((layer) => {
-          return new FeatureLayer({ url: layer.layer_url });
-        });
+          return layers.map((layer) => {
+            return new FeatureLayer({ url: layer.layer_url });
+          });
+        }
       }
       return [];
     }, [mapConfig, localize]);
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
index 3aaa99af5ea4..0aebe58d31f0 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
@@ -2,6 +2,7 @@ import React, { memo } from 'react';
 
 // components
 import { Box, Button } from '@citizenlab/cl2-component-library';
+import Tippy from '@tippyjs/react';
 
 // intl
 import { useIntl } from 'utils/cl-intl';
@@ -9,37 +10,92 @@ import messages from './messages';
 
 // types
 import { ViewOptions } from '.';
+import { IMapConfig } from 'api/map_config/types';
+
+// hooks
+import useFeatureFlag from 'hooks/useFeatureFlag';
+
+// utils
+import { getLayerType } from './utils';
 
 interface Props {
   projectId: string;
-  mapConfigId: string;
   setView: (view: ViewOptions) => void;
+  mapConfig: IMapConfig;
 }
 
-const EsriImportOptions = memo<Props>(({ setView }) => {
+const EsriImportOptions = memo<Props>(({ setView, mapConfig }) => {
   const { formatMessage } = useIntl();
+  const isEsriIntegrationEnabled = useFeatureFlag({ name: 'esri_integration' });
+
+  const layerType = getLayerType(mapConfig);
+  const hasExistingWebMap = !!mapConfig?.data?.attributes?.esri_web_map_id;
+
+  const getWebMapDisabledMessage = () => {
+    if (!isEsriIntegrationEnabled) {
+      return formatMessage(messages.esriAddOnFeatureTooltip);
+    } else if (layerType === 'CustomMaps::GeojsonLayer') {
+      return formatMessage(messages.webMapRemoveGeojsonTooltip);
+    } else if (hasExistingWebMap) {
+      return formatMessage(messages.webMapAlreadyExists);
+    }
+    return;
+  };
 
   return (
     <Box mb="12px">
       <Box display="flex" gap="12px" flexWrap="wrap">
-        <Button
-          icon="location-simple"
-          buttonStyle="secondary"
-          onClick={() => {
-            setView('featureLayerUpload');
-          }}
+        <Tippy
+          maxWidth="250px"
+          placement="top"
+          content={
+            isEsriIntegrationEnabled
+              ? formatMessage(messages.featureLayerRemoveGeojsonTooltip)
+              : formatMessage(messages.esriAddOnFeatureTooltip)
+          }
+          hideOnClick={true}
+          disabled={layerType !== 'CustomMaps::GeojsonLayer'}
         >
-          {formatMessage(messages.importEsriFeatureLayer)}
-        </Button>
-        <Button
-          icon="map"
-          buttonStyle="secondary"
-          onClick={() => {
-            setView('webMapUpload');
-          }}
+          <div>
+            <Button
+              icon="location-simple"
+              buttonStyle="secondary"
+              onClick={() => {
+                setView('featureLayerUpload');
+              }}
+              disabled={
+                layerType === 'CustomMaps::GeojsonLayer' ||
+                !isEsriIntegrationEnabled
+              }
+            >
+              {formatMessage(messages.importEsriFeatureLayer)}
+            </Button>
+          </div>
+        </Tippy>
+        <Tippy
+          maxWidth="250px"
+          placement="top"
+          content={getWebMapDisabledMessage()}
+          hideOnClick={true}
+          disabled={layerType !== 'CustomMaps::GeojsonLayer'}
         >
-          {formatMessage(messages.importEsriWebMap)}
-        </Button>
+          <div>
+            <Button
+              icon="map"
+              buttonStyle="secondary"
+              onClick={() => {
+                setView('webMapUpload');
+              }}
+              disabled={
+                hasExistingWebMap ||
+                layerType === 'CustomMaps::GeojsonLayer' ||
+                !isEsriIntegrationEnabled
+              }
+            >
+              {formatMessage(messages.importEsriWebMap)}
+            </Button>
+          </div>
+        </Tippy>
       </Box>
     </Box>
   );
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
index c28eb9270fb7..6241f9a552dd 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
@@ -13,6 +13,7 @@ import {
   IconTooltip,
   Input,
   Button,
+  Success,
 } from '@citizenlab/cl2-component-library';
 
 // types
@@ -26,6 +27,7 @@ import { request, ErrorTypes, ApiKeyManager } from '@esri/arcgis-rest-request';
 import useAppConfigurationLocales from 'hooks/useAppConfigurationLocales';
 import useAddMapLayer from 'api/map_layers/useAddMapLayer';
 import useAppConfiguration from 'api/app_configuration/useAppConfiguration';
+import { getFeatureLayerInitialTitleMultiloc } from './utils';
 
 type Props = {
   projectId: string;
@@ -39,9 +41,11 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
 
   const [url, setUrl] = useState('');
   const [importError, setImportError] = useState(false);
+  const [success, setSuccess] = useState(false);
+  const [errorMessage, setErrorMessage] = useState('');
 
   const tenantLocales = useAppConfigurationLocales();
-  const { mutate: createProjectMapLayer } = useAddMapLayer();
+  const { mutate: createProjectMapLayer, isLoading } = useAddMapLayer();
 
   const addEsriFeatureLayer = () => {
     // First test if we have access to the Feature Layer URL
@@ -52,9 +56,11 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
     request(url, {
       authentication: esriAuthManager,
     })
-      .then(() => {
+      .then((response) => {
         setImportError(false);
 
+        const { serviceDescription } = response;
+
         // Add the new map layer
         if (mapConfigId && !isNilOrError(tenantLocales)) {
           createProjectMapLayer(
@@ -63,7 +69,10 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
               projectId,
               layer_url: url,
               id: mapConfigId,
-              title_multiloc: { en: 'Testing', 'nl-BE': 'Testing nl-BE' }, // TODO
+              title_multiloc: getFeatureLayerInitialTitleMultiloc(
+                serviceDescription,
+                tenantLocales
+              ),
               default_enabled: true,
             },
             {
@@ -71,6 +80,7 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
                 setImportError(true);
               },
               onSuccess: () => {
+                setSuccess(true);
                 setView('main');
               },
             }
@@ -82,27 +92,23 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
 
         switch (e.name) {
           case ErrorTypes.ArcGISRequestError:
-            console.log('A general error from the API');
+            // A general error from the API
+            setErrorMessage(formatMessage(messages.generalApiError));
             break;
 
           case ErrorTypes.ArcGISAuthError:
-            console.log('An authentication error');
-            break;
-
-          case ErrorTypes.ArcGISAccessDeniedError:
-            console.log(
-              'A user denying an authorization request in an oAuth workflow'
-            );
+            // An authentication error
+            setErrorMessage(formatMessage(messages.authenticationError));
             break;
 
           case ErrorTypes.ArcGISTokenRequestError:
-            console.log(
-              'An error response trying to generate a new access token'
-            );
+            // An error response trying to generate a new access token
+            setErrorMessage(formatMessage(messages.esriSideError));
             break;
 
           default:
-            console.log('Default error from Esri - usually a network error.');
+            // Default error from Esri - usually a network error
+            setErrorMessage(formatMessage(messages.defaultEsriError));
         }
       });
   };
@@ -115,7 +121,7 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
         </Title>
         <IconTooltip
           mb="4px"
-          content={<p>TODO: Tooltip w image & link to support article</p>}
+          content={formatMessage(messages.featureLayerTooltop)}
         />
       </Box>
       <Text my="8px" color={'grey800'}>
@@ -128,7 +134,7 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
           setUrl(value);
         }}
         placeholder={
-          'E.g. https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Congressional_Districts/FeatureServer/0'
+          'https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Congressional_Districts/FeatureServer/0'
         }
       />
 
@@ -141,17 +147,15 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
         >
           {formatMessage(messages.cancel2)}
         </Button>
-        <Button onClick={addEsriFeatureLayer}>
+        <Button onClick={addEsriFeatureLayer} processing={isLoading}>
           {formatMessage(messages.import2)}
         </Button>
       </Box>
-
+      {success && (
+        <Success text={formatMessage(messages.layerAdded)} showIcon={true} />
+      )}
       {importError && (
-        <Error
-          text={formatMessage(messages.importError)}
-          marginTop="10px"
-          showIcon={true}
-        />
+        <Error text={errorMessage} marginTop="10px" showIcon={true} />
       )}
     </>
   );
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
index 2d3564ebb230..9baeb0cb465a 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
@@ -15,13 +15,16 @@ import { getUnnamedLayerTitleMultiloc } from '../../../utils/mapUtils/map';
 
 // i18n
 import messages from './messages';
-import { FormattedMessage } from 'utils/cl-intl';
+import { FormattedMessage, useIntl } from 'utils/cl-intl';
 
 // styling
 import styled from 'styled-components';
 
 // components
 import Button from 'components/UI/Button';
+import { IMapConfig } from 'api/map_config/types';
+import { getLayerType } from './utils';
+import Tippy from '@tippyjs/react';
 
 const Container = styled.div``;
 
@@ -62,17 +65,21 @@ const fileAccept = [
 
 interface Props {
   projectId: string;
-  mapConfigId: string;
+  mapConfig: IMapConfig;
   className?: string;
 }
 
 const GeoJsonImportButton = memo<Props>(
-  ({ projectId, mapConfigId, className }) => {
+  ({ projectId, mapConfig, className }) => {
     const { mutate: createProjectMapLayer } = useAddMapLayer();
+    const { formatMessage } = useIntl();
     const tenantLocales = useAppConfigurationLocales();
 
     const [importError, setImportError] = useState(false);
 
+    const layerType = getLayerType(mapConfig);
+    const hasExistingWebMap = !!mapConfig?.data?.attributes?.esri_web_map_id;
+
     const handleGeoJsonImport = (event: any) => {
       const fileReader = new FileReader();
       fileReader.readAsText(event.target.files[0], 'UTF-8');
@@ -82,13 +89,13 @@ const GeoJsonImportButton = memo<Props>(
 
         setImportError(false);
 
-        if (mapConfigId && !isNilOrError(tenantLocales)) {
+        if (mapConfig.data.id && !isNilOrError(tenantLocales)) {
           createProjectMapLayer(
             {
               type: 'CustomMaps::GeojsonLayer',
               projectId,
               geojson,
-              id: mapConfigId,
+              id: mapConfig.data.id,
               title_multiloc: getUnnamedLayerTitleMultiloc(tenantLocales),
               default_enabled: true,
             },
@@ -113,10 +120,27 @@ const GeoJsonImportButton = memo<Props>(
         />
 
         <ButtonContainer>
-          <StyledButton icon="upload-file" buttonStyle="secondary">
-            <StyledLabel aria-hidden htmlFor="file-attachment-uploader" />
-            <FormattedMessage {...messages.import} />
-          </StyledButton>
+          <Tippy
+            maxWidth="250px"
+            placement="top"
+            content={formatMessage(messages.geojsonRemoveEsriTooltip)}
+            hideOnClick={true}
+            disabled={layerType === 'CustomMaps::GeojsonLayer'}
+          >
+            <div>
+              <StyledButton
+                icon="upload-file"
+                buttonStyle="secondary"
+                disabled={
+                  layerType === 'CustomMaps::EsriFeatureLayer' ||
+                  hasExistingWebMap
+                }
+              >
+                <StyledLabel aria-hidden htmlFor="file-attachment-uploader" />
+                <FormattedMessage {...messages.import} />
+              </StyledButton>
+            </div>
+          </Tippy>
         </ButtonContainer>
 
         {importError && (
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayerConfig.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayerConfig.tsx
index 1e29a355250d..1cfb9897f339 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayerConfig.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayerConfig.tsx
@@ -22,7 +22,7 @@ import { ColorPickerInput, Select } from '@citizenlab/cl2-component-library';
 // utils
 import {
   getLayerColor,
-  getLayerType,
+  getGeojsonLayerType,
   makiIconNames,
   getUnnamedLayerTitleMultiloc,
 } from '../../../utils/mapUtils/map';
@@ -42,6 +42,7 @@ import { IMapLayerAttributes } from 'api/map_layers/types';
 const Container = styled.div`
   display: flex;
   flex-direction: column;
+  margin-bottom: 60px;
 `;
 
 const StyledSection = styled(Section)`
@@ -119,7 +120,7 @@ const MapLayerConfig = memo<Props & WrappedComponentProps>(
       mapConfig?.data?.attributes?.layers?.find(
         (layer) => layer.id === mapLayerId
       ) || undefined;
-    const type = getLayerType(mapLayer);
+    const geojsonDataType = getGeojsonLayerType(mapLayer);
 
     const [touched, setTouched] = useState(false);
     const [processing, setProcessing] = useState(false);
@@ -280,7 +281,7 @@ const MapLayerConfig = memo<Props & WrappedComponentProps>(
             />
           </SectionField>
 
-          {type === 'Point' && (
+          {geojsonDataType === 'Point' && (
             <SectionField>
               <Select
                 onChange={handleMarkerSymbolOnChange}
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
index 7ef7f15fdd3b..2cbf1b833bcd 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
@@ -133,7 +133,6 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
     );
 
     const layers = mapConfig?.data.attributes?.layers;
-
     const layersWithOrdering =
       layers && layers.length > 0 ? addOrderingToLayers(layers) : null;
 
@@ -178,25 +177,40 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
                         dropRow={handleDropRow}
                       >
                         <ListItem>
-                          <LayerIcon name={layerIconName} color={layerColor} />
+                          <LayerIcon
+                            name={
+                              mapLayer.type === 'CustomMaps::EsriFeatureLayer'
+                                ? 'map'
+                                : layerIconName
+                            }
+                            color={
+                              mapLayer.type === 'CustomMaps::EsriFeatureLayer'
+                                ? colors.coolGrey600
+                                : layerColor
+                            }
+                          />
                           <LayerName>{layerTitle}</LayerName>
                           <Buttons>
-                            <Tippy
-                              placement="bottom"
-                              content={<FormattedMessage {...messages.edit} />}
-                              hideOnClick={false}
-                              arrow={false}
-                            >
-                              <div>
-                                <EditButton
-                                  icon="edit"
-                                  iconSize="16px"
-                                  buttonStyle="text"
-                                  padding="0px"
-                                  onClick={toggleLayerConfig(mapLayer.id)}
-                                />
-                              </div>
-                            </Tippy>
+                            {mapLayer.type === 'CustomMaps::GeojsonLayer' && (
+                              <Tippy
+                                placement="bottom"
+                                content={
+                                  <FormattedMessage {...messages.edit} />
+                                }
+                                hideOnClick={false}
+                                arrow={false}
+                              >
+                                <div>
+                                  <EditButton
+                                    icon="edit"
+                                    iconSize="16px"
+                                    buttonStyle="text"
+                                    padding="0px"
+                                    onClick={toggleLayerConfig(mapLayer.id)}
+                                  />
+                                </div>
+                              </Tippy>
+                            )}
 
                             <Spacer />
 
@@ -234,14 +248,11 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
             {isEsriIntegrationEnabled && (
               <EsriImportOptions
                 projectId={projectId}
-                mapConfigId={mapConfig.data.id}
                 setView={setView}
+                mapConfig={mapConfig}
               />
             )}
-            <GeoJsonImportButton
-              projectId={projectId}
-              mapConfigId={mapConfig.data.id}
-            />
+            <GeoJsonImportButton projectId={projectId} mapConfig={mapConfig} />
           </>
         )}
       </Container>
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/addOrderingToLayers.ts b/front/app/containers/Admin/ProjectCustomMapConfigPage/addOrderingToLayers.ts
index 7e9bfac0dd02..3df846b39b82 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/addOrderingToLayers.ts
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/addOrderingToLayers.ts
@@ -17,16 +17,17 @@ export default (mapLayers: IMapLayerAttributes[]) => {
       default_enabled,
       geojson_file,
       marker_svg_url,
+      type,
     } = mapLayers[i];
 
     mapLayersWithOrdering.push({
-      type: 'CustomMaps::GeojsonLayer',
       id,
       title_multiloc,
       geojson,
       default_enabled,
       geojson_file,
       marker_svg_url,
+      type,
       attributes: {
         ordering: i,
       },
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
index 3b3d7084fba8..99ab1882d3b0 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
@@ -57,14 +57,14 @@ export default defineMessages({
     defaultMessage: 'support article',
   },
   supportArticleUrl: {
-    id: 'app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl',
+    id: 'app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2',
     defaultMessage:
-      'https://support.citizenlab.co/en/articles/4910983-customize-your-project-map',
+      'https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view',
   },
   layersTooltip: {
-    id: 'app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip',
+    id: 'app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip2',
     defaultMessage:
-      'We currently support GeoJSON files. Read the {supportArticle} for tips on how to convert and style map layers.',
+      'We currently support GeoJSON files and importing Feature Layers and Web Maps from ArcGIS Online. Read the {supportArticle} for tips on how to add, convert and style map layers.',
   },
   edit: {
     id: 'app.containers.AdminPage.ProjectEdit.MapTab.edit',
@@ -201,4 +201,58 @@ export default defineMessages({
     id: 'app.components.admin.PostManager.import2',
     defaultMessage: 'Import',
   },
+  authenticationError: {
+    id: 'app.components.admin.PostManager.authenticationError',
+    defaultMessage:
+      'An authentication error occured while trying to fetch this layer. Please check the URL and that your Esri API key has access to this layer.',
+  },
+  generalApiError: {
+    id: 'app.components.admin.PostManager.generalApiError',
+    defaultMessage:
+      'An error occured while trying to fetch this layer. Please check that the URL is correct.',
+  },
+  defaultEsriError: {
+    id: 'app.components.admin.PostManager.defaultEsriError',
+    defaultMessage:
+      'An error occured while trying to fetch this layer. Please check your network connect and that the URL is correct.',
+  },
+  esriSideError: {
+    id: 'app.components.admin.PostManager.esriSideError',
+    defaultMessage:
+      'An error occured on the ArcGIS application. Please wait a few minutes and try again later.',
+  },
+  layerAdded: {
+    id: 'app.components.admin.PostManager.layerAdded',
+    defaultMessage: 'Layer added successfully',
+  },
+  featureLayerTooltop: {
+    id: 'app.components.admin.PostManager.featureLayerTooltop',
+    defaultMessage:
+      'You can find the Feature Layer URL on the right hand side of the item page on ArcGIS Online.',
+  },
+  webMapRemoveGeojsonTooltip: {
+    id: 'app.components.admin.PostManager.webMapRemoveGeojsonTooltip',
+    defaultMessage:
+      'You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to connect a Web Map.',
+  },
+  featureLayerRemoveGeojsonTooltip: {
+    id: 'app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip',
+    defaultMessage:
+      'You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to add a Feature Layer.',
+  },
+  esriAddOnFeatureTooltip: {
+    id: 'app.components.admin.PostManager.esriAddOnFeatureTooltip',
+    defaultMessage:
+      'Importing data from Esri ArcGIS Online is an add-on feature. Talk to your GS manager to unlock it.',
+  },
+  webMapAlreadyExists: {
+    id: 'app.components.admin.PostManager.webMapAlreadyExists',
+    defaultMessage:
+      'You can only add one Web Map at a time. Remove the current one to import a different one.',
+  },
+  geojsonRemoveEsriTooltip: {
+    id: 'app.components.admin.PostManager.geojsonRemoveEsriTooltip',
+    defaultMessage:
+      'You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current ArcGIS layers if you wish to upload a GeoJSON layer.',
+  },
 });
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/utils.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/utils.tsx
new file mode 100644
index 000000000000..ad7a633f39f3
--- /dev/null
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/utils.tsx
@@ -0,0 +1,22 @@
+// getFeatureLayerInitialTitleMultiloc
+
+import { IMapConfig } from 'api/map_config/types';
+
+// Description: This function is used to generate the initial title multiloc for an Esri feature layer.
+export const getFeatureLayerInitialTitleMultiloc = (
+  layerTitle: string,
+  tenantLocales: string[]
+) => {
+  const title_multiloc = {};
+  tenantLocales.forEach(
+    (tenantLocale) => (title_multiloc[`${tenantLocale}`] = layerTitle)
+  );
+  return title_multiloc;
+};
+
+// getLayerType
+// Description: Returns the layer type of a MapConfig. All layers in a Map Config will have the same type.
+export const getLayerType = (mapConfig: IMapConfig) => {
+  const layers = mapConfig?.data?.attributes?.layers;
+  return layers?.[0]?.type;
+};
diff --git a/front/app/containers/App/index.tsx b/front/app/containers/App/index.tsx
index b50c86222cc5..b6a4262d8226 100644
--- a/front/app/containers/App/index.tsx
+++ b/front/app/containers/App/index.tsx
@@ -38,6 +38,7 @@ import MainHeader from 'containers/MainHeader';
 import Meta from './Meta';
 const UserDeletedModal = lazy(() => import('./UserDeletedModal'));
 const PlatformFooter = lazy(() => import('containers/PlatformFooter'));
+import esriConfig from '@arcgis/core/config';
 
 // auth
 import HasPermission from 'components/HasPermission';
@@ -124,6 +125,13 @@ const App = ({ children }: Props) => {
         script.src = 'https://cdn.weglot.com/weglot.min.js';
       }
 
+      // Set Esri API key
+      const esriApiKey =
+        appConfiguration.data.attributes.settings.esri_integration?.api_key;
+      if (esriApiKey) {
+        esriConfig.apiKey = esriApiKey;
+      }
+
       if (
         appConfiguration.data.attributes.style &&
         appConfiguration.data.attributes.style.customFontAdobeId
diff --git a/front/app/utils/mapUtils/map.ts b/front/app/utils/mapUtils/map.ts
index 4e15374fcc7e..a18c02d4c687 100644
--- a/front/app/utils/mapUtils/map.ts
+++ b/front/app/utils/mapUtils/map.ts
@@ -66,12 +66,14 @@ export const getTileProvider = (
   return baseGetTileProvider(appConfig);
 };
 
-export const getLayerType = (mapLayer: IMapLayerAttributes | undefined) => {
+export const getGeojsonLayerType = (
+  mapLayer: IMapLayerAttributes | undefined
+) => {
   return mapLayer?.geojson?.features?.[0]?.geometry?.type || 'Point';
 };
 
 export const getLayerColor = (mapLayer: IMapLayerAttributes | undefined) => {
-  const type = getLayerType(mapLayer);
+  const type = getGeojsonLayerType(mapLayer);
   const fillColor: string | undefined =
     mapLayer?.geojson?.features?.[0]?.properties?.fill;
   const markerColor: string | undefined =
@@ -86,7 +88,7 @@ export const getLayerColor = (mapLayer: IMapLayerAttributes | undefined) => {
 };
 
 export const getLayerIcon = (mapLayer: IMapLayerAttributes | undefined) => {
-  const layerType = getLayerType(mapLayer);
+  const layerType = getGeojsonLayerType(mapLayer);
   let iconName: 'location-simple' | 'line' | 'rectangle' = 'rectangle';
 
   if (layerType === 'Point') {

From 6b360454543f4cce7728ab38efb54d68c0a58f6c Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Fri, 23 Feb 2024 11:57:13 +0000
Subject: [PATCH 043/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/ar-MA.json   |  2 --
 front/app/translations/admin/ar-SA.json   |  2 --
 front/app/translations/admin/ca-ES.json   |  2 --
 front/app/translations/admin/da-DK.json   |  2 --
 front/app/translations/admin/de-DE.json   |  2 --
 front/app/translations/admin/el-GR.json   |  2 --
 front/app/translations/admin/en-CA.json   |  2 --
 front/app/translations/admin/en-GB.json   |  2 --
 front/app/translations/admin/en.json      | 15 +++++++++++++--
 front/app/translations/admin/es-CL.json   |  2 --
 front/app/translations/admin/es-ES.json   |  2 --
 front/app/translations/admin/fi-FI.json   |  2 --
 front/app/translations/admin/fr-BE.json   |  2 --
 front/app/translations/admin/fr-FR.json   |  2 --
 front/app/translations/admin/hr-HR.json   |  2 --
 front/app/translations/admin/hu-HU.json   |  2 --
 front/app/translations/admin/it-IT.json   |  2 --
 front/app/translations/admin/kl-GL.json   |  2 --
 front/app/translations/admin/lb-LU.json   |  2 --
 front/app/translations/admin/lv-LV.json   |  2 --
 front/app/translations/admin/mi.json      |  2 --
 front/app/translations/admin/nb-NO.json   |  2 --
 front/app/translations/admin/nl-BE.json   |  2 --
 front/app/translations/admin/nl-NL.json   |  2 --
 front/app/translations/admin/pl-PL.json   |  2 --
 front/app/translations/admin/pt-BR.json   |  2 --
 front/app/translations/admin/ro-RO.json   |  2 --
 front/app/translations/admin/sr-Latn.json |  2 --
 front/app/translations/admin/sr-SP.json   |  2 --
 front/app/translations/admin/sv-SE.json   |  2 --
 front/app/translations/admin/tr-TR.json   |  2 --
 front/app/translations/en.json            |  1 -
 32 files changed, 13 insertions(+), 63 deletions(-)

diff --git a/front/app/translations/admin/ar-MA.json b/front/app/translations/admin/ar-MA.json
index 5d06fc368990..2949b1060cd6 100644
--- a/front/app/translations/admin/ar-MA.json
+++ b/front/app/translations/admin/ar-MA.json
@@ -759,7 +759,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "تلميح أداة الطبقة",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "يظهر هذا النص على هيئة تلميح أداة عند تمرير مؤشر الماوس فوق ميزات الطبقة على الخريطة",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "طبقات الخريطة",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "ندعم ملفات GeoJSON في الوقت الحالي. اقرأ {supportArticle} للاطلاع على تلميحات بشأن كيفية تحويل طبقات خريطة وتصميمها.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "خط الطول الافتراضي",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "المركز ومستوى التكبير/التصغير الافتراضيان للخريطة",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "المركز ومستوى التكبير/التصغير الافتراضيان للخريطة. اضبط القيم أدناه يدويًا أو انقر على الزر {button} في الركن العلوي الأيمن من الخريطة لحفظ نقطة المركز ومستوى التكبير/التصغير الحاليين للخريطة باعتبارهما قيمتين افتراضيتين.",
@@ -768,7 +767,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "إزالة طبقة",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "حفظ",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "مقالة دعم",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "مستوى تكبير/تصغير الخريطة",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "مستوى التكبير/التصغير الافتراضي للخريطة. يمكن قبول قيمة بين 1 و17، حيث تشير 1 إلى التصغير الكامل (إمكانية رؤية العالم بكامله) و17 إلى التكبير الكامل (إمكانية رؤية المربعات السكنية والمباني)",
   "app.containers.AdminPage.ProjectEdit.PollTab.addPollQuestion": "إضافة سؤال استطلاع",
diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index a9b655052821..1f394db820d4 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "تلميح أداة الطبقة",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "يظهر هذا النص على هيئة تلميح أداة عند تمرير مؤشر الماوس فوق ميزات الطبقة على الخريطة",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "طبقات الخريطة",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "ندعم ملفات GeoJSON في الوقت الحالي. اقرأ {supportArticle} للاطلاع على تلميحات بشأن كيفية تحويل طبقات خريطة وتصميمها.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "خط الطول الافتراضي",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "المركز ومستوى التكبير/التصغير الافتراضيان للخريطة",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "المركز ومستوى التكبير/التصغير الافتراضيان للخريطة. اضبط القيم أدناه يدويًا أو انقر على الزر {button} في الركن العلوي الأيمن من الخريطة لحفظ نقطة المركز ومستوى التكبير/التصغير الحاليين للخريطة باعتبارهما قيمتين افتراضيتين.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "إزالة طبقة",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "حفظ",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "مقالة دعم",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "مستوى تكبير/تصغير الخريطة",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "مستوى التكبير/التصغير الافتراضي للخريطة. يمكن قبول قيمة بين 1 و17، حيث تشير 1 إلى التصغير الكامل (إمكانية رؤية العالم بكامله) و17 إلى التكبير الكامل (إمكانية رؤية المربعات السكنية والمباني)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "إخفاء هوية جميع بيانات المستخدم",
diff --git a/front/app/translations/admin/ca-ES.json b/front/app/translations/admin/ca-ES.json
index 4668eb0fba07..b3c7bc65fae1 100644
--- a/front/app/translations/admin/ca-ES.json
+++ b/front/app/translations/admin/ca-ES.json
@@ -1006,7 +1006,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Informació sobre capes",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Aquest text es mostra com a informació sobre eines quan passeu el cursor per sobre de les característiques de la capa del mapa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Capes del mapa",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Actualment admetem fitxers GeoJSON. Llegiu el {supportArticle} per obtenir consells sobre com convertir i estilitzar les capes del mapa.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Longitud per defecte",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centre i zoom per defecte del mapa",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "El punt central i el nivell de zoom predeterminats del mapa. Ajusteu manualment els valors següents o feu clic al botó {button} de l'extrem superior dret del mapa per desar el punt central actual i el nivell de zoom del mapa com a valors predeterminats.",
@@ -1015,7 +1014,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Eliminar la capa",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "article de suport",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nivell de zoom del mapa",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "El nivell de zoom predeterminat del mapa. Accepta un valor entre 1 i 17, on 1 s'allunya completament (tot el món és visible) i 17 s'apropa completament (els blocs i els edificis són visibles)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anònim totes les dades dels usuaris",
diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index b174891f1608..ec90c7861a65 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Lag tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Denne tekst vises som et værktøjstip, når du holder musen over lagfunktionerne på kortet",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Kortlag",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Vi understøtter i øjeblikket GeoJSON-filer. Læs {supportArticle} for at få tips om, hvordan du konverterer og stiliserer kortlag.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standardlængde",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Kortets standardcenter og -zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Kortets standardcenterpunkt og zoomniveau. Juster værdierne nedenfor manuelt, eller klik på knappen {button} toppen til højre på kortet for at gemme kortets aktuelle centerpunkt og zoomniveau som standardværdier.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Fjern lag",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Gem",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "støtteartikel",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Kortets zoomniveau",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Standardzoomniveauet for kortet. Accepterer en værdi mellem 1 og 17, hvor 1 er fuldt udzoomet (hele verden er synlig) og 17 er fuldt indzoomet (blokke og bygninger er synlige)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymisering af alle brugerdata",
diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index 953b870949b4..9596eaa0a0e1 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer-Tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Dieser Text wird als QuickInfo angezeigt, wenn Sie den Mauszeiger über die Ebenenmerkmale in der Karte bewegen",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Kartenebenen",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Wir unterstützen derzeit GeoJSON-Dateien. Lesen Sie den {supportArticle} für Tipps zum Konvertieren und Gestalten von Kartenebenen.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standard-Längengrad",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Standard-Kartenmittelpunkt und -Zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Der Standard-Mittelpunkt und die Standard-Zoomstufe der Karte. Passen Sie die Werte unten manuell an, oder klicken Sie auf den Button {button} in der oberen rechten Ecke der Karte, um den aktuellen Mittelpunkt und die Zoomstufe der Karte als Standardwerte zu speichern.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Ebene entfernen",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Speichern",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "Support-Artikel",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/de/articles/7022129-sammeln-von-input-und-feedback-listen-und-kartenansicht#h_11d4b49818",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Zoomstufe der Karte",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Die Standard-Zoomstufe der Karte. Akzeptiert einen Wert zwischen 1 und 17, wobei 1 vollständig herausgezoomt ist (die gesamte Welt ist sichtbar) und 17 vollständig hineingezoomt ist (Häuserblöcke und Gebäude sind sichtbar)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymisierung aller Nutzer*innendaten",
diff --git a/front/app/translations/admin/el-GR.json b/front/app/translations/admin/el-GR.json
index c058b6720da8..77aad028954b 100644
--- a/front/app/translations/admin/el-GR.json
+++ b/front/app/translations/admin/el-GR.json
@@ -1006,7 +1006,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Συμβουλή εργαλείου επιπέδου",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Αυτό το κείμενο εμφανίζεται ως συμβουλή εργαλείου όταν περνάτε με το ποντίκι πάνω από τα χαρακτηριστικά του επιπέδου στο χάρτη",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Επίπεδα χάρτη",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Προς το παρόν υποστηρίζουμε αρχεία GeoJSON. Διαβάστε το {supportArticle} για συμβουλές σχετικά με τον τρόπο μετατροπής και μορφοποίησης των επιπέδων χάρτη.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Προεπιλεγμένο γεωγραφικό μήκος",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Προεπιλεγμένο κέντρο και ζουμ χάρτη",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Το προεπιλεγμένο κεντρικό σημείο και το επίπεδο ζουμ του χάρτη. Προσαρμόστε χειροκίνητα τις παρακάτω τιμές ή κάντε κλικ στο κουμπί {button} στην επάνω δεξιά γωνία του χάρτη για να αποθηκεύσετε το τρέχον κεντρικό σημείο και το επίπεδο ζουμ του χάρτη ως προεπιλεγμένες τιμές.",
@@ -1015,7 +1014,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Κατάργηση επιπέδου",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "άρθρο υποστήριξης",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Επίπεδο ζουμ χάρτη",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Το προεπιλεγμένο επίπεδο ζουμ του χάρτη. Δέχεται μια τιμή μεταξύ 1 και 17, όπου το 1 είναι πλήρως ζουμαρισμένο (όλος ο κόσμος είναι ορατός) και το 17 είναι πλήρως ζουμαρισμένο (τα τετράγωνα και τα κτίρια είναι ορατά)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Ανωνυμοποίηση όλων των δεδομένων χρήστη",
diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index 5acef1f7dfc9..9959279d88b5 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "This text is displayed as a tooltip when hovering over the layer features on the map",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Map layers",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We currently support GeoJSON files. Read the {supportArticle} for tips on how to convert and style map layers.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Map default center and zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "The default center point and zoom level of the map. Manually adjust the values below, or click on the {button} button in the top right corner of the map to save the current center point and zoom level of the map as the default values.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remove layer",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support article",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Map zoom level",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "The default zoom level of the map. Accepts a value between 1 and 17, where 1 is fully zoomed out (the entire world is visible) and 17 is fully zoomed in (blocks and buildings are visible)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymize all user data",
diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index 97f068c98d5d..cf77ed769e27 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "This text is displayed as a tooltip when hovering over the layer features on the map",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Map layers",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We currently support GeoJSON files. Read the {supportArticle} for tips on how to convert and style map layers.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Map default center and zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "The default center point and zoom level of the map. Manually adjust the values below, or click on the {button} button in the top right corner of the map to save the current center point and zoom level of the map as the default values.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remove layer",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support article",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Map zoom level",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "The default zoom level of the map. Accepts a value between 1 and 17, where 1 is fully zoomed out (the entire world is visible) and 17 is fully zoomed in (blocks and buildings are visible)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymize all user data",
diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index f8124ca55c6e..74e3b5462664 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -108,6 +108,7 @@
   "app.components.admin.PostManager.assignedTo": "Assigned to {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Assigned to me",
   "app.components.admin.PostManager.assignee": "Assignee",
+  "app.components.admin.PostManager.authenticationError": "An authentication error occured while trying to fetch this layer. Please check the URL and that your Esri API key has access to this layer.",
   "app.components.admin.PostManager.automatic": "(automatic)",
   "app.components.admin.PostManager.bodyTitle": "Description",
   "app.components.admin.PostManager.cancel2": "Cancel",
@@ -127,6 +128,7 @@
   "app.components.admin.PostManager.currentLat": "Center latitude",
   "app.components.admin.PostManager.currentLng": "Center longitude",
   "app.components.admin.PostManager.currentZoomLevel": "Zoom level",
+  "app.components.admin.PostManager.defaultEsriError": "An error occured while trying to fetch this layer. Please check your network connect and that the URL is correct.",
   "app.components.admin.PostManager.delete": "Delete",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Delete {count} selected proposals",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Delete {count} posts",
@@ -137,6 +139,8 @@
   "app.components.admin.PostManager.editStatuses": "Edit statuses",
   "app.components.admin.PostManager.editTags": "Edit tags",
   "app.components.admin.PostManager.editedPostSave": "Save",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Importing data from Esri ArcGIS Online is an add-on feature. Talk to your GS manager to unlock it.",
+  "app.components.admin.PostManager.esriSideError": "An error occured on the ArcGIS application. Please wait a few minutes and try again later.",
   "app.components.admin.PostManager.exportAllInputs": "Export all posts (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Export all comments (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Export comments for this project (.xslx)",
@@ -149,10 +153,14 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Export selected posts (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Export comments for selected posts (.xslx)",
   "app.components.admin.PostManager.exports": "Exports",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to add a Feature Layer.",
+  "app.components.admin.PostManager.featureLayerTooltop": "You can find the Feature Layer URL on the right hand side of the item page on ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Choose how people will see your name",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Explain this status change",
   "app.components.admin.PostManager.fileUploadError": "One or more files failed to upload. Please check the file size and format and try again.",
   "app.components.admin.PostManager.formTitle": "Edit idea",
+  "app.components.admin.PostManager.generalApiError": "An error occured while trying to fetch this layer. Please check that the URL is correct.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current ArcGIS layers if you wish to upload a GeoJSON layer.",
   "app.components.admin.PostManager.goToDefaultMapView": "Go to default map center",
   "app.components.admin.PostManager.hiddenFieldsLink": "hidden fields",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
@@ -172,6 +180,7 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Only show posts that need feedback",
   "app.components.admin.PostManager.issueFormTitle": "Edit issue",
   "app.components.admin.PostManager.latestFeedbackMode": "Use the latest existing official update as an explanation",
+  "app.components.admin.PostManager.layerAdded": "Layer added successfully",
   "app.components.admin.PostManager.likes": "Likes",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Moving this input away from its current project will lose the information about its assigned phases. Do you want to proceed?",
   "app.components.admin.PostManager.mapData": "Map data",
@@ -212,6 +221,8 @@
   "app.components.admin.PostManager.topicsTab": "Tags",
   "app.components.admin.PostManager.topicsTabTooltipText": "Add tags to an input using drag and drop.",
   "app.components.admin.PostManager.votes": "Votes",
+  "app.components.admin.PostManager.webMapAlreadyExists": "You can only add one Web Map at a time. Remove the current one to import a different one.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to connect a Web Map.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Less than a day} one {One day} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "from",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "group",
@@ -1215,7 +1226,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "This text is displayed as a tooltip when hovering over the layer features on the map",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Map layers",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We currently support GeoJSON files. Read the {supportArticle} for tips on how to convert and style map layers.",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip2": "We currently support GeoJSON files and importing Feature Layers and Web Maps from ArcGIS Online. Read the {supportArticle} for tips on how to add, convert and style map layers.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Map default center and zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "The default center point and zoom level of the map. Manually adjust the values below, or click on the {button} button in the top right corner of the map to save the current center point and zoom level of the map as the default values.",
@@ -1225,7 +1236,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remove layer",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support article",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Map zoom level",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "The default zoom level of the map. Accepts a value between 1 and 17, where 1 is fully zoomed out (the entire world is visible) and 17 is fully zoomed in (blocks and buildings are visible)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymize all user data",
diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index e34392ce6b1e..af819ee9dc54 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Información sobre la capa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Este texto se muestra como información sobre la herramienta cuando se desliza sobre las características de la capa en el mapa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Capas",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Actualmente soportamos archivos GeoJSON. Lea el {supportArticle} para obtener consejos sobre cómo convertir y ajustar el estilo de las capas del mapa.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Longitud por defecto",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centro del mapa y zoom por defecto",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "El punto central y el nivel de zoom por defecto del mapa. Ajuste manualmente los valores que aparecen a continuación, o haga clic en el botón {button} de la esquina superior derecha del mapa para guardar el punto central y el nivel de zoom actuales del mapa como valores predeterminados.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Eliminar la capa",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Guardar",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "artículo de soporte",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nivel de zoom por defecto",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Establece el grado de ampliación del mapa por defecto. Elige un valor entre 0 y 20, donde 0 es un alejamiento total (todo el mundo es visible) y 20 es un acercamiento total (los bloques y edificios son visibles)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizar todos los datos del usuario",
diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index 48f394521da2..292990e04e6f 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Información sobre la capa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Este texto se muestra como información de la herramienta al pasar por encima de las características de la capa en el mapa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Capas",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Actualmente soportamos archivos GeoJSON. Lea el {supportArticle} para obtener consejos sobre cómo convertir y ajustar el estilo de capas de los mapas.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centro y zoom del mapa por defecto",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Punto central y nivel de zoom por defecto del mapa. Ajuste manualmente los valores que aparecen a continuación, o haga clic en el botón {button} de la esquina superior derecha del mapa para guardar el punto central y el nivel de zoom actuales como valores predeterminados.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Eliminar la capa",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Guardar",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "artículo de apoyo",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nivel de zoom por defecto",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Establece el grado de ampliación del mapa por defecto. Elige un valor entre 0 y 20, donde 0 es un alejamiento total (todo el mundo es visible) y 20 es un acercamiento total (los bloques y edificios son visibles)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizar todos los datos de los usuarios",
diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index cc947aa4d197..481a46bdd6be 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Tason työkaluvinkki",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Tämä teksti näytetään työkaluvihjeenä, kun hiiren osoitin viedään kartan tasoominaisuuksien päälle",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Karttatasot",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Tuemme tällä hetkellä GeoJSON-tiedostoja. Lue {supportArticle} saadaksesi vinkkejä karttatasojen muuntamiseen ja tyyliin.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Oletuspituusaste",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Kartan oletuskeskus ja zoomaus",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Kartan oletuskeskipiste ja zoomaustaso. Säädä alla olevia arvoja manuaalisesti tai napsauta kartan oikeassa yläkulmassa olevaa {button} -painiketta tallentaaksesi kartan nykyisen keskipisteen ja zoomaustason oletusarvoiksi.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Poista kerros",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Tallentaa",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "tukiartikkeli",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Kartan zoomaustaso",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Kartan oletuszoomaustaso. Hyväksyy arvon väliltä 1–17, jossa 1 on täysin loitonnettu (koko maailma on näkyvissä) ja 17 on täysin zoomattu (korttelin ja rakennukset näkyvät)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymisoi kaikki käyttäjätiedot",
diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index 186d494661a7..b5016dc9d7d7 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Information de la couche",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Ce texte s'affiche comme bulle d'information lors du survol des éléments de la couche sur la carte",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Couches",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Nous supportons actuellement les fichiers GeoJSON. Lisez cet {supportArticle} pour obtenir des conseils sur la manière de convertir et de paramétrer des couches cartographiques.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Longitude par défaut",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centralisation et niveau de zoom par défaut de la carte",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "La centralisation et le niveau de zoom par défaut de la carte. Ajustez manuellement les valeurs ci-dessous, ou cliquez sur le bouton {button} dans le coin supérieur gauche de la carte pour enregistrer la centralisation et le niveau de zoom actuels de la carte comme valeurs par défaut.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Supprimer la couche",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Enregistrer",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "article de support",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Niveau de zoom par défaut",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Définissez le niveau de zoom de la carte par défaut. Choisissez une valeur entre 0 et 20, où 0 est entièrement dézoomé (le monde entier est visible) et 20 est entièrement zoomé (les blocs d'habitations et les bâtiments sont visibles)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymiser toutes les données des utilisateurs",
diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index 71555f6a916b..c0ae8dacfeca 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Information de la couche",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Ce texte s'affiche comme bulle d'information lors du survol des éléments de la couche sur la carte",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Couches",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Nous supportons actuellement les fichiers GeoJSON. Lisez cet {supportArticle} pour obtenir des conseils sur la manière de convertir et de paramétrer des couches cartographiques.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Longitude par défaut",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centralisation et niveau de zoom par défaut de la carte",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "La centralisation et le niveau de zoom par défaut de la carte. Ajustez manuellement les valeurs ci-dessous, ou cliquez sur le bouton {button} dans le coin supérieur gauche de la carte pour enregistrer la centralisation et le niveau de zoom actuels de la carte comme valeurs par défaut.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Supprimer la couche",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Enregistrer",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "article de support",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Niveau de zoom par défaut",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Définissez le niveau de zoom de la carte par défaut. Choisissez une valeur entre 0 et 20, où 0 est entièrement dézoomé (le monde entier est visible) et 20 est entièrement zoomé (les blocs d'habitations et les bâtiments sont visibles)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymiser toutes les données des utilisateurs",
diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index f53821182488..3b591f50fa7e 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Opis sloja",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Ovaj tekst prikazuje se kao savjet pri prelasku kursorom preko značajke sloja na mapi",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Slojevi mape",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Trenutno podržavamo GeoJSON datoteke. Pročitajte {supportArticle} za savjete o tome kako da konvertirate i stilizirate slojeve mape.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Zadana geografska dužina",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Zadano središte mape i uvećanje",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Zadana središnja točka i razina zumiranja mape. Podesite donje vrijednosti ili kliknite na gumb {button} u gornjem desnom kutu mape kako biste sačuvali trenutnu središnju točku i razinu zumiranja mape kao zadane vrijednosti.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Ukloni sloj",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Spremi",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "članak podrške",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Razina uvećanja mape",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Zadana razina uvećanja karte. Prihvaća vrijednost između 1 i 17, pri čemu je 1 potpuno umanjena (vidljiv je cijeli svijet), a 17 je potpuno uvećana (vidljivi su blokovi i zgrade)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizirajte sve korisničke podatke",
diff --git a/front/app/translations/admin/hu-HU.json b/front/app/translations/admin/hu-HU.json
index c2dd577b5e2c..9d77cd49a6b7 100644
--- a/front/app/translations/admin/hu-HU.json
+++ b/front/app/translations/admin/hu-HU.json
@@ -483,7 +483,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "This text is displayed as a tooltip when hovering over the layer features on the map",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Map layers",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We currently support GeoJSON files. Read the {supportArticle} for tips on how to convert and style map layers.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Map default center and zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "The default center point and zoom level of the map. Manually adjust the values below, or click on the {button} button in the top right corner of the map to save the current center point and zoom level of the map as the default values.",
@@ -492,7 +491,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remove layer",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support article",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/en/articles/4910983-customize-your-project-map",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Map zoom level",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "The default zoom level of the map. Accepts a value between 1 and 17, where 1 is fully zoomed out (the entire world is visible) and 17 is fully zoomed in (blocks and buildings are visible)",
   "app.containers.AdminPage.ProjectEdit.PollTab.addPollQuestion": "Add a poll question",
diff --git a/front/app/translations/admin/it-IT.json b/front/app/translations/admin/it-IT.json
index 4bf26f177c60..4c0248e2e4b9 100644
--- a/front/app/translations/admin/it-IT.json
+++ b/front/app/translations/admin/it-IT.json
@@ -1006,7 +1006,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "This text is displayed as a tooltip when hovering over the layer features on the map",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Map layers",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We currently support GeoJSON files. Read the {supportArticle} for tips on how to convert and style map layers.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Map default center and zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "The default center point and zoom level of the map. Manually adjust the values below, or click on the {button} button in the top right corner of the map to save the current center point and zoom level of the map as the default values.",
@@ -1015,7 +1014,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remove layer",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support article",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Map zoom level",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "The default zoom level of the map. Accepts a value between 1 and 17, where 1 is fully zoomed out (the entire world is visible) and 17 is fully zoomed in (blocks and buildings are visible)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizzare tutti i dati degli utenti",
diff --git a/front/app/translations/admin/kl-GL.json b/front/app/translations/admin/kl-GL.json
index 8a7a88fcb69b..fc92a6f900cd 100644
--- a/front/app/translations/admin/kl-GL.json
+++ b/front/app/translations/admin/kl-GL.json
@@ -801,7 +801,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Quleriaami nassuiaat",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Una allataq, nunap assingani quleriaat atuuffiisa qulaanni tikkuut inissikkaangakku nassuiaatitut nuisassaaq",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Nunap assingani quleriiaat",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Massakkut GeoJSON-fiilit atorneqarsinnaapput. Nunap assingi qanoq konverteerissanerlugit ilusilersussanerlugillu ilitsersortikkusukkuit {supportArticle} atuaruk.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Allorniusaq tukimukartoq nalinginnaasoq",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Nunap assingata qeqqa qanillisaallu (zoom)",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Nunap assingata qeqqata inissisimaffia qanillisaatillu qanissusaa. Ataani kisitsisit nammineq aaqqissukkit imaluunniit nunap assingata qeqqa qanillisaatillu qanissusaa nalinginnaasumik atuuttussatut toqqorniarukkit toortaat {button} nunap assingata qulaani teqeqqumi talerperlermiittoq tooruk.",
@@ -810,7 +809,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Quleriiaaq peeruk",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support artikeli",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nunap assingani qanillisaatip qanissusaa",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Nunap assingani qanillisaatip qanissusaa nalinginnaasumik atuuttoq. Kisitsisit 1-ip 17-illu akornanniissaaq, 1-imi ungasilleqqissaaqqassaaq (nunarsuaq tamarmi nuisalluni) 17-imilu qanilleqqissaaqqalluni (blokkit illullu nuisallutik)",
   "app.containers.AdminPage.ProjectEdit.PollTab.addPollQuestion": "Isumasiuinermut apeqqummik ilanngussigit",
diff --git a/front/app/translations/admin/lb-LU.json b/front/app/translations/admin/lb-LU.json
index c706b1401bb7..6a7f299adf86 100644
--- a/front/app/translations/admin/lb-LU.json
+++ b/front/app/translations/admin/lb-LU.json
@@ -801,7 +801,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "This text is displayed as a tooltip when hovering over the layer features on the map",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Map layers",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We currently support GeoJSON files. Read the {supportArticle} for tips on how to convert and style map layers.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Map default center and zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "The default center point and zoom level of the map. Manually adjust the values below, or click on the {button} button in the top right corner of the map to save the current center point and zoom level of the map as the default values.",
@@ -810,7 +809,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remove layer",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support article",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Map zoom level",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "The default zoom level of the map. Accepts a value between 1 and 17, where 1 is fully zoomed out (the entire world is visible) and 17 is fully zoomed in (blocks and buildings are visible)",
   "app.containers.AdminPage.ProjectEdit.PollTab.addPollQuestion": "Add a poll question",
diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index b366ecf30a99..11d874ee4064 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Slāņa ekrāna padoms",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Šis teksts redzams kā ekrāna padoms, virzoties pāri slāņa elementiem kartē.",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Kartes slāņi",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Šobrīd mēs atbalstām GeoJSON failus. Lasiet {supportArticle}, lai uzzinātu, kā konvertēt un vizuāli pielāgot karšu slāņus.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Noklusējuma garums",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Kartes noklusējuma viduspunkts un tālummaiņa",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Kartes noklusējuma viduspunkta un tālummaiņas līmenis. Manuāli pielāgojiet tālāk norādītās vērtības vai noklikšķiniet uz pogas {poga} kartes augšējā labajā stūrī, lai saglabātu pašreizējo kartes viduspunktu un tālummaiņas līmeni kā noklusējuma vērtības.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Noņemt slāni",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Saglabāt",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "atbalsta raksts",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Kartes tālummaiņas līmenis",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Kartes noklusējuma tālummaiņas līmenis. Pieņem vērtību no 1 līdz 17, kur 1 ir pilnībā attālināta (redzama visa pasaule) un 17 ir pilnībā pietuvināta (redzami bloki un ēkas).",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizēt visus lietotāja datus",
diff --git a/front/app/translations/admin/mi.json b/front/app/translations/admin/mi.json
index 98fac5128aaf..209534a25b5b 100644
--- a/front/app/translations/admin/mi.json
+++ b/front/app/translations/admin/mi.json
@@ -483,7 +483,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "This text is displayed as a tooltip when hovering over the layer features on the map",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Map layers",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We currently support GeoJSON files. Read the {supportArticle} for tips on how to convert and style map layers.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Map default center and zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "The default center point and zoom level of the map. Manually adjust the values below, or click on the {button} button in the top right corner of the map to save the current center point and zoom level of the map as the default values.",
@@ -492,7 +491,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remove layer",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support article",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/en/articles/4910983-customize-your-project-map",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Map zoom level",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "The default zoom level of the map. Accepts a value between 1 and 17, where 1 is fully zoomed out (the entire world is visible) and 17 is fully zoomed in (blocks and buildings are visible)",
   "app.containers.AdminPage.ProjectEdit.PollTab.addPollQuestion": "Add a poll question",
diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index 899eb14ef92f..ec622ecc415c 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Verktøytips for lag",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Denne teksten vises som et verktøytips når markøren holdes over lagfunksjonene på kartet",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Kartlag",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Vi støtter for øyeblikket GeoJSON-filer. Les {supportArticle} for tips til hvordan du konverterer og stilsetter kartlag.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standard lengdegrad",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Standardsenter og zoomnivå for kart",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Standard senterpunkt og zoomnivå for kartet. Du kan manuelt justere verdiene nedenfor, eller klikke på knappen {button} øverst til høyre i kartet for å lagre det gjeldende senterpunktet og zoomnivået i kartet som standardverdier.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Fjern lag",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Lagre",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "støtteartikkel",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Kartets zoomnivå",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Standard zoomnivå for kartet. Godtar en verdi mellom 1 og 17, der 1 er helt utzoomet (hele verden er synlig) og 17 er helt innzoomet (kvartaler og bygninger er synlige)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymiser alle brukerdata",
diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index fabbd7db4b63..525a220f50b6 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Laag tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Deze tekst wordt weergegeven als een tooltip wanneer je met de muis over de onderdelen in de laag op de kaart gaat",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Lagen",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We ondersteunen momenteel GeoJSON-bestanden. Lees het {supportArticle} voor tips over het converteren en stijlen van kaartlagen.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standaard lengtegraad",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Middelpunt en zoom-niveau van de kaart",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Het standaard middelpunt en zoom-niveau van de kaart. Pas de waarden hieronder handmatig aan, of klik op de {button} knop in de linkerbovenhoek van de kaart om het huidige middelpunt en zoom-niveau van de kaart op te slaan als de standaardwaarden.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Laag verwijderen",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Opslaan",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support-artikel",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Standaard zoom-niveau",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Stel in hoe de kaart standaard is ingezoomd. Kies een waarde tussen 0 en 20, waarbij 0 volledig uitgezoomd is (de hele wereld is zichtbaar) en 20 volledig ingezoomd is (blokken en gebouwen zijn zichtbaar)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Alle gebruikersgegevens anonimiseren",
diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index 1fc0ec28d8fe..1143ba107f1d 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Laag tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Deze tekst wordt weergegeven als een tooltip wanneer je met de muis over de onderdelen in de laag op de kaart gaat",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Lagen",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We ondersteunen momenteel GeoJSON-bestanden. Lees het {supportArticle} voor tips over het converteren en stijlen van kaartlagen.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standaard lengtegraad",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Middelpunt en zoom-niveau van de kaart",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Het standaard middelpunt en zoom-niveau van de kaart. Pas de waarden hieronder handmatig aan, of klik op de {button} knop in de linkerbovenhoek van de kaart om het huidige middelpunt en zoom-niveau van de kaart op te slaan als de standaardwaarden.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Laag verwijderen",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Opslaan",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support-artikel",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Standaard zoom-niveau",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Stel in hoe de kaart standaard is ingezoomd. Kies een waarde tussen 0 en 20, waarbij 0 volledig uitgezoomd is (de hele wereld is zichtbaar) en 20 volledig ingezoomd is (blokken en gebouwen zijn zichtbaar)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Alle gebruikersgegevens anonimiseren",
diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index 16699b976af9..ef4ff8daa632 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Etykieta warstwy",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Ten tekst jest wyświetlany jako podpowiedź podczas najechania kursorem na warstwy na mapie",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Warstwy",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Obecnie obsługujemy pliki GeoJSON. Przeczytaj {supportArticle}, aby dowiedzieć się, jak konwertować i stylizować warstwy mapy.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Domyślna długość geograficzna środka",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Domyślny środek mapy",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Domyślny punkt centralny i poziom powiększenia mapy. Ręcznie dostosuj poniższe wartości lub kliknij na przycisk {button} w prawym górnym rogu mapy, aby zapisać bieżący punkt centralny i poziom powiększenia mapy jako wartości domyślne.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Usuń warstwę",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Zapisz",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "artykuł pomocniczy",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Domyślny poziom powiększenia",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Ustaw, jak bardzo mapa jest domyślnie powiększona. Wybierz wartość pomiędzy 0 a 20, gdzie 0 oznacza całkowite pomniejszenie (cały świat jest widoczny), a 20 oznacza całkowite przybliżenie (bloki i budynki są widoczne)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizuj wszystkie dane użytkownika",
diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index 48245ae16284..360a3bef5ba2 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Dica de camada",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Este texto é exibido como uma dica de ferramenta ao passar o mouse sobre os recursos da camada no mapa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Camadas",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Atualmente suportamos arquivos GeoJSON. Leia o {supportArticle} para dicas sobre como converter e editar as camadas de mapas.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Longitude predefinida",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centro do mapa & zoom padrão",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "O ponto central e o nível de zoom do mapa padrão. Ajuste manualmente os valores abaixo, ou clique no botão {button} no canto superior direito do mapa para salvar o ponto central atual e o nível de zoom do mapa como os valores padrão.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remover camada",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Salvar",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "artigo de apoio",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nível de zoom predefinido",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Defina o padrão para o zoom do mapa. Escolha um valor entre 0 e 20, em que 0 é totalmente ampliado (o mundo inteiro é visível) e 20 é totalmente focado (blocos e edifícios são visíveis)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Tornar anônimos todos os dados de usuário",
diff --git a/front/app/translations/admin/ro-RO.json b/front/app/translations/admin/ro-RO.json
index 5e12dfaa08eb..696a4dc62742 100644
--- a/front/app/translations/admin/ro-RO.json
+++ b/front/app/translations/admin/ro-RO.json
@@ -759,7 +759,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Sfat de instrumente pentru straturi",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Acest text este afișat ca un sfat de instrumente atunci când treceți cu mouse-ul peste caracteristicile stratului de pe hartă",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Straturi",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "În prezent, acceptăm fișiere GeoJSON. Citiți {supportArticle} pentru sfaturi despre cum puteți converti și stiliza straturile de hartă.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Longitudine implicită",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centrul și zoomul implicit al hărții",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Punctul central implicit și nivelul de zoom al hărții. Reglați manual valorile de mai jos sau faceți click pe butonul {button} din colțul din dreapta sus al hărții pentru a salva punctul central și nivelul de zoom al hărții ca valori implicite.",
@@ -768,7 +767,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Eliminați stratul",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Salvați",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "articol de sprijin",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/en/articles/4910983-customize-your-project-map",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nivel de zoom implicit",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Setați cât de mărită este harta în mod implicit. Alegeți o valoare între 0 și 20, unde 0 este complet micșorat (întreagul glob este vizibil) și 20 este complet mărită (blocurile și clădirile sunt vizibile)",
   "app.containers.AdminPage.ProjectEdit.PollTab.addPollQuestion": "Add a poll question",
diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index 1d1811e3c103..2b11a2cb052c 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Opis sloja",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Ovaj tekst se prikazuje kao savet pri prelasku kursorom preko sloja na mapi",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Slojevi mape",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Trenutno podržavamo GeoJSON datoteke. Pročitajte {supportArticle} za savete o tome kako da konvertujete i stilizujete slojeve mape.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Podrazumevana geografska dužina",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Podrazumevani centar mape i zumiranje",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Podrazumevana centralna tačka i nivo zumiranja mape. Podesite donje vrednosti ili kliknite na dugme {button} u gornjem desnom uglu mape da biste sačuvali trenutnu centralnu tačku i nivo zumiranja mape kao podrazumevane vrednosti.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Uklonite sloj",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Sačuvajte",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "podrška (tekst)",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nivo zumiranja mape",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Podrazumevani nivo zumiranja karte. Prihvata vrednost između 1 i 17, pri čemu je 1 potpuno zumirana na gore (čitav svet je vidljiv), a 17 je potpuno zumirana ka tlu (vidljivi su blokovi i zgrade)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Анонимизирајте све корисничке податке",
diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index cca7b2619c44..5e8cda52214c 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Опис слоја",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Овај текст се приказује као алатка када пређете мишем преко карактеристика слоја на мапи",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Слојеви карте",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Тренутно подржавамо ГеоЈСОН датотеке. Прочитајте {supportArticle} за савете о томе како да конвертујете и стилизујете слојеве карте.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Подразумевана дужина",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Подразумевани центар мапе и зумирање",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Подразумевана централна тачка и ниво зумирања мапе. Ручно подесите вредности испод или кликните на дугме {button} у горњем десном углу карте да бисте сачували тренутну централну тачку и ниво зумирања мапе као подразумеване вредности.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Уклоните слој",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "сачувати",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "чланак подршке",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "хттпс://суппорт.цитизенлаб.цо/артицлес/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Ниво зумирања мапе",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Подразумевани ниво зумирања мапе. Прихвата вредност између 1 и 17, где је 1 потпуно умањен (цео свет је видљив), а 17 је потпуно увећан (блокови и зграде су видљиви)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Анонимизирајте све корисничке податке",
diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index c1cd0b0083d4..24e2ecbaea98 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Verktygstips för lager",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Den här texten visas som verktygstips när du håller muspekaren över lagerfunktionerna på kartan",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Kartlager",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Vi stödjer för närvarande GeoJSON-filer. Läs {supportArticle} om du vill få tips om hur du konverterar och formaterar kartlager.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standardlongitud",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Kartans standardmittpunkt och -zoomnivå",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Kartans standardmittpunkt och -zoomnivå. Justera värdena nedan manuellt eller klicka på knappen {button} i kartans övre högra hörn om du vill spara kartans aktuella mittpunkt och zoomnivå som standardvärden.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Ta bort lager",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Spara",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "supportartikel",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Kartans zoomnivå",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Kartans standardzoomnivå. Ett värde mellan 1 och 17 godkänns, där 1 är helt utzoomat (hela världen visas) och 17 är helt inzoomat (kvarter och byggnader visas)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymisera alla användardata",
diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index 3ec3534929cf..0ea7062d0090 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -1207,7 +1207,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Katman araç ipucu",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Bu metin, harita üzerinde katman özelliklerinin üzerine gelindiğinde bir araç ipucu olarak görüntülenir",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Harita katmanları",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Şu anda GeoJSON dosyalarını destekliyoruz. Harita katmanlarının nasıl dönüştürüleceği ve şekillendirileceği hakkında ipuçları için {supportArticle} okuyun.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Varsayılan boylam",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Harita varsayılan merkezi ve yakınlaştırma düzeyi",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Haritanın varsayılan merkez noktası ve yakınlaştırma düzeyidir. Aşağıdaki değerleri manuel olarak ayarlayın veya haritanın mevcut merkez noktasını ve yakınlaştırma düzeyini varsayılan değerler olarak kaydetmek için haritanın sağ üst köşesindeki {button} düğmesine tıklayın.",
@@ -1217,7 +1216,6 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Katmanı kaldırın",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Kaydet",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "destek makalesini",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "https://support.citizenlab.co/articles/4910983",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Harita yakınlaştırma düzeyi",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Haritanın varsayılan yakınlaştırma düzeyidir. 1 ile 17 arasında bir değer kabul edilir; burada 1 tamamen uzaklaştırılmış (tüm dünya görünür) ve 17 tamamen yakınlaştırılmış (sokaklar ve binalar görünür) olur",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Tüm kullanıcı verilerini anonimleştirin",
diff --git a/front/app/translations/en.json b/front/app/translations/en.json
index cd4f5884ee59..b3b6fbe96e69 100644
--- a/front/app/translations/en.json
+++ b/front/app/translations/en.json
@@ -183,7 +183,6 @@
   "app.components.IdeasMap.or": "or",
   "app.components.IdeasMap.signInLinkText": "log in",
   "app.components.IdeasMap.signUpLinkText": "sign up",
-  "app.components.IdeasMap.startIdeaAtLocation": "Submit idea at location",
   "app.components.IdeasMap.submitIdea2": "Submit input",
   "app.components.IdeasMap.tapOnMapToAdd": "Tap on the map to add your input",
   "app.components.IdeasMap.tapOnMapToAddAdmin2": "As an admin, you can tap on the map to add your input, even if this phase is not active.",

From d70580c955bed0dd55e4eb74947635c947137e8b Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Fri, 23 Feb 2024 15:53:48 +0100
Subject: [PATCH 044/282] WIP Allow Feature Layer and Web Map uploads

---
 front/app/components/EsriMap/index.tsx        |  34 +++-
 front/app/components/EsriMap/utils.tsx        |  37 +++++
 front/app/components/IdeasMap/index.tsx       |  18 ++-
 .../IdeationConfigurationMap.tsx              |  26 +---
 .../PostShowComponents/DropdownMap/Map.tsx    |  21 ++-
 .../FeatureLayerUpload.tsx                    |   4 +-
 .../WebMapUpload.tsx                          | 147 ++++++++++++++++++
 .../ProjectCustomMapConfigPage/index.tsx      |  11 ++
 .../ProjectCustomMapConfigPage/messages.ts    |  14 ++
 .../ProjectCustomMapConfigPage/utils.tsx      |   8 +-
 10 files changed, 286 insertions(+), 34 deletions(-)
 create mode 100644 front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index 1e7cc712e263..0591c1c96961 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -17,6 +17,7 @@ import Point from '@arcgis/core/geometry/Point';
 import Expand from '@arcgis/core/widgets/Expand';
 import Legend from '@arcgis/core/widgets/Legend';
 import LayerList from '@arcgis/core/widgets/LayerList';
+import WebMap from '@arcgis/core/WebMap';
 
 // utils
 import { getDefaultBasemap } from './utils';
@@ -35,6 +36,10 @@ const MapContainer = styled(Box)`
     display: none;
   }
 
+  .esri-legend {
+    max-height: 200px !important;
+  }
+
   ${media.phone`
     .esri-legend {
       max-width: 240px !important;
@@ -66,6 +71,7 @@ type InitialData = {
   showLegend?: boolean;
   showLayerVisibilityControl?: boolean;
   zoomWidgetLocation?: 'left' | 'right';
+  webMapId?: string | null;
   onInit?: (mapView: MapView) => void;
 };
 
@@ -83,6 +89,7 @@ const EsriMap = ({
   const locale = useLocale();
   const isMobileOrSmaller = useBreakpoint('phone');
   const [map, setMap] = useState<Map | null>(null);
+  const [webMap, setWebMap] = useState<WebMap | null>(null);
   const [mapView, setMapView] = useState<MapView | null>(null);
   const mapRef = useRef<HTMLDivElement | null>(null);
 
@@ -98,7 +105,6 @@ const EsriMap = ({
       const mapView = new MapView({
         container: mapRef.current, // Reference to DOM node that will contain the view
         map: newMap,
-        popupEnabled: false,
         popup: {
           dockEnabled: false,
           dockOptions: {
@@ -142,6 +148,18 @@ const EsriMap = ({
         minZoom: 5,
       };
 
+      // Set web map if it was provided
+      if (initialData?.webMapId) {
+        const webMap = new WebMap({
+          portalItem: {
+            id: initialData?.webMapId,
+          },
+        });
+
+        setWebMap(webMap);
+        mapView.map = webMap;
+      }
+
       // Change location of zoom widget if specified
       if (initialData?.zoomWidgetLocation === 'right') {
         const zoom = mapView.ui.find('zoom');
@@ -162,7 +180,7 @@ const EsriMap = ({
           content: new Legend({
             view: mapView,
             hideLayersNotInCurrentView: false,
-            style: { type: 'card', layout: 'stack' },
+            style: { type: 'classic', layout: 'stack' },
           }),
           view: mapView,
           expanded: isMobileOrSmaller ? false : true,
@@ -207,13 +225,23 @@ const EsriMap = ({
   // Note: This data is dynamic and may change.
   useEffect(() => {
     // Add any map layers which were passed in
+    webMap?.when(() => {
+      if (webMap && layers) {
+        layers.forEach((layer) => {
+          webMap.remove(layer);
+          webMap.add(layer);
+        });
+        return;
+      }
+    });
+
     if (map && layers) {
       map?.removeAll();
       layers.forEach((layer) => {
         map.add(layer);
       });
     }
-  }, [layers, map]);
+  }, [layers, map, webMap]);
 
   useEffect(() => {
     // Add any graphics which were passed in
diff --git a/front/app/components/EsriMap/utils.tsx b/front/app/components/EsriMap/utils.tsx
index 3608b62299e6..ea999238a738 100644
--- a/front/app/components/EsriMap/utils.tsx
+++ b/front/app/components/EsriMap/utils.tsx
@@ -13,6 +13,7 @@ import SimpleMarkerSymbol from '@arcgis/core/symbols/SimpleMarkerSymbol';
 import FeatureReductionCluster from '@arcgis/core/layers/support/FeatureReductionCluster';
 import MapView from '@arcgis/core/views/MapView';
 import SimpleLineSymbol from '@arcgis/core/symbols/SimpleLineSymbol';
+import FeatureLayer from '@arcgis/core/layers/FeatureLayer';
 
 // utils
 import { hexToRGBA } from 'utils/helperUtils';
@@ -371,6 +372,42 @@ export const showAddInputPopup = ({
   });
 };
 
+// createEsriFeatureLayers
+// Description: Create list of Esri GeoJSON layers from a list of IMapLayerAttributes
+export const createEsriFeatureLayers = (
+  layers: IMapLayerAttributes[],
+  localize: Localize
+) => {
+  // create new Feature Layers from the Map Config layers
+  const esriLayers: Layer[] = [];
+  layers.map((layer) => {
+    if (localize(layer.title_multiloc)) {
+      const title = localize(layer.title_multiloc);
+
+      // Extract number of sublayers if present
+      const titleSplit = title.indexOf('(');
+      const subLayerCount = parseInt(
+        title.substring(titleSplit + 1, title.length - 1),
+        10
+      );
+
+      // If we have sublayers, add a feature layer for each
+      if (subLayerCount > 1) {
+        for (let i = 0; i < subLayerCount; i++) {
+          esriLayers.push(
+            new FeatureLayer({ url: `${layer.layer_url}/${i + 1}` })
+          );
+        }
+      } else {
+        // Otherwise, just add the single feature layer
+        esriLayers.push(new FeatureLayer({ url: layer.layer_url }));
+      }
+      return;
+    }
+  });
+  return esriLayers;
+};
+
 // createEsriGeoJsonLayers
 // Description: Create list of Esri GeoJSON layers from a list of IMapLayerAttributes
 export const createEsriGeoJsonLayers = (
diff --git a/front/app/components/IdeasMap/index.tsx b/front/app/components/IdeasMap/index.tsx
index 59257cfb20b9..1882b919f8c6 100644
--- a/front/app/components/IdeasMap/index.tsx
+++ b/front/app/components/IdeasMap/index.tsx
@@ -46,6 +46,7 @@ import {
   goToMapLocation,
   esriPointToGeoJson,
   changeCursorOnHover,
+  createEsriFeatureLayers,
 } from 'components/EsriMap/utils';
 import {
   InnerContainer,
@@ -194,15 +195,16 @@ const IdeasMap = memo<Props>(({ projectId, phaseId, ideasList }: Props) => {
     const layers = mapConfig?.data.attributes.layers;
 
     // All layers are either of type Esri or GeoJSON, so we can check just the first layer
-    if (layers && layers[0]?.geojson?.features) {
+    if (layers && layers[0]?.type === 'CustomMaps::GeojsonLayer') {
       return createEsriGeoJsonLayers(
         mapConfig?.data.attributes.layers,
         localize
       );
-    } else if (layers) {
-      return layers.map((layer) => {
-        return new FeatureLayer({ url: layer.layer_url });
-      });
+    } else if (layers && layers[0]?.type === 'CustomMaps::EsriFeatureLayer') {
+      return createEsriFeatureLayers(
+        mapConfig.data.attributes.layers,
+        localize
+      );
     }
     return [];
   }, [mapConfig, localize]);
@@ -251,7 +253,7 @@ const IdeasMap = memo<Props>(({ projectId, phaseId, ideasList }: Props) => {
             sizeInPx: 42,
           }),
         }),
-        legendEnabled: false,
+        legendEnabled: true,
         // Add cluster display to this layer
         featureReduction: getClusterConfiguration(theme.colors.tenantPrimary),
         // Add a popup template which is used when multiple ideas share a single location
@@ -307,6 +309,9 @@ const IdeasMap = memo<Props>(({ projectId, phaseId, ideasList }: Props) => {
       mapView.hitTest(event).then((result) => {
         // Get any map elements underneath map click
         const elements = result.results;
+
+        console.log('elements: ', elements);
+
         if (elements.length > 0) {
           // There are map elements - user clicked a layer, idea pin OR a cluster
           const topElement = elements[0];
@@ -493,6 +498,7 @@ const IdeasMap = memo<Props>(({ projectId, phaseId, ideasList }: Props) => {
               showLayerVisibilityControl: true,
               showLegend: true,
               zoomWidgetLocation: 'right',
+              webMapId: mapConfig?.data.attributes.esri_web_map_id,
               onInit: onMapInit,
             }}
             height={isMobileOrSmaller ? '68vh' : '80vh'}
diff --git a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
index f726033b7828..17fd7f0db9b8 100644
--- a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
+++ b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
@@ -5,19 +5,19 @@ import EsriMap from 'components/EsriMap';
 import MapView from '@arcgis/core/views/MapView';
 import LayerHoverLabel from './components/LayerHoverLabel';
 import MapHelperOptions from './components/MapHelperOptions';
-import Layer from '@arcgis/core/layers/Layer';
+
 // hooks
 import useLocalize from 'hooks/useLocalize';
 
 // utils
 import {
   changeCursorOnHover,
+  createEsriFeatureLayers,
   createEsriGeoJsonLayers,
 } from 'components/EsriMap/utils';
 
 // types
 import { IMapConfig } from 'api/map_config/types';
-import FeatureLayer from '@arcgis/core/layers/FeatureLayer';
 
 export interface Props {
   mapConfig: IMapConfig;
@@ -43,23 +43,10 @@ const IdeationConfigurationMap = memo<Props>(
             localize
           );
         } else if (layers[0]?.type === 'CustomMaps::EsriFeatureLayer') {
-          const esriLayer: Layer[] = [];
-
-          // if (layer.layer_url) {
-          //   request(layer.layer_url).then((response) => {
-          //     if (response.layers.length > 1) {
-          //       console.log('Has sub layers...');
-          //     } else {
-          //       console.log('Has 1 layer. Adding...');
-          //       esriLayers.push(new FeatureLayer({ url: layer.layer_url }));
-          //     }
-          //     return esriLayers;
-          //   });
-          // }
-
-          return layers.map((layer) => {
-            return new FeatureLayer({ url: layer.layer_url });
-          });
+          return createEsriFeatureLayers(
+            mapConfig.data.attributes.layers,
+            localize
+          );
         }
       }
       return [];
@@ -97,6 +84,7 @@ const IdeationConfigurationMap = memo<Props>(
             showLayerVisibilityControl: true,
             showLegend: true,
             onInit: onMapInit,
+            webMapId: mapConfig.data.attributes.esri_web_map_id,
           }}
           height={'700px'}
           layers={mapLayers}
diff --git a/front/app/components/PostShowComponents/DropdownMap/Map.tsx b/front/app/components/PostShowComponents/DropdownMap/Map.tsx
index 4e804dde8938..45dacbfe571c 100644
--- a/front/app/components/PostShowComponents/DropdownMap/Map.tsx
+++ b/front/app/components/PostShowComponents/DropdownMap/Map.tsx
@@ -3,6 +3,7 @@ import React, { memo, useMemo } from 'react';
 import Graphic from '@arcgis/core/Graphic';
 import Point from '@arcgis/core/geometry/Point';
 import {
+  createEsriFeatureLayers,
   createEsriGeoJsonLayers,
   getMapPinSymbol,
 } from 'components/EsriMap/utils';
@@ -22,12 +23,26 @@ const MapComponent = memo<Props>(({ position, projectId }) => {
   const center = position.coordinates;
 
   // Load layers from project
-
   // Create GeoJSON layers to add to Esri map
   const layers = useMemo(() => {
     const mapConfigLayers = mapConfig?.data.attributes.layers;
-    if (mapConfigLayers && mapConfigLayers[0].geojson?.features) {
-      return createEsriGeoJsonLayers(mapConfigLayers, localize);
+    // All layers are either of type Esri or GeoJSON, so we can check just the first layer
+    if (
+      mapConfigLayers &&
+      mapConfigLayers[0]?.type === 'CustomMaps::GeojsonLayer'
+    ) {
+      return createEsriGeoJsonLayers(
+        mapConfig?.data.attributes.layers,
+        localize
+      );
+    } else if (
+      mapConfigLayers &&
+      mapConfigLayers[0]?.type === 'CustomMaps::EsriFeatureLayer'
+    ) {
+      return createEsriFeatureLayers(
+        mapConfig.data.attributes.layers,
+        localize
+      );
     }
     return [];
   }, [mapConfig, localize]);
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
index 6241f9a552dd..8a3443eac1f9 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
@@ -60,6 +60,7 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
         setImportError(false);
 
         const { serviceDescription } = response;
+        const subLayerCount = response.layers.length;
 
         // Add the new map layer
         if (mapConfigId && !isNilOrError(tenantLocales)) {
@@ -71,7 +72,8 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
               id: mapConfigId,
               title_multiloc: getFeatureLayerInitialTitleMultiloc(
                 serviceDescription,
-                tenantLocales
+                tenantLocales,
+                subLayerCount
               ),
               default_enabled: true,
             },
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx
new file mode 100644
index 000000000000..fad9a9d50b7b
--- /dev/null
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx
@@ -0,0 +1,147 @@
+import React, { useState } from 'react';
+
+// intl
+import { useIntl } from 'utils/cl-intl';
+import messages from './messages';
+
+// components
+import Error from 'components/UI/Error';
+import {
+  Box,
+  Title,
+  Text,
+  IconTooltip,
+  Input,
+  Button,
+  Success,
+} from '@citizenlab/cl2-component-library';
+
+// types
+import { ViewOptions } from '.';
+
+// utils
+import { request, ErrorTypes, ApiKeyManager } from '@esri/arcgis-rest-request';
+
+// hooks
+import useAppConfiguration from 'api/app_configuration/useAppConfiguration';
+import useUpdateMapConfig from 'api/map_config/useUpdateMapConfig';
+
+type Props = {
+  projectId: string;
+  setView: (view: ViewOptions) => void;
+  mapConfigId: string;
+};
+
+const WebMapUpload = ({ projectId, mapConfigId, setView }: Props) => {
+  const { formatMessage } = useIntl();
+  const { data: appConfig } = useAppConfiguration();
+  const { mutateAsync: updateProjectMapConfig, isLoading } =
+    useUpdateMapConfig();
+
+  const [portalId, setPortalId] = useState('');
+  const [importError, setImportError] = useState(false);
+  const [success, setSuccess] = useState(false);
+  const [errorMessage, setErrorMessage] = useState('');
+
+  const addEsriWebMap = () => {
+    // First test if we have access to the Web Map portal item
+    const apiKey =
+      appConfig?.data.attributes.settings.esri_integration?.api_key;
+    const esriAuthManager = apiKey ? ApiKeyManager.fromKey(apiKey) : undefined;
+
+    request(`https://www.arcgis.com/sharing/rest/content/items/${portalId}`, {
+      authentication: esriAuthManager,
+    })
+      .then(() => {
+        setImportError(false);
+        if (mapConfigId) {
+          // Save the web map ID to the map config
+          updateProjectMapConfig(
+            {
+              projectId,
+              id: mapConfigId,
+              esri_web_map_id: portalId,
+            },
+            {
+              onSuccess: () => {
+                setSuccess(true);
+                setView('main');
+              },
+              onError: () => {
+                setImportError(true);
+                setErrorMessage(formatMessage(messages.defaultEsriError));
+              },
+            }
+          );
+        }
+      })
+      .catch((e) => {
+        setImportError(true);
+
+        switch (e.name) {
+          case ErrorTypes.ArcGISRequestError:
+            // A general error from the API
+            setErrorMessage(formatMessage(messages.generalApiError));
+            break;
+
+          case ErrorTypes.ArcGISAuthError:
+            // An authentication error
+            setErrorMessage(formatMessage(messages.authenticationError));
+            break;
+
+          case ErrorTypes.ArcGISTokenRequestError:
+            // An error response trying to generate a new access token
+            setErrorMessage(formatMessage(messages.esriSideError));
+            break;
+
+          default:
+            // Default error from Esri - usually a network error
+            setErrorMessage(formatMessage(messages.defaultEsriError));
+        }
+      });
+  };
+
+  return (
+    <>
+      <Box mt="12px" display="flex" gap="8px" alignContent="center">
+        <Title my="4px" variant="h5" color={'coolGrey600'} fontWeight="bold">
+          {formatMessage(messages.addWebMap)}
+        </Title>
+        <IconTooltip mb="4px" content={formatMessage(messages.webMapTooltip)} />
+      </Box>
+      <Text my="8px" color={'grey800'}>
+        {formatMessage(messages.addWebMapInstruction)}
+      </Text>
+      <Input
+        type="text"
+        value={portalId}
+        onChange={(value) => {
+          setPortalId(value);
+        }}
+        placeholder={'e1cc90bf48e74243883516c2f4f6f72d'}
+      />
+
+      <Box display="flex" flexWrap="wrap" gap="12px" mt="16px">
+        <Button
+          buttonStyle="secondary"
+          onClick={() => {
+            setView('main');
+          }}
+        >
+          {formatMessage(messages.cancel2)}
+        </Button>
+        <Button onClick={addEsriWebMap} processing={isLoading}>
+          {formatMessage(messages.import2)}
+        </Button>
+      </Box>
+      {success && (
+        <Success text={formatMessage(messages.layerAdded)} showIcon={true} />
+      )}
+      {importError && (
+        <Error text={errorMessage} marginTop="10px" showIcon={true} />
+      )}
+    </>
+  );
+};
+
+export default WebMapUpload;
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx
index 93ecd536c768..5f4a05292eac 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx
@@ -19,6 +19,7 @@ import { getCenter, getZoomLevel } from '../../../utils/mapUtils/map';
 import styled from 'styled-components';
 import IdeationConfigurationMap from '../../../components/IdeationConfigurationMap/IdeationConfigurationMap';
 import FeatureLayerUpload from './FeatureLayerUpload';
+import WebMapUpload from './WebMapUpload';
 
 const Container = styled.div`
   display: flex;
@@ -102,6 +103,16 @@ const ProjectCustomMapConfigPage = memo<Props>(({ className }) => {
           </Box>
         )}
 
+        {view === 'webMapUpload' && (
+          <Box flex="0 0 520px" width="520px">
+            <WebMapUpload
+              projectId={projectId}
+              setView={setView}
+              mapConfigId={mapConfig?.data.id}
+            />
+          </Box>
+        )}
+
         <MapWrapper>
           <IdeationConfigurationMap
             mapConfig={mapConfig}
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
index 99ab1882d3b0..064804d5b780 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
@@ -255,4 +255,18 @@ export default defineMessages({
     defaultMessage:
       'You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current ArcGIS layers if you wish to upload a GeoJSON layer.',
   },
+  addWebMap: {
+    id: 'app.components.admin.PostManager.addWebMap',
+    defaultMessage: 'Add Web Map',
+  },
+  webMapTooltip: {
+    id: 'app.components.admin.PostManager.webMapTooltip',
+    defaultMessage:
+      'You can find the Web Map portal ID on your ArcGIS Online item page, on the right hand side.',
+  },
+  addWebMapInstruction: {
+    id: 'app.components.admin.PostManager.addWebMapInstruction',
+    defaultMessage:
+      'Copy the portal ID of your Web Map from ArcGIS Online and paste it in the input below:',
+  },
 });
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/utils.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/utils.tsx
index ad7a633f39f3..ca741ac63b2a 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/utils.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/utils.tsx
@@ -5,11 +5,15 @@ import { IMapConfig } from 'api/map_config/types';
 // Description: This function is used to generate the initial title multiloc for an Esri feature layer.
 export const getFeatureLayerInitialTitleMultiloc = (
   layerTitle: string,
-  tenantLocales: string[]
+  tenantLocales: string[],
+  subLayerCount: number
 ) => {
   const title_multiloc = {};
+  const title = // If there are sublayers, append the sublayer count to the title
+    subLayerCount > 1 ? `${layerTitle} (${subLayerCount})` : `${layerTitle}`;
+
   tenantLocales.forEach(
-    (tenantLocale) => (title_multiloc[`${tenantLocale}`] = layerTitle)
+    (tenantLocale) => (title_multiloc[`${tenantLocale}`] = title)
   );
   return title_multiloc;
 };

From 32f08726c21b2015051d9bf4d352a48df6dd33c3 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Fri, 23 Feb 2024 14:57:06 +0000
Subject: [PATCH 045/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/en.json | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 74e3b5462664..9e22533140d7 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -100,6 +100,8 @@
   "app.components.admin.PostManager.addFeatureLayer": "Add feature layer",
   "app.components.admin.PostManager.addFeatureLayerInstruction": "Copy the URL of the feature layer hosted on ArcGIS Online and paste it in the input below:",
   "app.components.admin.PostManager.addFeatureLayerTooltip": "Add a new feature layer to the map",
+  "app.components.admin.PostManager.addWebMap": "Add Web Map",
+  "app.components.admin.PostManager.addWebMapInstruction": "Copy the portal ID of your Web Map from ArcGIS Online and paste it in the input below:",
   "app.components.admin.PostManager.allPhases": "All phases",
   "app.components.admin.PostManager.allProjects": "All projects",
   "app.components.admin.PostManager.allStatuses": "All statuses",
@@ -223,6 +225,7 @@
   "app.components.admin.PostManager.votes": "Votes",
   "app.components.admin.PostManager.webMapAlreadyExists": "You can only add one Web Map at a time. Remove the current one to import a different one.",
   "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to connect a Web Map.",
+  "app.components.admin.PostManager.webMapTooltip": "You can find the Web Map portal ID on your ArcGIS Online item page, on the right hand side.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Less than a day} one {One day} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "from",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "group",

From 2bac5d56717ed5051b4a36ff61816f49ff6d665c Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Fri, 23 Feb 2024 17:01:51 +0100
Subject: [PATCH 046/282] WIP continue working on web map support

---
 front/app/components/EsriMap/index.tsx        | 26 +++++++++++++++++++
 .../EsriImportOptions.tsx                     |  5 +++-
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index 0591c1c96961..9a06dd60dbdc 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -18,6 +18,7 @@ import Expand from '@arcgis/core/widgets/Expand';
 import Legend from '@arcgis/core/widgets/Legend';
 import LayerList from '@arcgis/core/widgets/LayerList';
 import WebMap from '@arcgis/core/WebMap';
+import Collection from '@arcgis/core/core/Collection';
 
 // utils
 import { getDefaultBasemap } from './utils';
@@ -231,6 +232,15 @@ const EsriMap = ({
           webMap.remove(layer);
           webMap.add(layer);
         });
+
+        if (layers.find((layer) => layer.id === 'ideasLayer')) {
+          const ideasLayer = layers.find((layer) => layer.id === 'ideasLayer');
+          if (ideasLayer) {
+            webMap.remove(ideasLayer);
+            webMap.add(ideasLayer);
+          }
+        }
+        console.log('Layers: ', webMap.allLayers);
         return;
       }
     });
@@ -263,6 +273,22 @@ const EsriMap = ({
     }
   }, [onClick, mapView]);
 
+  useEffect(() => {
+    webMap?.layers.on('after-changes', function () {
+      console.log('Layers changed! Re-ordering...');
+
+      // TODO : Continue here
+      webMap?.reorder(
+        webMap?.layers.find((layer) => layer.id === 'ideasLayer'),
+        webMap?.layers.length - 1
+      );
+      const basemapCopy = webMap?.basemap.clone();
+      const test = new Collection<Layer>();
+      basemapCopy.referenceLayers = test;
+      webMap.basemap = basemapCopy;
+    });
+  }, [webMap?.layers, webMap]);
+
   useEffect(() => {
     // On map hover, pass the event to hover handler if it was provided
     if (onHover && mapView) {
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
index 0aebe58d31f0..98dc880a3fab 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
@@ -17,6 +17,7 @@ import useFeatureFlag from 'hooks/useFeatureFlag';
 
 // utils
 import { getLayerType } from './utils';
+import { isNilOrError } from 'utils/helperUtils';
 
 interface Props {
   projectId: string;
@@ -29,7 +30,9 @@ const EsriImportOptions = memo<Props>(({ setView, mapConfig }) => {
   const isEsriIntegrationEnabled = useFeatureFlag({ name: 'esri_integration' });
 
   const layerType = getLayerType(mapConfig);
-  const hasExistingWebMap = !!mapConfig?.data?.attributes?.esri_web_map_id;
+  const hasExistingWebMap = !isNilOrError(
+    mapConfig?.data?.attributes?.esri_web_map_id
+  );
 
   const getWebMapDisabledMessage = () => {
     if (!isEsriIntegrationEnabled) {

From 9f013c9dde250b0ca13701fd39f7150a52321d91 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Mon, 26 Feb 2024 17:30:55 +0100
Subject: [PATCH 047/282] WIP Web map uploads

---
 front/app/components/EsriMap/index.tsx        | 101 ++++++++++++------
 front/app/components/EsriMap/utils.tsx        |  10 +-
 front/app/components/IdeasMap/index.tsx       |   6 +-
 .../IdeationConfigurationMap.tsx              |   2 +-
 .../EsriImportOptions.tsx                     |  11 +-
 .../FeatureLayerUpload.tsx                    |  15 ++-
 .../MapLayersList.tsx                         |  47 +++++++-
 .../WebMapUpload.tsx                          |  12 ++-
 .../ProjectCustomMapConfigPage/messages.ts    |   4 +
 9 files changed, 161 insertions(+), 47 deletions(-)

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index 9a06dd60dbdc..6b9f43e56392 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -41,6 +41,10 @@ const MapContainer = styled(Box)`
     max-height: 200px !important;
   }
 
+  .esri-layer-list {
+    max-height: 200px !important;
+  }
+
   ${media.phone`
     .esri-legend {
       max-width: 240px !important;
@@ -92,8 +96,9 @@ const EsriMap = ({
   const [map, setMap] = useState<Map | null>(null);
   const [webMap, setWebMap] = useState<WebMap | null>(null);
   const [mapView, setMapView] = useState<MapView | null>(null);
+  const [referenceLayers, setReferenceLayers] =
+    useState<Collection<Layer> | null>(null);
   const mapRef = useRef<HTMLDivElement | null>(null);
-
   const initialValuesLoaded = useRef(false);
 
   // Sets the locale of the map
@@ -106,6 +111,7 @@ const EsriMap = ({
       const mapView = new MapView({
         container: mapRef.current, // Reference to DOM node that will contain the view
         map: newMap,
+        popupEnabled: false,
         popup: {
           dockEnabled: false,
           dockOptions: {
@@ -157,8 +163,8 @@ const EsriMap = ({
           },
         });
 
-        setWebMap(webMap);
         mapView.map = webMap;
+        setWebMap(webMap);
       }
 
       // Change location of zoom widget if specified
@@ -226,32 +232,56 @@ const EsriMap = ({
   // Note: This data is dynamic and may change.
   useEffect(() => {
     // Add any map layers which were passed in
+
+    // Handle when we're using a webmap
     webMap?.when(() => {
       if (webMap && layers) {
+        // Remove any layers not created by the Web Map
+        const layersToRemove = webMap?.layers?.filter((layer) =>
+          layer?.id?.includes('internal')
+        );
+        if (layersToRemove && layersToRemove?.toArray()?.length > 0) {
+          webMap.removeMany(layersToRemove.toArray());
+        }
+
+        // If there are any Web Map reference layers, re-order so they are below other layers created in our application
+        if (referenceLayers && referenceLayers.length > 0) {
+          const newBasemapLayers = webMap.basemap.baseLayers;
+          webMap.addMany(referenceLayers.toArray());
+          webMap.basemap = new Basemap({
+            baseLayers: newBasemapLayers,
+          });
+        }
+
+        // Add any layers passed in as props
         layers.forEach((layer) => {
-          webMap.remove(layer);
           webMap.add(layer);
         });
 
-        if (layers.find((layer) => layer.id === 'ideasLayer')) {
-          const ideasLayer = layers.find((layer) => layer.id === 'ideasLayer');
-          if (ideasLayer) {
-            webMap.remove(ideasLayer);
-            webMap.add(ideasLayer);
-          }
+        // If we have WebMap reference layers, save them in state
+        const refLayers =
+          webMap.basemap.referenceLayers.length > 0
+            ? webMap.basemap.referenceLayers
+            : undefined;
+
+        if (refLayers?.length && refLayers.length > 0) {
+          setReferenceLayers(refLayers);
         }
-        console.log('Layers: ', webMap.allLayers);
-        return;
       }
     });
 
+    // Handle layers for the default map (when we're not using a Web Map)
     if (map && layers) {
-      map?.removeAll();
-      layers.forEach((layer) => {
-        map.add(layer);
-      });
+      if (mapView) {
+        map.removeAll();
+
+        // mapView.map = map;
+        layers.map((layer) => {
+          map.add(layer);
+        });
+      }
     }
-  }, [layers, map, webMap]);
+  }, [layers, map, mapView, referenceLayers, webMap]);
 
   useEffect(() => {
     // Add any graphics which were passed in
@@ -273,22 +303,6 @@ const EsriMap = ({
     }
   }, [onClick, mapView]);
 
-  useEffect(() => {
-    webMap?.layers.on('after-changes', function () {
-      console.log('Layers changed! Re-ordering...');
-
-      // TODO : Continue here
-      webMap?.reorder(
-        webMap?.layers.find((layer) => layer.id === 'ideasLayer'),
-        webMap?.layers.length - 1
-      );
-      const basemapCopy = webMap?.basemap.clone();
-      const test = new Collection<Layer>();
-      basemapCopy.referenceLayers = test;
-      webMap.basemap = basemapCopy;
-    });
-  }, [webMap?.layers, webMap]);
-
   useEffect(() => {
     // On map hover, pass the event to hover handler if it was provided
     if (onHover && mapView) {
@@ -300,6 +314,29 @@ const EsriMap = ({
     }
   }, [onHover, mapView]);
 
+  useEffect(() => {
+    // Set web map if it was provided
+    if (initialData?.webMapId && mapView) {
+      const webMap = new WebMap({
+        portalItem: {
+          id: initialData?.webMapId,
+        },
+      });
+      mapView.map = webMap;
+      setWebMap(webMap);
+    } else if (mapView && map) {
+      // Else, set the default map
+      mapView.map = map;
+      setWebMap(null);
+    }
+  }, [
+    globalMapSettings.tile_provider,
+    initialData?.webMapId,
+    layers,
+    map,
+    mapView,
+  ]);
+
   return (
     <>
       <MapContainer
diff --git a/front/app/components/EsriMap/utils.tsx b/front/app/components/EsriMap/utils.tsx
index ea999238a738..00e79cff7706 100644
--- a/front/app/components/EsriMap/utils.tsx
+++ b/front/app/components/EsriMap/utils.tsx
@@ -395,14 +395,18 @@ export const createEsriFeatureLayers = (
       if (subLayerCount > 1) {
         for (let i = 0; i < subLayerCount; i++) {
           esriLayers.push(
-            new FeatureLayer({ url: `${layer.layer_url}/${i + 1}` })
+            new FeatureLayer({
+              url: `${layer.layer_url}/${i + 1}`,
+              id: 'internal',
+            })
           );
         }
       } else {
         // Otherwise, just add the single feature layer
-        esriLayers.push(new FeatureLayer({ url: layer.layer_url }));
+        esriLayers.push(
+          new FeatureLayer({ url: layer.layer_url, id: 'internal' })
+        );
       }
-      return;
     }
   });
   return esriLayers;
diff --git a/front/app/components/IdeasMap/index.tsx b/front/app/components/IdeasMap/index.tsx
index 1882b919f8c6..6bbbbfa2a3a2 100644
--- a/front/app/components/IdeasMap/index.tsx
+++ b/front/app/components/IdeasMap/index.tsx
@@ -253,7 +253,7 @@ const IdeasMap = memo<Props>(({ projectId, phaseId, ideasList }: Props) => {
             sizeInPx: 42,
           }),
         }),
-        legendEnabled: true,
+        legendEnabled: false,
         // Add cluster display to this layer
         featureReduction: getClusterConfiguration(theme.colors.tenantPrimary),
         // Add a popup template which is used when multiple ideas share a single location
@@ -310,8 +310,6 @@ const IdeasMap = memo<Props>(({ projectId, phaseId, ideasList }: Props) => {
         // Get any map elements underneath map click
         const elements = result.results;
 
-        console.log('elements: ', elements);
-
         if (elements.length > 0) {
           // There are map elements - user clicked a layer, idea pin OR a cluster
           const topElement = elements[0];
@@ -498,8 +496,8 @@ const IdeasMap = memo<Props>(({ projectId, phaseId, ideasList }: Props) => {
               showLayerVisibilityControl: true,
               showLegend: true,
               zoomWidgetLocation: 'right',
-              webMapId: mapConfig?.data.attributes.esri_web_map_id,
               onInit: onMapInit,
+              webMapId: mapConfig?.data.attributes.esri_web_map_id,
             }}
             height={isMobileOrSmaller ? '68vh' : '80vh'}
             layers={layers}
diff --git a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
index 17fd7f0db9b8..a6379e4ceb94 100644
--- a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
+++ b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
@@ -50,7 +50,7 @@ const IdeationConfigurationMap = memo<Props>(
         }
       }
       return [];
-    }, [mapConfig, localize]);
+    }, [localize, mapConfig?.data?.attributes?.layers]);
 
     const onMapInit = useCallback((esriMapView: MapView) => {
       // Save the esriMapView in state
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
index 98dc880a3fab..0ab0d5ff2b69 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
@@ -57,7 +57,10 @@ const EsriImportOptions = memo<Props>(({ setView, mapConfig }) => {
               : formatMessage(messages.esriAddOnFeatureTooltip)
           }
           hideOnClick={true}
-          disabled={layerType !== 'CustomMaps::GeojsonLayer'}
+          disabled={
+            layerType !== 'CustomMaps::GeojsonLayer' ||
+            !isEsriIntegrationEnabled
+          }
         >
           <div>
             <Button
@@ -80,7 +83,11 @@ const EsriImportOptions = memo<Props>(({ setView, mapConfig }) => {
           placement="top"
           content={getWebMapDisabledMessage()}
           hideOnClick={true}
-          disabled={layerType !== 'CustomMaps::GeojsonLayer'}
+          disabled={
+            !hasExistingWebMap ||
+            layerType === 'CustomMaps::GeojsonLayer' ||
+            !isEsriIntegrationEnabled
+          }
         >
           <div>
             <Button
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
index 8a3443eac1f9..95207f84bdc2 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
@@ -40,14 +40,18 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
   const { data: appConfig } = useAppConfiguration();
 
   const [url, setUrl] = useState('');
+  const [loading, setLoading] = useState(false);
   const [importError, setImportError] = useState(false);
   const [success, setSuccess] = useState(false);
   const [errorMessage, setErrorMessage] = useState('');
 
   const tenantLocales = useAppConfigurationLocales();
-  const { mutate: createProjectMapLayer, isLoading } = useAddMapLayer();
+  const { mutate: createProjectMapLayer, isLoading: apiCallLoading } =
+    useAddMapLayer();
 
   const addEsriFeatureLayer = () => {
+    setLoading(true);
+
     // First test if we have access to the Feature Layer URL
     const apiKey =
       appConfig?.data.attributes.settings.esri_integration?.api_key;
@@ -80,8 +84,10 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
             {
               onError: () => {
                 setImportError(true);
+                setLoading(false);
               },
               onSuccess: () => {
+                setLoading(false);
                 setSuccess(true);
                 setView('main');
               },
@@ -91,6 +97,7 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
       })
       .catch((e) => {
         setImportError(true);
+        setLoading(false);
 
         switch (e.name) {
           case ErrorTypes.ArcGISRequestError:
@@ -149,7 +156,11 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
         >
           {formatMessage(messages.cancel2)}
         </Button>
-        <Button onClick={addEsriFeatureLayer} processing={isLoading}>
+        <Button
+          disabled={!url || url === ''}
+          onClick={addEsriFeatureLayer}
+          processing={apiCallLoading || loading}
+        >
           {formatMessage(messages.import2)}
         </Button>
       </Box>
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
index 2cbf1b833bcd..702a0ccc8a7d 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
@@ -3,6 +3,7 @@ import React, { memo } from 'react';
 // components
 import Button from 'components/UI/Button';
 import {
+  Box,
   Icon,
   IconTooltip,
   colors,
@@ -35,6 +36,7 @@ import messages from './messages';
 import styled from 'styled-components';
 import useMapConfig from 'api/map_config/useMapConfig';
 import useFeatureFlag from 'hooks/useFeatureFlag';
+import useUpdateMapConfig from 'api/map_config/useUpdateMapConfig';
 
 const Container = styled.div``;
 
@@ -101,6 +103,7 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
     const { data: mapConfig } = useMapConfig(projectId);
     const { mutate: deleteProjectMapLayer } = useDeleteMapLayer();
     const { mutate: reorderProjectMapLayer } = useReorderMapLayer();
+    const { mutateAsync: updateProjectMapConfig } = useUpdateMapConfig();
     const isEsriIntegrationEnabled = useFeatureFlag({
       name: 'esri_integration',
     });
@@ -119,6 +122,16 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
       }
     };
 
+    const removeWebMap = () => {
+      if (mapConfig?.data.id) {
+        updateProjectMapConfig({
+          projectId,
+          id: mapConfig?.data.id,
+          esri_web_map_id: null,
+        });
+      }
+    };
+
     const toggleLayerConfig = (layerId: string) => (event: React.FormEvent) => {
       event?.preventDefault();
       onEditLayer(layerId);
@@ -180,7 +193,7 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
                           <LayerIcon
                             name={
                               mapLayer.type === 'CustomMaps::EsriFeatureLayer'
-                                ? 'map'
+                                ? 'timeline'
                                 : layerIconName
                             }
                             color={
@@ -242,6 +255,38 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
             )}
           </StyledSortableList>
         )}
+        {mapConfig?.data.attributes.esri_web_map_id && (
+          <Box borderBottom={`1px solid ${colors.divider}`} mb="36px">
+            <Box mb="24px" ml="32px">
+              <ListItem>
+                <LayerIcon name="map" color={colors.coolGrey600} />
+                <LayerName>
+                  {formatMessage(messages.esriWebMap)}:{' '}
+                  {mapConfig?.data.attributes.esri_web_map_id}
+                </LayerName>
+                <Buttons>
+                  <Spacer />
+                  <Tippy
+                    placement="bottom"
+                    content={<FormattedMessage {...messages.remove} />}
+                    hideOnClick={false}
+                    arrow={false}
+                  >
+                    <div>
+                      <RemoveButton
+                        icon="delete"
+                        iconSize="16px"
+                        buttonStyle="text"
+                        padding="0px"
+                        onClick={removeWebMap}
+                      />
+                    </div>
+                  </Tippy>
+                </Buttons>
+              </ListItem>
+            </Box>
+          </Box>
+        )}
 
         {mapConfig?.data?.id && (
           <>
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx
index fad9a9d50b7b..106f80434082 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx
@@ -35,15 +35,17 @@ type Props = {
 const WebMapUpload = ({ projectId, mapConfigId, setView }: Props) => {
   const { formatMessage } = useIntl();
   const { data: appConfig } = useAppConfiguration();
-  const { mutateAsync: updateProjectMapConfig, isLoading } =
+  const { mutateAsync: updateProjectMapConfig, isLoading: apiCallLoading } =
     useUpdateMapConfig();
 
   const [portalId, setPortalId] = useState('');
+  const [loading, setLoading] = useState(false);
   const [importError, setImportError] = useState(false);
   const [success, setSuccess] = useState(false);
   const [errorMessage, setErrorMessage] = useState('');
 
   const addEsriWebMap = () => {
+    setLoading(true);
     // First test if we have access to the Web Map portal item
     const apiKey =
       appConfig?.data.attributes.settings.esri_integration?.api_key;
@@ -65,6 +67,7 @@ const WebMapUpload = ({ projectId, mapConfigId, setView }: Props) => {
             {
               onSuccess: () => {
                 setSuccess(true);
+                setLoading(false);
                 setView('main');
               },
               onError: () => {
@@ -77,6 +80,7 @@ const WebMapUpload = ({ projectId, mapConfigId, setView }: Props) => {
       })
       .catch((e) => {
         setImportError(true);
+        setLoading(false);
 
         switch (e.name) {
           case ErrorTypes.ArcGISRequestError:
@@ -130,7 +134,11 @@ const WebMapUpload = ({ projectId, mapConfigId, setView }: Props) => {
         >
           {formatMessage(messages.cancel2)}
         </Button>
-        <Button onClick={addEsriWebMap} processing={isLoading}>
+        <Button
+          disabled={!portalId || portalId === ''}
+          onClick={addEsriWebMap}
+          processing={apiCallLoading || loading}
+        >
           {formatMessage(messages.import2)}
         </Button>
       </Box>
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
index 064804d5b780..d6cdfa944073 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
@@ -269,4 +269,8 @@ export default defineMessages({
     defaultMessage:
       'Copy the portal ID of your Web Map from ArcGIS Online and paste it in the input below:',
   },
+  esriWebMap: {
+    id: 'app.components.admin.PostManager.esriWebMap',
+    defaultMessage: 'Esri Web Map',
+  },
 });

From f032467e0619dab9c821fa85101a901594404957 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Mon, 26 Feb 2024 16:34:31 +0000
Subject: [PATCH 048/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/en.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 9e22533140d7..ab78287ed951 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -143,6 +143,7 @@
   "app.components.admin.PostManager.editedPostSave": "Save",
   "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Importing data from Esri ArcGIS Online is an add-on feature. Talk to your GS manager to unlock it.",
   "app.components.admin.PostManager.esriSideError": "An error occured on the ArcGIS application. Please wait a few minutes and try again later.",
+  "app.components.admin.PostManager.esriWebMap": "Esri Web Map",
   "app.components.admin.PostManager.exportAllInputs": "Export all posts (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Export all comments (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Export comments for this project (.xslx)",

From 65e60e5208a553f37f8821c794ca3b046451f6f3 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Mon, 26 Feb 2024 17:59:08 +0100
Subject: [PATCH 049/282] Minor updates

---
 front/app/components/EsriMap/index.tsx | 10 ++--------
 front/app/components/EsriMap/utils.tsx |  7 +++++--
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index 6b9f43e56392..6767ee5c1924 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -319,7 +319,7 @@ const EsriMap = ({
     if (initialData?.webMapId && mapView) {
       const webMap = new WebMap({
         portalItem: {
-          id: initialData?.webMapId,
+          id: initialData.webMapId,
         },
       });
       mapView.map = webMap;
@@ -329,13 +329,7 @@ const EsriMap = ({
       mapView.map = map;
       setWebMap(null);
     }
-  }, [
-    globalMapSettings.tile_provider,
-    initialData?.webMapId,
-    layers,
-    map,
-    mapView,
-  ]);
+  }, [initialData?.webMapId, layers, map, mapView]);
 
   return (
     <>
diff --git a/front/app/components/EsriMap/utils.tsx b/front/app/components/EsriMap/utils.tsx
index 00e79cff7706..24f32ca29300 100644
--- a/front/app/components/EsriMap/utils.tsx
+++ b/front/app/components/EsriMap/utils.tsx
@@ -397,14 +397,17 @@ export const createEsriFeatureLayers = (
           esriLayers.push(
             new FeatureLayer({
               url: `${layer.layer_url}/${i + 1}`,
-              id: 'internal',
+              id: `${layer.layer_url}_internal`,
             })
           );
         }
       } else {
         // Otherwise, just add the single feature layer
         esriLayers.push(
-          new FeatureLayer({ url: layer.layer_url, id: 'internal' })
+          new FeatureLayer({
+            url: layer.layer_url,
+            id: `${layer.layer_url}_internal`,
+          })
         );
       }
     }

From 702cccb6496c653622e94dfb2b99519ab3804dff Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 28 Feb 2024 14:01:51 +0100
Subject: [PATCH 050/282] Minor tweaks

---
 front/app/components/EsriMap/index.tsx         | 17 +++++++++--------
 front/app/components/EsriMap/utils.tsx         |  2 --
 .../IdeasMap/IdeasAtLocationPopup.tsx          |  2 +-
 .../EsriImportOptions.tsx                      | 18 +++++++-----------
 .../FeatureLayerUpload.tsx                     |  4 ++--
 .../MapLayersList.tsx                          |  2 +-
 .../ProjectCustomMapConfigPage/messages.ts     |  8 ++++----
 .../Admin/tools/Esri/EsriKeyInput.tsx          | 18 +++++++++++++-----
 front/app/containers/Admin/tools/messages.ts   |  4 ++--
 front/app/containers/App/index.tsx             |  8 --------
 10 files changed, 39 insertions(+), 44 deletions(-)

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index 6767ee5c1924..a6288ccb3782 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -26,6 +26,7 @@ import { isNil } from 'utils/helperUtils';
 import { debounce } from 'lodash-es';
 import styled from 'styled-components';
 import * as intl from '@arcgis/core/intl.js';
+import esriConfig from '@arcgis/core/config';
 
 // typings
 import { EsriUiElement } from './types';
@@ -93,6 +94,7 @@ const EsriMap = ({
 }: EsriMapProps) => {
   const locale = useLocale();
   const isMobileOrSmaller = useBreakpoint('phone');
+  const { data: appConfig } = useAppConfiguration();
   const [map, setMap] = useState<Map | null>(null);
   const [webMap, setWebMap] = useState<WebMap | null>(null);
   const [mapView, setMapView] = useState<MapView | null>(null);
@@ -104,6 +106,13 @@ const EsriMap = ({
   // Sets the locale of the map
   intl.setLocale(locale);
 
+  // Set Esri API key
+  const esriApiKey =
+    appConfig?.data.attributes.settings.esri_integration?.api_key;
+  if (esriApiKey) {
+    esriConfig.apiKey = esriApiKey;
+  }
+
   // On initial render, create a new map and map view and save them to state variables
   useEffect(() => {
     if (mapRef.current) {
@@ -236,14 +245,6 @@ const EsriMap = ({
     // Handle when we're using a webmap
     webMap?.when(() => {
       if (webMap && layers) {
-        // Remove any layers not created by the Web Map
-        const layersToRemove = webMap?.layers?.filter((layer) =>
-          layer?.id?.includes('internal')
-        );
-        if (layersToRemove && layersToRemove?.toArray()?.length > 0) {
-          webMap.removeMany(layersToRemove.toArray());
-        }
-
         // If there are any Web Map reference layers, re-order so they are below other layers created in our application
         if (referenceLayers && referenceLayers.length > 0) {
           const newBasemapLayers = webMap.basemap.baseLayers;
diff --git a/front/app/components/EsriMap/utils.tsx b/front/app/components/EsriMap/utils.tsx
index edb010cb78f3..b8140fa73cf9 100644
--- a/front/app/components/EsriMap/utils.tsx
+++ b/front/app/components/EsriMap/utils.tsx
@@ -397,7 +397,6 @@ export const createEsriFeatureLayers = (
           esriLayers.push(
             new FeatureLayer({
               url: `${layer.layer_url}/${i + 1}`,
-              id: `${layer.layer_url}_internal`,
             })
           );
         }
@@ -406,7 +405,6 @@ export const createEsriFeatureLayers = (
         esriLayers.push(
           new FeatureLayer({
             url: layer.layer_url,
-            id: `${layer.layer_url}_internal`,
           })
         );
       }
diff --git a/front/app/components/IdeasMap/IdeasAtLocationPopup.tsx b/front/app/components/IdeasMap/IdeasAtLocationPopup.tsx
index ac0286a6f739..4a2933bf79a8 100644
--- a/front/app/components/IdeasMap/IdeasAtLocationPopup.tsx
+++ b/front/app/components/IdeasMap/IdeasAtLocationPopup.tsx
@@ -37,7 +37,7 @@ const IdeasAtLocationPopup = ({
       {ideas.map((idea) => (
         <Button
           key={idea.id}
-          width="100%"
+          width="fit-content"
           mb="12px"
           onClick={() => {
             setSelectedIdea(idea.id);
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
index c1b6f561b203..3b970cb620a6 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
@@ -34,6 +34,11 @@ const EsriImportOptions = memo<Props>(({ setView, mapConfig }) => {
     mapConfig?.data?.attributes?.esri_web_map_id
   );
 
+  const webMapUploadDisabled =
+    hasExistingWebMap ||
+    layerType === 'CustomMaps::GeojsonLayer' ||
+    !isEsriIntegrationEnabled;
+
   const getWebMapDisabledMessage = () => {
     if (!isEsriIntegrationEnabled) {
       return formatMessage(messages.esriAddOnFeatureTooltip);
@@ -83,12 +88,7 @@ const EsriImportOptions = memo<Props>(({ setView, mapConfig }) => {
           placement="top"
           content={getWebMapDisabledMessage()}
           hideOnClick={true}
-          disabled={
-            (!hasExistingWebMap &&
-              layerType === 'CustomMaps::EsriFeatureLayer') ||
-            layerType !== 'CustomMaps::GeojsonLayer' ||
-            !isEsriIntegrationEnabled
-          }
+          disabled={!webMapUploadDisabled}
         >
           <div>
             <Button
@@ -97,11 +97,7 @@ const EsriImportOptions = memo<Props>(({ setView, mapConfig }) => {
               onClick={() => {
                 setView('webMapUpload');
               }}
-              disabled={
-                hasExistingWebMap ||
-                layerType === 'CustomMaps::GeojsonLayer' ||
-                !isEsriIntegrationEnabled
-              }
+              disabled={webMapUploadDisabled}
             >
               {formatMessage(messages.importEsriWebMap)}
             </Button>
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
index 95207f84bdc2..4e47f30299b2 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
@@ -63,7 +63,7 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
       .then((response) => {
         setImportError(false);
 
-        const { serviceDescription } = response;
+        const { serviceDescription, serviceItemId } = response;
         const subLayerCount = response.layers.length;
 
         // Add the new map layer
@@ -75,7 +75,7 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
               layer_url: url,
               id: mapConfigId,
               title_multiloc: getFeatureLayerInitialTitleMultiloc(
-                serviceDescription,
+                serviceDescription || serviceItemId,
                 tenantLocales,
                 subLayerCount
               ),
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
index 702a0ccc8a7d..116de44bb3b6 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
@@ -290,7 +290,7 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
 
         {mapConfig?.data?.id && (
           <>
-            {isEsriIntegrationEnabled && (
+            {isEsriIntegrationEnabled && ( // TODO: Remove hiding of buttons once Esri integration is released + internal training done
               <EsriImportOptions
                 projectId={projectId}
                 setView={setView}
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
index d6cdfa944073..a4a916e4bea4 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
@@ -207,9 +207,9 @@ export default defineMessages({
       'An authentication error occured while trying to fetch this layer. Please check the URL and that your Esri API key has access to this layer.',
   },
   generalApiError: {
-    id: 'app.components.admin.PostManager.generalApiError',
+    id: 'app.components.admin.PostManager.generalApiError2',
     defaultMessage:
-      'An error occured while trying to fetch this layer. Please check that the URL is correct.',
+      'An error occured while trying to fetch this item. Please check that the URL or Portal ID is correct and you have access to this item.',
   },
   defaultEsriError: {
     id: 'app.components.admin.PostManager.defaultEsriError',
@@ -251,9 +251,9 @@ export default defineMessages({
       'You can only add one Web Map at a time. Remove the current one to import a different one.',
   },
   geojsonRemoveEsriTooltip: {
-    id: 'app.components.admin.PostManager.geojsonRemoveEsriTooltip',
+    id: 'app.components.admin.PostManager.geojsonRemoveEsriTooltip2',
     defaultMessage:
-      'You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current ArcGIS layers if you wish to upload a GeoJSON layer.',
+      'You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any ArcGIS data if you wish to upload a GeoJSON layer.',
   },
   addWebMap: {
     id: 'app.components.admin.PostManager.addWebMap',
diff --git a/front/app/containers/Admin/tools/Esri/EsriKeyInput.tsx b/front/app/containers/Admin/tools/Esri/EsriKeyInput.tsx
index 470de0bb39ba..8c36cf965b70 100644
--- a/front/app/containers/Admin/tools/Esri/EsriKeyInput.tsx
+++ b/front/app/containers/Admin/tools/Esri/EsriKeyInput.tsx
@@ -18,6 +18,7 @@ import useFeatureFlag from 'hooks/useFeatureFlag';
 
 // utils
 import clHistory from 'utils/cl-router/history';
+import { invalidateQueryCache } from 'utils/cl-react-query/resetQueryCache';
 
 // intl
 import { useIntl } from 'utils/cl-intl';
@@ -38,13 +39,20 @@ const EsriKeyInput = () => {
   } = useUpdateAppConfiguration();
 
   const saveApiKey = () => {
-    updateAppConfiguration({
-      settings: {
-        esri_integration: {
-          api_key: apiKey,
+    updateAppConfiguration(
+      {
+        settings: {
+          esri_integration: {
+            api_key: apiKey,
+          },
         },
       },
-    });
+      {
+        onSuccess: () => {
+          invalidateQueryCache();
+        },
+      }
+    );
   };
 
   return (
diff --git a/front/app/containers/Admin/tools/messages.ts b/front/app/containers/Admin/tools/messages.ts
index e2262093acec..ef7ac73e9e6e 100644
--- a/front/app/containers/Admin/tools/messages.ts
+++ b/front/app/containers/Admin/tools/messages.ts
@@ -97,9 +97,9 @@ export default defineMessages({
     defaultMessage: 'Esri integration',
   },
   esriIntegrationDescription: {
-    id: 'app.containers.Admin.tools.esriIntegrationDescription2',
+    id: 'app.containers.Admin.tools.esriIntegrationDescription3',
     defaultMessage:
-      'Connect your Esri account and import your layers from ArcGIS Online directly into your mapping projects.',
+      'Connect your Esri account and import data from ArcGIS Online directly into your mapping projects.',
   },
   esriIntegrationButton: {
     id: 'app.containers.Admin.tools.esriIntegrationButton',
diff --git a/front/app/containers/App/index.tsx b/front/app/containers/App/index.tsx
index b6a4262d8226..b50c86222cc5 100644
--- a/front/app/containers/App/index.tsx
+++ b/front/app/containers/App/index.tsx
@@ -38,7 +38,6 @@ import MainHeader from 'containers/MainHeader';
 import Meta from './Meta';
 const UserDeletedModal = lazy(() => import('./UserDeletedModal'));
 const PlatformFooter = lazy(() => import('containers/PlatformFooter'));
-import esriConfig from '@arcgis/core/config';
 
 // auth
 import HasPermission from 'components/HasPermission';
@@ -125,13 +124,6 @@ const App = ({ children }: Props) => {
         script.src = 'https://cdn.weglot.com/weglot.min.js';
       }
 
-      // Set Esri API key
-      const esriApiKey =
-        appConfiguration.data.attributes.settings.esri_integration?.api_key;
-      if (esriApiKey) {
-        esriConfig.apiKey = esriApiKey;
-      }
-
       if (
         appConfiguration.data.attributes.style &&
         appConfiguration.data.attributes.style.customFontAdobeId

From 8fec066d073daf0384183792430532a84ce41112 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Wed, 28 Feb 2024 13:04:51 +0000
Subject: [PATCH 051/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/ar-SA.json   | 1 -
 front/app/translations/admin/da-DK.json   | 1 -
 front/app/translations/admin/de-DE.json   | 1 -
 front/app/translations/admin/en-CA.json   | 1 -
 front/app/translations/admin/en-GB.json   | 1 -
 front/app/translations/admin/en.json      | 6 +++---
 front/app/translations/admin/es-CL.json   | 1 -
 front/app/translations/admin/es-ES.json   | 1 -
 front/app/translations/admin/fi-FI.json   | 1 -
 front/app/translations/admin/fr-BE.json   | 1 -
 front/app/translations/admin/fr-FR.json   | 1 -
 front/app/translations/admin/hr-HR.json   | 1 -
 front/app/translations/admin/lv-LV.json   | 1 -
 front/app/translations/admin/nb-NO.json   | 1 -
 front/app/translations/admin/nl-BE.json   | 1 -
 front/app/translations/admin/nl-NL.json   | 1 -
 front/app/translations/admin/pl-PL.json   | 1 -
 front/app/translations/admin/pt-BR.json   | 1 -
 front/app/translations/admin/sr-Latn.json | 1 -
 front/app/translations/admin/sr-SP.json   | 1 -
 front/app/translations/admin/sv-SE.json   | 1 -
 front/app/translations/admin/tr-TR.json   | 1 -
 22 files changed, 3 insertions(+), 24 deletions(-)

diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index acac74cf9396..230ac301653a 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "يعد تكامل Esri ميزة إضافية. اتصل بمدير GovSuccess الخاص بك إذا كنت تريد المزيد من المعلومات حول هذا الأمر.",
   "app.containers.Admin.tools.esriIntegration2": "التكامل إسري",
   "app.containers.Admin.tools.esriIntegrationButton": "تمكين إزري",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "قم بتوصيل حساب Esri الخاص بك واستورد طبقاتك من ArcGIS Online مباشرة إلى مشاريع رسم الخرائط الخاصة بك.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "شعار إسري",
   "app.containers.Admin.tools.esriKeyInputDescription": "أضف مفتاح Esri API الخاص بك للسماح باستيراد طبقات الخريطة من ArcGIS Online في علامات تبويب الخريطة في المشروعات.",
   "app.containers.Admin.tools.esriKeyInputLabel": "مفتاح Esri API",
diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 1e00c8276228..e2de18cb27d3 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "Esri-integrationen er en add-on-funktion. Kontakt Søren Kielgast (soren@citizenlab.dk), hvis du vil have flere oplysninger om dette.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Aktivér Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Forbind din Esri-konto og importer dine lag fra ArcGIS Online direkte til dine kortlægningsprojekter.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Tilføj din Esri API-nøgle for at tillade import af dine kortlag fra ArcGIS Online i kortfanerne i projekter.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API-nøgle",
diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index a1c78ee2ed8d..4a281ea36390 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "Die Esri-Integration ist eine Zusatzfunktion. Wenden Sie sich an Ihre Kundenbetreuerin, wenn Sie weitere Informationen dazu wünschen.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-Integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Esri aktivieren",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Verbinden Sie Ihr Esri-Konto und importieren Sie Ihre Layer aus ArcGIS Online direkt in Ihre Kartierungsprojekte.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-Logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Fügen Sie Ihren Esri API-Schlüssel hinzu, um den Import Ihrer Kartenebenen aus ArcGIS Online in die Kartenregisterkarten in Projekten zu ermöglichen.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API-Schlüssel",
diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index 23e03f9c3dd5..c9477da14277 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "The Esri integration is an add-on feature. Contact your GovSuccess Manager if you want more information on this.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Enable Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Connect your Esri account and import your layers from ArcGIS Online directly into your mapping projects.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Add your Esri API key to allow importing your map layers from ArcGIS Online in the map tabs in projects.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API key",
diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index 091c265488d9..8a6e33fae196 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "The Esri integration is an add-on feature. Contact your GovSuccess Manager if you want more information on this.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Enable Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Connect your Esri account and import your layers from ArcGIS Online directly into your mapping projects.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Add your Esri API key to allow importing your map layers from ArcGIS Online in the map tabs in projects.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API key",
diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 038bb26dbd69..8386e64e43a8 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -163,8 +163,8 @@
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Explain this status change",
   "app.components.admin.PostManager.fileUploadError": "One or more files failed to upload. Please check the file size and format and try again.",
   "app.components.admin.PostManager.formTitle": "Edit idea",
-  "app.components.admin.PostManager.generalApiError": "An error occured while trying to fetch this layer. Please check that the URL is correct.",
-  "app.components.admin.PostManager.geojsonRemoveEsriTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current ArcGIS layers if you wish to upload a GeoJSON layer.",
+  "app.components.admin.PostManager.generalApiError2": "An error occured while trying to fetch this item. Please check that the URL or Portal ID is correct and you have access to this item.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any ArcGIS data if you wish to upload a GeoJSON layer.",
   "app.components.admin.PostManager.goToDefaultMapView": "Go to default map center",
   "app.components.admin.PostManager.hiddenFieldsLink": "hidden fields",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
@@ -920,7 +920,7 @@
   "app.containers.Admin.tools.esriDisabled": "The Esri integration is an add-on feature. Contact your GovSuccess Manager if you want more information on this.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Enable Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Connect your Esri account and import your layers from ArcGIS Online directly into your mapping projects.",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Connect your Esri account and import data from ArcGIS Online directly into your mapping projects.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Add your Esri API key to allow importing your map layers from ArcGIS Online in the map tabs in projects.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API key",
diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index 0a4156d3720d..2ded302cc68a 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "La integración con Esri es una función adicional. Ponte en contacto con tu Gestor de GovSuccess si deseas más información al respecto.",
   "app.containers.Admin.tools.esriIntegration2": "Integración con Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Activar Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Conecta tu cuenta Esri e importa tus capas de ArcGIS Online directamente a tus proyectos cartográficos.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logotipo de Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Añade tu clave API de Esri para poder importar tus capas de mapas desde ArcGIS Online en las pestañas de mapas de los proyectos.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Clave API de Esri",
diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index 07819c5917c8..023358c41421 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "La integración con Esri es una función adicional. Ponte en contacto con tu Gestor de GovSuccess si deseas más información al respecto.",
   "app.containers.Admin.tools.esriIntegration2": "Integración con Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Activar Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Conecta tu cuenta Esri e importa tus capas de ArcGIS Online directamente a tus proyectos cartográficos.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logotipo de Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Añade tu clave API de Esri para poder importar tus capas de mapas desde ArcGIS Online en las pestañas de mapas de los proyectos.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Clave API de Esri",
diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index 7acacac3b20e..3c57abfadf12 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "Esri-integraatio on lisäominaisuus. Ota yhteyttä GovSuccess Manageriin, jos haluat lisätietoja tästä.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-integraatio",
   "app.containers.Admin.tools.esriIntegrationButton": "Ota Esri käyttöön",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Yhdistä Esri-tilisi ja tuo tasosi ArcGIS Onlinesta suoraan karttaprojekteihisi.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Lisää Esri API -avain salliaksesi karttatasosi tuomisen ArcGIS Onlinesta projektien karttavälilehdillä.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API avain",
diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index be6ccb3bf35e..6ed2bf764cc3 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "L'intégration Esri est un add-on. Contactez votre responsable GovSuccess si vous souhaitez plus d'informations à ce sujet.",
   "app.containers.Admin.tools.esriIntegration2": "Intégration Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Activer Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Connectez votre compte Esri et importez vos couches cartographiques depuis ArcGIS Online directement dans vos projets.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logo Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Ajoutez votre clé API Esri pour permettre l'importation de vos couches cartographiques depuis ArcGIS Online depuis l'onglet \"Carte\" de vos projets.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Clé API Esri",
diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index 3fc5df3b9edc..a5e60dc05b51 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "L'intégration Esri est un add-on. Contactez votre responsable GovSuccess si vous souhaitez plus d'informations à ce sujet.",
   "app.containers.Admin.tools.esriIntegration2": "Intégration Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Activer Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Connectez votre compte Esri et importez vos couches cartographiques depuis ArcGIS Online directement dans vos projets.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logo Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Ajoutez votre clé API Esri pour permettre l'importation de vos couches cartographiques depuis ArcGIS Online depuis l'onglet \"Carte\" de vos projets.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Clé API Esri",
diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index 79ee2e76e3e9..7d16162e04d8 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "Esri integracija je dodatna značajka. Kontaktirajte svog GovSuccess Managera ako želite više informacija o ovome.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integracija",
   "app.containers.Admin.tools.esriIntegrationButton": "Omogućite Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Povežite svoj Esri račun i uvezite svoje slojeve iz ArcGIS Online izravno u svoje projekte mapiranja.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Dodajte svoj Esri API ključ kako biste omogućili uvoz slojeva karte iz ArcGIS Online u kartice karte u projektima.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API ključ",
diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 1d6972ff00e5..8e3ff2b14898 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "Esri integrācija ir papildfunkcija. Sazinieties ar savu GovSuccess menedžeri, ja vēlaties saņemt vairāk informācijas par to.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integrācija",
   "app.containers.Admin.tools.esriIntegrationButton": "Iespējot Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Pievienojiet savu Esri kontu un importējiet slāņus no ArcGIS Online tieši savos kartēšanas projektos.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logotips",
   "app.containers.Admin.tools.esriKeyInputDescription": "Pievienojiet savu Esri API atslēgu, lai varētu importēt kartes slāņus no ArcGIS Online projektu karšu cilnēs.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API atslēga",
diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index e356442dce3f..dd4ddc730eab 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "Esri-integrasjonen er en tilleggsfunksjon. Kontakt din GovSuccess Manager hvis du ønsker mer informasjon om dette.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-integrasjon",
   "app.containers.Admin.tools.esriIntegrationButton": "Aktiver Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Koble til Esri-kontoen din og importer lagene dine fra ArcGIS Online direkte til kartprosjektene dine.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Legg til Esri API-nøkkelen for å tillate import av kartlagene fra ArcGIS Online i kartfanene i prosjekter.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API-nøkkel",
diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index f927f9517a0e..d28ddff23672 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "De Esri-integratie is een add-on functie. Neem contact op met je Government Success Manager als je hier meer informatie over wilt.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-integratie",
   "app.containers.Admin.tools.esriIntegrationButton": "Esri inschakelen",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Maak verbinding met je Esri-account en importeer je lagen vanuit ArcGIS Online rechtstreeks in je kaartprojecten.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Voeg je Esri API-sleutel toe om het importeren van je kaartlagen uit ArcGIS Online in de kaarttabbladen in projecten mogelijk te maken.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API-sleutel",
diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index df7e2652511c..1d5bca2a680e 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "De Esri-integratie is een add-on functie. Neem contact op met je Government Success Manager als je hier meer informatie over wilt.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-integratie",
   "app.containers.Admin.tools.esriIntegrationButton": "Esri inschakelen",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Maak verbinding met je Esri-account en importeer je lagen vanuit ArcGIS Online rechtstreeks in je kaartprojecten.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Voeg je Esri API-sleutel toe om het importeren van je kaartlagen uit ArcGIS Online in de kaarttabbladen in projecten mogelijk te maken.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API-sleutel",
diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index ad111528d604..f49eded32887 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "Integracja z Esri jest funkcją dodatkową. Skontaktuj się ze swoim GovSuccess Managerem, jeśli chcesz uzyskać więcej informacji na ten temat.",
   "app.containers.Admin.tools.esriIntegration2": "Integracja z Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Włącz Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Połącz swoje konto Esri i importuj warstwy z ArcGIS Online bezpośrednio do swoich projektów mapowania.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logo Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Dodaj swój klucz API Esri, aby umożliwić importowanie warstw map z ArcGIS Online w zakładkach map w projektach.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Klucz API Esri",
diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index 546d58a5e9b5..cae3f4d39b38 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "A integração com o Esri é um recurso complementar. Entre em contato com o seu gerente do GovSuccess se você quiser obter mais informações sobre isso.",
   "app.containers.Admin.tools.esriIntegration2": "Integração com o Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Habilitar Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Conecte sua conta Esri e importe suas camadas do ArcGIS Online diretamente para seus projetos de mapeamento.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logotipo da Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Adicione sua chave Esri API para permitir a importação de suas camadas de mapa do ArcGIS Online nas guias de mapa em projetos.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Chave da API da Esri",
diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index 5fbb762f6b14..6dd203ca022c 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "The Esri integration is an add-on feature. Contact your GovSuccess Manager if you want more information on this.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Enable Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Connect your Esri account and import your layers from ArcGIS Online directly into your mapping projects.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Add your Esri API key to allow importing your map layers from ArcGIS Online in the map tabs in projects.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API key",
diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index 7c7bdb6b2132..5380f6fca98f 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "The Esri integration is an add-on feature. Contact your GovSuccess Manager if you want more information on this.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Enable Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Connect your Esri account and import your layers from ArcGIS Online directly into your mapping projects.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Add your Esri API key to allow importing your map layers from ArcGIS Online in the map tabs in projects.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API key",
diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index dcbc349e12be..d1ea9355e949 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "Integrationen med Esri är en tilläggsfunktion. Kontakta din GovSuccess Manager om du vill ha mer information om detta.",
   "app.containers.Admin.tools.esriIntegration2": "Integration med Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Aktivera Esri",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Anslut ditt Esri-konto och importera dina lager från ArcGIS Online direkt till dina mappningsprojekt.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-logotyp",
   "app.containers.Admin.tools.esriKeyInputDescription": "Lägg till din Esri API-nyckel för att kunna importera dina kartlager från ArcGIS Online i kartflikarna i projekt.",
   "app.containers.Admin.tools.esriKeyInputLabel": "API-nyckel för Esri",
diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index 406f3efbe414..a2aa515ed4e9 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -897,7 +897,6 @@
   "app.containers.Admin.tools.esriDisabled": "Esri entegrasyonu bir eklenti özelliğidir. Bu konuda daha fazla bilgi almak istiyorsanız GovSuccess Yöneticinizle iletişime geçin.",
   "app.containers.Admin.tools.esriIntegration2": "Esri entegrasyonu",
   "app.containers.Admin.tools.esriIntegrationButton": "Esri'yi Etkinleştir",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "Esri hesabınızı bağlayın ve katmanlarınızı ArcGIS Online'dan doğrudan haritalama projelerinize aktarın.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logosu",
   "app.containers.Admin.tools.esriKeyInputDescription": "Projelerdeki harita sekmelerinde ArcGIS Online'dan harita katmanlarınızı içe aktarmaya izin vermek için Esri API anahtarınızı ekleyin.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API anahtarı",

From 1a917505d79fabad63b907520cb3b5fe977fbd3f Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 28 Feb 2024 14:17:48 +0100
Subject: [PATCH 052/282] Add screenshots to tooltips

---
 .../FeatureLayerUpload.tsx                       |  10 +++++++++-
 .../ProjectCustomMapConfigPage/WebMapUpload.tsx  |  13 ++++++++++++-
 .../images/esri_feature_url_example.png          | Bin 0 -> 7025 bytes
 .../images/esri_portal_id_example.png            | Bin 0 -> 8689 bytes
 4 files changed, 21 insertions(+), 2 deletions(-)
 create mode 100644 front/app/containers/Admin/ProjectCustomMapConfigPage/images/esri_feature_url_example.png
 create mode 100644 front/app/containers/Admin/ProjectCustomMapConfigPage/images/esri_portal_id_example.png

diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
index 4e47f30299b2..7b3baa2ab2d9 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
@@ -15,6 +15,7 @@ import {
   Button,
   Success,
 } from '@citizenlab/cl2-component-library';
+import tooltipImage from './images/esri_feature_url_example.png';
 
 // types
 import { ViewOptions } from '.';
@@ -130,7 +131,14 @@ const FeatureLayerUpload = ({ projectId, mapConfigId, setView }: Props) => {
         </Title>
         <IconTooltip
           mb="4px"
-          content={formatMessage(messages.featureLayerTooltop)}
+          content={
+            <>
+              <Box mb="8px">
+                <img src={tooltipImage} alt="" width="100%" />
+              </Box>
+              {formatMessage(messages.featureLayerTooltop)}
+            </>
+          }
         />
       </Box>
       <Text my="8px" color={'grey800'}>
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx
index 106f80434082..9b80e01c172a 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx
@@ -15,6 +15,7 @@ import {
   Button,
   Success,
 } from '@citizenlab/cl2-component-library';
+import tooltipImage from './images/esri_portal_id_example.png';
 
 // types
 import { ViewOptions } from '.';
@@ -111,7 +112,17 @@ const WebMapUpload = ({ projectId, mapConfigId, setView }: Props) => {
         <Title my="4px" variant="h5" color={'coolGrey600'} fontWeight="bold">
           {formatMessage(messages.addWebMap)}
         </Title>
-        <IconTooltip mb="4px" content={formatMessage(messages.webMapTooltip)} />
+        <IconTooltip
+          mb="4px"
+          content={
+            <>
+              <Box mb="8px">
+                <img src={tooltipImage} alt="" width="100%" />
+              </Box>
+              {formatMessage(messages.webMapTooltip)}
+            </>
+          }
+        />
       </Box>
       <Text my="8px" color={'grey800'}>
         {formatMessage(messages.addWebMapInstruction)}
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/images/esri_feature_url_example.png b/front/app/containers/Admin/ProjectCustomMapConfigPage/images/esri_feature_url_example.png
new file mode 100644
index 0000000000000000000000000000000000000000..83584d8b12cccb1d6ccef5b336a50d67b0fb61a6
GIT binary patch
literal 7025
zcmdT}cQn=U-@m0qW|S2QMKZf?_9!zWO0v85%*fuG%1#IoNjBLbn`D!fy+hWuxm@FU
zJLmVD^Zfbz^_=rKd|lT)?&te{zuvFc>-`e^L|KmHGTmha0zo4GNLm$vIOhqELkaNV
zYIuox3cg)%kd#*=fDcas<G1iLt)q;l<1<@RM;8No6NH(Kt+ff4gOR<7iH(D~t>Zdg
zojAOR_3TAb_9h077PdAw)hw({5VkfBH<5xjO-&4MB6*RhoA*${yznVFAOC&;fuQS^
zmwu?`nzT0I=Bc!Q(y}?E#7`mr_BQi{BI$y+S(cQ#8n)CwDP-QgWVb0B{jxLb{B)q~
zLRn}`>0>(Fu)^<`+26mGU2q~~m%L6`^i!GdQ$pv_Nh{ByffB{jrmx+L2d=K7oi5#;
zJ^M*X)jj*3Jub>9s?cVCa>=)B$$xrD$R!CjT^~&oF$F68f4K^Z{5S`vzEi#3Ez(>o
z;DQ-9jAQp)m%ru56X<F<!Bb5%CE>6@yt%n~v^QoOnWja`A|)(I@Vuk5(|B{Xd1rm<
zw6=qljjhCKMLp3zw7KzTFlD9t?%jL$?&;RJ?><HCrpiM>)HwL~qE#f0V>I-<Vl$K7
zmuoxTym?dNbL!1W75e<3Et)M`yX>yGxOnyM9~~?fE1JV9akYwMDU6oy^~d`!k)GHM
z!?>kC`PT#RNxnSGR94VhpRB2LSd7>j9UP2pkLBpk)8hN`<x7@oddSw~Ym)1lMTQqS
zG`^K;lmwCAjZH|9*VWa{Zeskb5PMfGPctekjF=8({yAoStUPjK;}xR1x|&hmV=Yx_
zXCv*)m$#vzEZp1??9VcOmzb$U+>q#Qjbdr*>T+`24kTBJUtP7Dot^zRR$lOYIBwy!
zwX3V3$3EscdU1Z<ZlRO*Bg*1@{mxQ<TSo_8y)iN>DM`uGQ#6#Chn1Z@c&ywOkJsnK
zvpYqC%(p>bf9GGXv6&g(yOflkKtf91#IC)O=~E5X^HXDEiE!hpC8m%4{rz1xo2e6o
zo$i{JBy=STi2QH^z&*0D;VvpFl9rRBq^CcsPq7^>WzSUpq$+t_?}vwa`G=T|jV;k+
z=-UfLef^sOm&g`&hx9U?R{n76d?)sO_l~@;uMZ*Uyh`J=JTUV+RSJ<L>=c4eLic%a
zRNza8^fYz4WYFac`1tlSjThwvWC%7dWb0NU;qPQv^k?v|$D(3O-i3w|F)=YI2u_J5
zITWPHMZW*|QNhrVIXF0Yb+nAA22FM~Nic#z1iyZ!=}mA*$Shz3@ijgD+DPr2=cbt^
zAC*{(OG+%pzUQYUG6%Z)o1^H?<Kf-NiTJ>!Q*79Ld3hi^AUBs|Fy}dk^NZfz-ipe~
zk!p=1Lm5sgqRPt3@gGj1mV-Gn>+33}rmUGNDXd83R_dr`405Qcr=w$TF~!HU@2mXZ
z`T5==BRM$%c><=qfvl%^z6G_1Im44;54IP&<dv1xO?T;q>;q$BuFfArSsaBK!mkV9
z-$bEepw!RuweJIRRwpsYE7%mD6QQW6C}~;QK7fVz(S{Vlv@_n|zM>ofQ+o)&sJOV8
zfP{q0IYIf8@XYdZ`*@{8f`BdK8&Za1x*QAW51Vq*lVyU-mzg;@R-%X(eHq?3qUgGA
zpuYirO0CDJYS2B{&AFxFB9`OB-4c!dK=MY6_IE4!jt^Yc?JZ%nX-88dBMICueq7a&
zgR<nC;tL50-E&%2!}0HMJFm=mxVma~W!4R?*PTZ6n*Z$Y?_a11xyGSd<!lWoq7i&`
z^X1UDdBEnL<wqc^)#0WBtrFHLpHnfa(DYWcr@Ol_qReveZc(!H+Gx?sA#T&2<gO$k
zhgZ(rCHt{K<R-cnrW0Ag6MZ{D)M$M;W1dcV1ZJX2r^bwzMzh$M(9h3rAYW&{)`^5c
zI3`u<O|j>}ma5p4Bmom<_m;%&R%EfxG(a-(<QNwnAKyAsVrDV%<Nmd~YSU0FtMQ5`
z#W?PJ)}y7WgY%1va#OWl@=8j#L`BD!IXVvx4gjJ#tvv@g+#CjD6SsB+rXc)9iz3WD
zD2sl7#^cT;A<7!GO1eU<`JX)68{Sx^+S=OmZyZSE`-v(SK94=Ch3-$eN>BS%cB^ri
zDj9Fn#y~=p?c_N37&A;ZUHJTDOD!Q&peu81up1Um%_v6b$rSj6@c;g5=Arhbe`)n;
zIJxBT<ASC^hKUPRg-RAi<v&&_u!yzMGO4uQ&%NfW&(p~zMR`GlnhpJ$PD@^D3i~ev
zyl~F%vGH4<o%Js%naH7(d@Ipuj1>AoX!3r7VsvDL*38UoX@-c2zTL1$5T5<;qUta5
zD@!1`NnB^&6-k2FclFf&xxT$rxI1v)QfWeQI_!8=)N7)*%k3sIUzUJLVFttgKJ#SI
z-;)USF*YaWm^Q;#0jOS@5JP(CAyu<c2IpwEHxa_#-UuR}73X|5su|=i-w|UHiQ1?;
zSh!BgDB2o-&xmo}l5zC(WM3jjE!)4Yu1@s>aN*wCn8j3W4W16`39&O~TplQPz9Y`X
z@fl;Nki!D`)vMAlRP+-uEjgU~<BE#z*atwdMlBI#cX697Hx3RKQy3_)pg|~$zCd6g
z@jWLINm*HZc!pEElmM7fPGHebx6=ONC*_vy9*NTjDOJvEbjP^;mZl~=M9D~4W+q!|
zYN{h<9B6m>DsCj2O$F(`W6sRNLW?pdN8t9>jP_PX)H@QoOt-eTwW^%+Rh>7c9|Cjz
zDtkHf%E2KGCQZG?)yj%f#0B%Sxw+Z22K0!tSWN0Qu>p2t=4hVBr^u~9r`(1UT^)b-
zc@E;D#0pQ{(R)yrQf)5aRbm=mgsts5^9m!MDe=S)Cl*f5PScdw4C}^^O?W;q{{ME}
z(O$dH(>Vd&gSi@W%gcwYLq6CI15YonZ1lw8L&dhXw(8Aa*CRcTWq^ObsHQ8BYL&BG
zxNw2j@!xNW7sGf~BgH{b>(f*oddo8H+|NHiy4l&;J$HKLq-A7!(-o-`d*YQ?7kW}u
znqHISx2Jeugc5(_)_qPpCTl!mhqSb`VCJF;DOrCP8c5kYI2`;-i_Fq2Vm2@^Xtx*h
z*!!wcfF`RJ+jrQUmH8EUqo>fIiGYZx$rxD#1kb9R)Cy#zxVv5Fk|L(OPdapU4{Q7H
zv1^=zYs`m`<xCSBpoH#EB08}q#>Rm5ERBL>sZq58w3w%-Cw;Mv+$$%i+bGmPZ<nh+
zet_S4EiNJs?cT<{dw|9MhQnv5q(mrZ&Sj=}7i-C8_Fti)c?2K9PS^HULFQwM|6>D^
zI01W-D}VBZypJkgjQU7O9BtrnX_r1x=I-w9-dP!ngf>MbC!c7JZt$Mr_!v*{6^3e8
zTz<ZhD<D8eLpbuN)VN4f^M@n*B{IgpaAMKpoql3QQ5t~Sq}TonZglnAW<!IXWHFTa
zZ(lGl2K<S%;+}#CB5H19c;h5NJOBFn2emL3TU%QjJ3GeH^?nyFUE)}gS5TOpZU~?u
z#<v{$)^**s+AlJaj4Cv!e9Ai!n0LF8i06)VM_b#>Y;!2Tfy27|bY}wJ&z2U4l|NjF
zAI@v-p**z&^`Ass9w{mP{nwi&C?qtqxY#0bdZ2Q2bc7f#G{B4F(ZkmVR<7P^=kVO0
zZ~;r9vzzk=oP)YL6^m?`{z7NM*&xN~dD9|5qH><+4%c`HXy;S$@bDb&uNNHkWoBfY
zDfW)Ln6k2R_0d*``r1_4OKP~YCUev*2Gjkrphot|lXqP`?a+GDF1lJAM&$FfpDP|d
z@n^T~g?4YvLj7}Bu3Y)&D183>c^VOCPB_&9oPGLlTQp*zKriKC0RGI%3Q;}4RjbZh
zj4m9XjEw9{TAEg=`4!MRaTq)Bp>Ou5d{Tb?{E5S?e~Bny5OFT_K6Zx*wX?TB^NrHd
z(uj*v+=PULNuq8P&>R?*vw=Q$?wtDAK&68jzxC+Pe4TOvGO|q2<e$HO*<;3q!em)s
z{?cAlIjgUnoZ!~o781-hHa2duumpfd+-RoOyR%LPf(I7haAygxzM$@;z2%0FlBA?$
z)R<~(PfsMHn0q1IH8{GAm=rOO5AYU9aDn_*!%qwu&h$6-?(;8pbH5a{K*hAaThU%3
zrT+{@%h=TP{rmTgZ?CW@<aMBl@tY`j|HTfh>Np-D!{=-0o=%kLqrT)tZcA*{t2}<3
zE)z<%vo=N@&`=LHV&sPt2UN84<Ne%WrcY30Es~|xv2rpWA0N}Mk3rGVlyyg2MA58|
z4ga=A0oELL{ymML7i!GYDtYDX%qk?5kd#CZbN1UD1!Wr!9M5>1X!WbjcD&*t_=NT9
z?Fdz>8#hz{IBuBA#R~iR%h&m>o-qDK+09CWxqblD2VnS`k%5FKz(_o<w4Z-vXJ;_>
z-5RLP_v_bNi1s+1p6}LUdFOqAP{Zhjid(&CC@BL93V7`7>?$fM-bF>7y%&%ny|Clk
zAR=m{&A8z5pZpHnx?@=-C1P%F?o!(+#(;(gy1MjWhGBDf1$UvGBL2d7dU0{l2$>Ks
z=D`oru?Rd9#vt;cM;u2CxB*Ys+TPC0#T7n0tO-9<c;WbseubslPSqaarcUvv$876v
zv$0*$)6@HtuOnw^c^AOb44xdwoSd4vC6+@YM9ef~Y)U4md9>{1NS%)a6tc0U<;`^g
zn?k!eSz>%V*|ey8M!$Ynx!B5v(_Oq8W)KPQ4?TtP%e3kT(dmTk1{{Cbb%BVdX|ne`
zv9J6C0xBJsC}8G3!!rZlUW_ec+4IW1j}IR_%o@sm_6EeE)07VwT45SSj)IX9z3M#0
z1zz<Uhx(lYE-E7Mv_|#5=Um;~VzFAVjx7)7#%>-<o^4hj1WL)G2}ehs;GfU@r4ZGh
zJgp|^YF@i`nPu}kCaI7YivXNZ`uF$f!rM=wQ5{)N)3BhZgk)qb=BQ$@hBlMc*{gN9
zdx>4Zi#<7=O-%u?*OjWJ_|UkhR1G9{Iw}kQnir8By-m-x$7iy3VWSmqYHBK_?(}&5
zK|?xD@AOau6ggw3ULn_@>9u;?*-nzKk|KWV_U(IKhmLpEvg&tNhJ-+M!|Co9(`GCU
zWJeFa1lj??2@Vf0yL)=LQsB0f9+yWtdHLGicge}hX|my2x|PLSp^isbJDaK6E?}Ds
z&ap2tMBi<vx@)~~*s-aT*Rp91a1cumxGhChRSFQMX6V;kOXS?bg1Rw5W_o&5Y;3dK
z4X>}I*--Izp4J~uE3Rv0Ls>fI+z1Q?11sa(>}Q#MwO$@cNl9nY1NbQ{<b{P#61pEU
z-eO~81M{ch_5u_NRudU#Xa0u|AHrVaeR}MI_BnQ%&p_MTBO4kT)HRfY1bCrgU<!;I
z{4cgY76MqlCcDw?dk!zeN=hDwLxZA0TMP9Y&YKW)j*aOM212QNv!1f#GQ}-)B~o6w
z($JT#NGs-!0y2zl`w4qruVtBenRc?*o|gB~rri8;5j6HpioRxMa`>fu`0zR|jv5TU
z>M|)2k<sbN@c>{7HXmWffAt_HV6BM3!NbUo20oX^crVYvCVfY*)-&6N^mL<%Oi)Cm
zABvj0Ra%OgotsNQnp}q4`}_AVuUR)etk8Kj<9q*l=lohWBu=n%hPI<rIp`W;N>(NP
zgRS{ntgN&1^UYv!Bn!|rcQn4~X8%bWwA3m#Zo@0<LSsnR?Yp(#;{-CK4Cxfz@q1He
zQj7@pqAqy@4D!%8EcRVo+<yJ;Rs7KjSPYvEwinM45EC1NfSv6PS|z5vU*#$BN$KBa
zW|~Fqt_>FjfEm+fFlUVp1{vUWSWwC}kqe_~fCQqs!fx)jW!ag-DK=5Gx3{lwUi;YB
z!Qr^r%>eMpudem@!S(>?%Dg{=1SbBgTqL6vtf|B7Hn49Eoax_nZFrQYTlpTa%3(qk
zda-1L*cT}ES%wmznuJrYHVH<LPru%m*~~A#%k;a=L^~`!m3DLZh{c{1HVFwmtqkyE
z6;)L_`KK84`ouTgO8*h73}~48{I_r4+TSTW1%BB-b7a0qPv?T|#U5(6aj*~d%ciEy
zA=mOF@LXJ65)-kLlauN#*7o+rk29G?MU&1vWU`pYRuh>7ulJE_dYoRF<#V{lyw{ov
z_FxX@zj}igQ!hYUJLpn18y0=;U&<4f3p$f~kSW*Y>`Y((xvegNslVV6dW;go)$6>y
zeuZDZbah;9vf8a=P(JmJi4#qh%wv@k5#D&xU<-PN$)x4vZ|35|&llWxT|EB!*%sVT
zmz90}cm$Nt(n*q#galmL)#x^9Ny+n|z3nx=Ra%@>->pU(fo}5KpQ)-6kdl5+U|yJ+
zd6**Z^{+pZEFmG`jIR%OSLRk$6v6Et{Eb#ou=057L&M6<><@|28UA6#45`uG+umm3
z<9kM%Qme7MJh;@CPShi|uUoXTzrVkjUp{$We;+e(MtxYUYvMdC_!brx)dvfSXJJ6N
zY?H@&jmGSE?7_ii2T$GA%E?9?8}wE^)e1$|*4@qhy{36>-9v>wsOHdNv3n#*E%kGW
z-QKEJ;#Oy;Qtq5=ZrP`*Cu&-$9dSI-2?-Yc0pMBhQFH6w<l-U`5D++XmbvQr*y#W=
zSW>4G%#zuQCMBtP(8gUK@3)idfxH1id(-4NI>65ZGf#Qr@&~UC09blgc1vw0Ml;Yg
zXxkF+e0AI#VSTa{82K}*wCKAvACII9*RAy&SvHGKOw{>{Qj)u4`JtQdB-!{VH>k6Z
zoeKcMty_WkyrUo{Dq7*X`DKgl@_D_?es&YH?j$C5cKJ$aWqEmc5Dco2^y!oJFQIa1
z3IuBiLC1gO_bmsW*xaQWEwza5QWH$;1q(?GeR=SZtb8MmRZuV<(zGJa1N(GpPbdiM
z<Bx%8Q0^+c^XIeFvME5q1A~IDdB|U<r&r3?F4F{~h9B@ys|8#T0@5=cK!UM}$+?Rf
z>`)*>pk)L^VSGlvi04Dn?C0ARCdzH6z^U9<r~$HIx_J`;&ILtB;<2~N#KMyHQ{ql<
z_A@rnl3(x@GY{)n6W|`^+HvJiI3x=kHFl5%fH9~$J@JUzjV-M^w}+YNh+>iR_2&pe
z*SOzv!RW%u5^Jpu$%UJno5C2##kbNm2>T${P^Q&5W#PA-RDw;@N|;YO{{t15Hu?4I
zif~w8{{&t%8l8u(Ijo)AA1cr@gM=oGQS2j-D2G7DnQ#J0Kp+ylRRD<w*r!6{Hi}%*
z5arA?u$3~&nrP2W8Asty_IcwKb^%~YIxPh;c7>XpVBX)fwmyO!EOrZa176F4JKae_
zcvr`XkTk^n&z>-(XK4x7r?9T35_dN7(2u$v?+z`EmYo?ru<d-#tD2%>Vp`y(pYVz=
z&&)KO1(zKiX^`cCy;7x(Bqb!A0i7VGMP8t$rap7O{8ltiUin&&S6l(K9vvS;B(@N%
zfiAL?o8gS8B71NrKD+OS(@WFtq+p1YAbtWJ=BVk~pY(`KSByhi4fD=-@Od5Xun)!?
zOG{tiGwsv|nz+rq-*D+hA%J7jZIJ;CG$SKpdoU(DGkJEce9H9X=wQ6sjWV=Z5)4Z$
zr3P?(79>$1<dV6AurGY;Y_E7Va~}5BQj7lAAf;Cr7`hsRh-i_<1VE0WxYd%gU!2X#
z@OL+Ncck?wih_bdv&Ov)DP_4a-GDfnyK!3I-yaR8+5knjxwi+qpg6sRcXcbr2i)3v
z;|N<2UkoHi8(Uk35KOkqfA_-ewU?uf3=IM1#&f^IVef_dz~-YGrEwwMfR|<%HX2}I
zo~>gr`X&{HPhh<Pub$9l#al9>1c7wysYcclKL`<lE;W`D<6Uq|nJKMZUC%KI6DyFI
z)m!oN!9l@71w*b04zRk*wMIF!gpQdL1+dTcpz;|2JNA2J7h>V2oND!aZDLp}RKyPg
zSB47a=H|}0YG1Q9GL4EZl;MOi9^eEq0~lq|_nY5=Yd=!5DGys84uj!^JU!=mLYwg{
zIE9>#r<gmyGT>^W;^W^YCMKpOZr4MMXv|lAtDO|WBj~JkBf2UqQ{vyY-Kx-Q+jWog
zr0X*xjWq^j7mfNU_V%a&`A`&#!JKR0x`C?1PmdfL8yinz49Ff0=PGH{65>9q(PC#e
zA*N46o)BM@;)kJU78V|D;G&fDI=SjMl`3^<P%L3x9vtxgaBUlV;GKjfvn2w^+eB|c
zMkIOre{)?uY~~OV{Q#LOW60kpo2yh<J+Ix^nj8vA0+FnfdNOg3zL9y01PJfi#c7-V
kJIDH;nb!ZG$5@HvLL(jR#OZVJ?=XbCjI#7MNqztS0^}dZjQ{`u

literal 0
HcmV?d00001

diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/images/esri_portal_id_example.png b/front/app/containers/Admin/ProjectCustomMapConfigPage/images/esri_portal_id_example.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffcc44b7c2ac5e105f2395bfe56b4ae4ee266f08
GIT binary patch
literal 8689
zcmcIqcQ}=Q|38%?J4r@nqU=4RjEpifvyYi@tdN}?NoHReg{+9|O*T0)qp~-N?7heD
zeLv6j`|tVd_gp`hs}AmS-=Fn<t@jDhP*Wr!q$Nb5P$bGq@()p{Gm`K+ir@nL>*3UC
z0{`K;$|`FUz?Tn!<tzA^=IK5Cr&^BIPd(5sRwx^cqk|Q<tA&e|6~^_k<I~l1_0n(=
z8*-7Hixv8*ts{m>+t$Gf<%n@*5)fmuwlZfD;1dvH;un(O6Oa%V<j|dLL7|vX%JMSW
z&k~o%JdITMPx06E-0U>o(EfO7{<XA6sX5FlY>WOuIP(N~8aA7FDEx*(c%F>K+hSrI
zK{l34Zqtq>EUiefGb4=3Hrl&-ac)<!zPs7YF*IYZ%kvH+S!A$x_nZ%WOYHWECwogW
za^tAaF=LN9Z0naVkjpA*r4(MruAL2{XU1N=xkSKRa~G{hFm;|#QkH;MWAKvfvw)@u
z@+KlmcPzQde|4!|FmL@4#oxbw9jj@uQKENy1|<ndNLrHpPqK?UdwR&1hsy#(Ly4qM
zk6cR~M#_s4Gz;Dd+B6Lh)0S9wd5x$tV})KQkV&EnD=LBu3V2a>v$d!H{`^$wz031Z
zOY73rtHJ9ttur|VbzZXv84qufGTbK6(;LtuRkO3R(>E}vbD<+(UM*+4DCz6#>$BE~
z&(V>Xlr%Lv8zdJ@IyIN<|5BSHC@yY*vyV5rjhv2-2p>OKk5uwY+V$TPdCE=sA_fKq
zdkZ-QOwnzHHs2X4D=Qm@hYuV?LdZ9Gw{@HIao^rtf0LLP_VFWY3@6t+m6!11=;Uzq
zCKnerB;?|?YuEUkr{znZ^bw-?Fr#9(eGe#6Ys(cAXHoVJ4wo1hNKuu3#}fbi^N-W!
zAJtd#Eb;H(H#Ik(gTd+8HmBVSHM6id=kI@NF!D%8Cn!nMWBO=+^Vz}Ht=!z)$*HLT
znZOIRy(diA8qZbv!Haljx0Z%34-E~C3RD?IL`9KPUcGA3{`S`VXq6x#5m6CLpff>~
zj84S<d0m}!xx>iI_V)XG`}^pjVynHiX0p`u^yWV2qdjLaaq-5H5jt+ea;(Npc}q*y
zr*3Zi&(<d6p3K3!oaVaexeQ7PV7u<=>Qa?s#t5~vv<62;>U*V`u{DoiC}*C-<nQ0V
zUpWv=#)zBnKMn6n5N-bY6%S=*ZyyFD!#jVTnV<jCOlzcKC>3`D^*NM~T|e=`!GRI|
z*#Ok$pDwMT$f6?t+fq`_8^7D)NUN(oR?|%D{pN?uI8kOjDKbvZ&H<^ZQ=IgI%pd>O
z2%>j?w_Ps9jJ@~vooYJovomC4)YI4V^Jnv?WWU#;S9#5k_SU!i6Oxl7fB&`|t#m$j
z@7_J~5c#N%*@7(@g#wdWr}-Y{`M-Y~hlXgVsHiBPVvp{ut6`Ijcv@#W;--H8{>shC
z!SO=l=C8dBlWgtRyW`#k<6f&1^^yCVbIrZI$V`IE%7hKd?L%DWy3qsq#=K){j*gD{
zj~+1#3txfZE9B_rO|Gm&T)M7s_rZh3jK%9%p(GEMB?<}(jfW4@Hc|s%!bV0$eC|v7
z;Ukaj22NWUTO%2RgM!Y-ay?2bKH49djq9uT_upEbU=(;qY-?-#DkLNzKcD9%8RJR2
z8-*<GgyFF(KaQH>@?~VN!{{Y-XRDtbA8gAhC|tlhd&Zywlee+j7R}Db$2ZyDkC&{%
zrj>2VN|E}g#G0ey?fn~2QKs3oyQ>p(ID9wQ^2a?)Pglq3JyyqkGY$xtRX-``FMW{m
zewmnf4b_L%dh{p+UVY5WoQ4`)+uRHc4i0V?Sy@^6_U&84i}OU2%gf<p(t9YDHw6Ai
z>-Z7Z#9!Qa5SyYH$$)zPrz@d(aF9AXJNxlOos>MwrQr(4$jCb<)KgPaV$RceP^HXN
zp+z36Ci9Dn=`}S+8IkC=e{K|(lmveI#11nFPY`uv;p8MbbLNa=W;y|Lc&2jG%E9(x
zyp*@d?l2%rW@aWepBc)?*tj=Sm2UgxMZCS0>Q!W)j}8_KzJ33$2*(WV=ol$%*Po*G
zNsVLHraLhN&V0kf1f%caPD`S=YfpuvskXK@6EpLf-rin5Vd0jwsb;i|O>mX#T-`5z
z7@Eb{7q?g8;VrMPa5BA7GQ(gZLN2qLPc{S;^z&n**wR~`taK1C|27R{SeO5Q0oeZw
zY!lFW<Lecew2aq!udhwX-Hf^abb0s+a)iUfNl<3n3w=&bP7Q_VX4>joiT)@1_-HhG
z{znFpb=P|xn<1$CslD}?p1!`>*fQIn7ZOAqe(0Z6uht>QY<haSC-;#c#?!!nc6w$;
z)5IhK-ZfS7T^iXpycY_mm&j#%zM<JE35&e8pKuvfl1D^DMBUF2^F0vaF|F$i8k_G;
z@BQMoh_iqBy2R$Y`Qgs;{9utqV0*``%ii8zLvwTbcrkLGI5;``Vv{93Nb8R_h^Tl?
z!XoG;)6&w;E)Ep5b|*>lTeVY`Z9L4TOjihRnrsYQ?-HHJ%A2V16jVzTYdpV@Z(Qy4
zr;~=7hDL@hT1HV3Kbl?rWniFOV8k18>BqlD208WeC(|RPU!<pBN8MFdCj(Fpf;s4A
z!eQYP5y5m?XH|NvGRVrwRf+T|rfR@71>-JPu3Q<ca%Dez?p$Agl7t(f1uksrY`IlO
zECC^5Q;|h0Q(T8|zs=*vuX6MXJ_mhLVwD991=z?g_W6~iNkB%XC@+t9_Uu`5Act)2
z;S>v2EE(-~dp<l}%;h&hdq+p_XC2OPE5E%dd@(VxhORD>!`;=^)1&XFPKyA!W_EU=
zF`Rm5Q33)2Kxm<#KXc5_&m)&XVH)kfeM|YZwbcTSe$S5|KPvAqGA74KTma%~4ko)U
zE>1H%JUl;EEegP^gRwiqBq2eI!C(qYOSN<4IAT7RDL!~W6jo%go0Fa%7;p}Mdh72`
zYJPLPirY7CoIiJg_$~|}Z^V6Nl!lFs?b*ifi=CaFv|d@*qa5Ldn55|F%eXL_KylYU
zldX*Y@(KzHd3pk<Ng!jWI<t;gZv8J$Z*6UDO)f4Hp(=g$1z4_M=eNKS!<FV;?}ZUm
zf#RxMc5raue>&e|5V)dK`Q?lGY<tXLsqN)h9^=<bOZG>5Gm#utFnK0QLVmBU$Kh_o
zbRxt>MMZmutMzA485tSK#Y;;|3)f2M1S|>s4wpq^G>(9i`7FOhNsRa`4+{%9j$Z>|
zVmFVb*eDp7PoD|IC&M)aoO6c10V-VJ=jV^-w@^r`cta6_2e97syDb{+;6Q>>Qc`Mo
zdrPZwfZL$-Imi{=JcA(Ky1la~Gh5s2_4WlfU`f|g|I_1Le*Y66l|->ia6AG4;Q;{Q
z=<<227!lx|y-7(}CLz85`!c+Mxg&Z95W4~BzYuCkV%Ndmo*3kfQJoKsl=sfpGP?n|
zeaP;FziHl5s$6hXY%D_TZ)0N6{ke}Eg|;s4pXMt|6H*f3Ik~vJfL#y}6a?)NF;?v{
zU?43ZKw(_%-jX5{SZTGtzdu;v$Or^dWfjJMGp1d^;V^V-dmH`a$!p-E=BB2zk{&Da
z-#<vLPX#mfR~gs)9rqNN-a$1$!Gc!NS`|U@`RqA;ZD~oh`Tjx7eTf>#DZgm+)uro|
zoOK%;F1g0lRQEF|YQ46-+OD(yp2+TPj^NL93F<AfP=pc7@Wk2G1W5t`xVX9&xi1^U
z%pwXgI2d30WN!wC5r8^l;^kGJjW&Fvgq@x?k55QAhsrmtkAQm{RXWL7joi}8Z0PH|
z63wRi@X?14A0kF79A`iUJkg+oF}^G=7O=FjNiQrUcXxN+#{7g@@;TX``_|d{vGDru
zQ=un=^pftxbKjE{H8jXoR8=)~bzcJDHMX?ev*;PC^}Y%xNxuS<G>nfz#0%7FXIB^6
z%IZ8QuD!iyAVH9VL4B^j<1yQQg_vGqD`q6|?OQBDZ7>r#XJ`IcZo`+brRnO)(pgzq
z4Y+W+UZ5FJzf^a(b>=rI3C}BpQ3t?7vwgmkX4Op(7h4fgap|X&=kqkbB$3nCr)E=2
z98B2&S_S%aa&vQ7lP1`&u=`a=cl#M1pyDM8iWhJI;3WAR{QVTqhkk+EkaS;quFr-0
z=f;Cds|yz{=-2y6A<NOwaMymg^df+kSs1co925Q>-QBo1*A<a!(4#H*r_EB#YwM<p
zib_wuu_VY-^Y!T#1mK`HK`)-u)6)y15&SbNd9JTf%&Y+w<J|Caexm*k@Bp7#!*hcU
zKpWTO9*&s%#0<A9yEm|F;Z!+`hh$g~&@%pX5B^V_SbM(0aYA?haANr5$B&bX1@$;s
z#Do-`-^Q)faw;msnQBR&H+qJ@)GUd=jgAf+DzUlF#FWy_Zd)G#@KWKTCb|%ay8qw-
zzwHlJ)*CmR3)s~X3BVwr`uqzq0L=_iUJYYowT;n}HMyV!(5vIMN-8SYh=^{xfmZ6~
zspeorC2Q;Gq{1$(ZExQLxmP6s%h$3pR?Q4D05G_rp}~MrwV>_iC-wCX-g>j2nW}t3
zLfVh?fDvtfW==(`OKZN1VwaSpgRN<RvxI*9n1GRy5hQ$x%%S(z{3Yw}AM%P-c;cGJ
z#~C`}c=aSt&J$6k<mM6s{ETh@t}hLj5nbgq!D@5d+g%yscNi8b+d0<&LqKd1IIMTx
z)Y(d`O+brIe}CKnFc};gLNENv=C~|?Fq5*f^0S>K8ZK^be&2(q`uh4pm1IEKAh?xZ
zwV1=t4FdyLjlVpd>IZ#H8^>e(P+a{9!@%~D^UL7i^t3eDWlc+AO92`fXLw2q)8O#%
z6Ryp)g9Bbc!ONbWp08fNekd7vda%gLW&DK_m>faSGrxRElcarVVc1{6-e@ztzeGcG
z@y?w)0F0vZiC~-LVgFzX_}tvw2)Kh*U;Q0uk>JB{2Vj3`q$1MW_~FABh%os3BZFGX
z>uI3%`jeX=$;0VHWm7e3dM6&XwY4d!tG6!n<)AGsv2>ysv%b$dP_*>J<qkxt8n5yU
zD_DetC}U$|UxkJ?1I}NfqUxXYrMz;bv8hScLgVOY^E-#5Q;Nh*1iul1-`!1GRaK>5
zZco#nXBaHvF#N0fj;pI{Ofr#%RQT`E%ZI3j)%w%?^$_q^jxRxy1DL1e<%P$`Q_IWC
zXBoGgY<|B3V+wxr=1u#?=G=EVQ&UF63e0&6;`);VP7%!Lt1FzkC=_P2G5}Bn8x+(C
zW(gEN0TIy*Ly3+lBSDbtXq_+JoujpL#Kgo-h{@R<^BAo2l^pk8l|uD7{)vi;GDud@
z($>cI^z?W!diqZ`oC%}mPivGJh&nk0t7~Rs^NH%IOVu?vKl8t`qYVs&ljLS+XO)zd
zWt5a&8Qh$mn{)lHlDnE1)n<uMF^GU7%QgxSz-GX)2nEHN`VCFaU^pC)MfyR#GcYjd
zSG#kQUK4u`hE!D7<Iy7;E-tP@7@nvuI|`gZ)4)KScggV3P^$mwiI~UAwdV_Sdn7ah
zc)Gf}AV8Wx>#gstTa4EG*Eb$&aKzC1OOAhWBa%&x@}~3+PfKHokB@g^e*zj1ZD)7*
z@X%)*c0TI;`_JXcP;N+J#^3fV9v1oY=MQ2)K73#RpHov?>kQyq=3-cG9}pQCIh^Yd
zc!2~VX=ZYQl$@MUuwaur%Oj%)^`|FvJUl#n{QPG$j^}fLL!hXIv&eGu^438SG=YtP
z0AT*-Co*CZlJ)uC>ljADptNpJ8HU@>p7*9J=BR9KrPb8j{x<6p!|os|?|ZyE9q44o
z%F3GJy}R<nL!m554pC>F?*#39GtC|Jtav|Mj){qJa&-+%NT4e%E$smUf?blG`F>=)
z*4^1-Z*6@+U0wa!?Pug_YHFwkRe32;K;a|s1f<+)XlQ!+`xRh4E>Tl|J7%*RDd&di
zE{-~Sc}eW7j1hs718Ze5{WWCNLET|dsEZg!J(J1P+1;%GgjS&j`fX=tr_ysXv;Csy
z!mnGb?Cdj$z7P~_9x(MMAtEBWCgz0tq@Ju`YkLbs>?KM{EN1MBOtv-)2L~a5n4FAE
zK>JBvZZ1>IeP__mTPtI96_~LmkVrjwhNAf@z;F-=yv8SE0Gmrx>%EKn8gg0q!zf_v
z-DGLsU-?V!tK%f1qM|EP8Q%f?a@!Zd5oX6odhc*OU+@$!cbv%ARU|3W4}(hBS{{ir
z-04+hM8gT3A1Gjya9?_LnO&^`hkNP$Q{*Gr6M(gkpFYVkkvFurzc%EF>nO77pi*L`
zfP-V!8PCt5=P9i2SLeR`9_KEIBfoOxJlq%x5CPS?y1K``Y3KD$8w2sHY{=dxBv=4C
z78Vv}m7F#;H8~ybIDj?!n32KE!g3a33CIk@JU3WbSXc@jMno_p!`-R5xm=dk*3%oa
z9Z(+6<KnJ*Z7&2tNfSYF2Z6RXGh-SZ9sQNxZE_nit$7063!x7A;^TvZ`fy*wco!BG
z_3mvxrpUb%^Y$$t8Cj%(X}!`-%Hq?L-TKkRurT7-H*YlU_FugsD0iMwV2f^}wg{t_
z_K6P)3bN&r1g*su*P#;&+A!k$`SV2}(gbnT-g|4z4^&igJ&avk1OSm3IC*%i!}#5|
z7j#5G61yKCxZ$WR#>dBV3kx-@OucuO&=63-6|qT4T{Sf|gW!!SMF9FkRNo7Q=xA&6
z;i#)!=SU4}o)z7v4<@BI2bUhkk5fyQ?t<0O?w_c14)pZ$67cZw_%k)t*!@AOBQLtm
zl8cGyd6Jm(3-4M`a_)O;=(0M{6ZStoDszd7>RIiB03G_3t@Tcu!wRO;IWb|Xr3b^m
z9NMy!;8>?=8>r7^?dRubR0}(0bSmu#XP|RzEU7E`PI5?#d6_h|w2zpphldT!WC=)_
zWF?UH;>C+gK)06C($Y(?tsINR#l`woRyVXbVz@XtLp{B{OQ15d`<#)ra2&r~Hhb&V
zEqidhDy$UzA@WV-_Crmvyr$iGkr5Hri~V^P6d_oC+#s-N8;?oNV9Ln@B_%T`Kdr?a
z@QVUC>XAb9xx?e#i7GeV4|0S-FS-)NqmQ=-OksIkTwDe}Dn}0j-&6{in3z0qK<Dnb
zPJ05CbhfqzU!kOQ>Hwk`d`UuAIaBL<D3TyxMF{tk%i9);t?;8eWZ4<L5?xXv2w{kD
zEbI~u;_0C7$J{Hct7lG*4{zSOW!qB+q&>B|`kf@oP+#B4wY0wsGvAYn6pO5^EIB#(
zbJYZqMjTGT%8$UoVLRW~&xPsw_3J9}d;xU+`}66Mlhe~LK&9B(+d;{L^cNnNK6_V2
z=1hNqX(aeoB&S0xbwT~f>wg75TAJ_Qy_>pox=;3eK{<*|{X<x~V&vz(7_c3r^b%P{
z>xHM)=IfiATHcl?U_U<>`s}-GEe?<+`yJe>xGf?=<$JKDnXMNMSr8Na#OSxjtedOf
zm~<HtP!Rr-)6<7zv3T%>&<=TM3&}ztt*P(!6(rm>H8sUzu_>jcZw&|170Dohkpq;G
z^4e<1(oA>STbq&?Ijs5mRUQJyRL{*n5CH}zCo{rMXlQ6W2hEfS;zLG8W|X@oG&FSh
zHgnnbL@3xHP0$o@Ttu@RAgZ1pua*4bu}Yfa<u?UNcpB1&ZA{MJ#AoARl8ans?{|KX
zqJwy8)EVR_6P$6$aUSC@zr^u+;>X{O=%*Z9&Vc+uG;0Y|ou-aXhV$)wh$V11+;%_0
zAz)pnG6v4{H7-CJ`1&;=3>AH_^><VPcICF`hP+jKGrRhStX~7Ea`<H<tw2-*61Z}U
zR#MpX0WTx?8#X706QX4l3S?XpGViT<O+0*j#MOw4i^ofP<hQ%O$Dl8RjobIKO9ZV4
zk{=S&-pW&2a19_P6@fYVU4AQJJWWg(AP6XgwUVePNG&KJ0}ZN@EKM()N-iQIBKCBi
zoK5xpS5^0|HumJn>6TDL#pLAJ)%vd84!HXq&fp9PD5VDva@_9LLPk;fY~4I?*ho_|
z0Cv-PLL_S_^4&X{*P)>xi`O6+9}quPayZ^)0iFVJ1ibjEG1+Il(phf#*a}Q6AoD<V
zUZ!iB0tUka$qHis^H&2F)Srx$+NO($*jZRKccqTL9e-EI$;I^*wyaOBeYn(afD{~e
z1B^u2<eo4Vo(Ke;;!Ha7rC-Vss+C&kaa6m0VqPA1zEM?^F9nGB?Zp8dwu<hqE*&~2
z_;+^v8*e+1B!n?=i1AVmqOHNv0sP7<D$23ENrCm@fKb-XHE<WS1`<P4aT{pQty@}I
z$)svH&14E=#%n^r96N0W18HdM>Y6uUFUAYoQF-kwg}_=cv$EnrLZWfFoRpM=up5{F
z=MIQ-`0e_+h(Qqnh*f%Rb1W?{>-c@RpYe}3_Zy{O(jmY4`~T!GEi3}RGBot`Xv|*4
zZEiypMoCGT)hTr}*?6u@z0NKjRLzec4`UjlJ7yu;46dpYHz<7^00tQZjV*D_mxEPc
zuX{H+IprQdzF7faH`NqG1j<kIk%=5+TcFoDIyN>o7NqKiyDy?D{ZFOqPEWkyQ00WT
zynFvX?c+y0K*GaPIuuqGopfj?6z&;08pU4?4~<Ps>||4kZ-5|MyWh&%x)?$qgGB^C
zAu}C~AA^-1QonQju_!l_zgp0yyAaF*#wRZ;>lMA2Q_8rTFtR5{$H!IcuV^7^wz6oA
zumXrw$<{8etP~T0Oa$ZW?k++n<s~#yWPv}B+1aV`XJ$rgE`Ds&<XTC!=O)|c`Z^jk
zBR@_bjb=`e_LUI*ldf@7-^q#ZfvPGb8JXG~Lm<~4xwsVHuYC~9HHCY=urVEP48%Z0
zN@@+PS>Q23%NsEigvA!Zxnz5z6mP_111HC#v9S?G0zeOVVL^12#}X8CSkb}>qbTOu
zuHfeaGC-woR6IuCAo`-V=<}6^HqQ<;BXIiL@#`Qthn7bwXe`1YCjJ-sfEvsxt1aiR
zhOI1z0902;rv*GzD6AH=Nu(+uj`;`pB0@(;$GH`foc@%PpF-BVH3zsQ0I_&b7}f5}
zv>r9UZyXl?yvHp)kz@zE)C%i21R~&x0~i2GLvZ)I3~k-r2zxqOb>_DfEJ3_4DjD}M
z8ygUC<{CYHk^PWB*@LC6t*5B0?a(41SS0wV+y6rcf(q$EO-$4`I{Y1};DtAW7-FId
z1@X-1ceLjP(50sfszR40GOIURiyeTP3G5Wa8TY^>7MeAljS&Ft5D*h{<wam1r1(gB
zR9MItK9OVh3bZ78xYQQOAKKg7d(!R^g<TW>hi<bMRIQQ{fw{Rk(uK=-co82TKgKW`
zmP_s?C1Uk>YfmBF8-)ZWl0m8o@KvYZVWQ4>wm)A4cI7LW+{w8){2<vgii(Oct1rT7
zg$W^Ng585`8Bw<YT~+F*P)C~S3Nm_nSD{N2q|fydpaLNu<G*f8gO^PGkA?jX{<1^g
z3~5dP7!|mR&D?`dB=SJSC1XY%|8%|^_44=kUz(_AL~gId`uJxiNv3-8iNZmFH0%Km
zB0@wUzKxA-`u2@L(7N+^c(`ib$S*fFBs`2{yrXM~V0-SPk_&gYuNGTaSRmdV2^|@I
z*3N+IdXtoNJlwij{Melz`mr^x$v6sGC5!*65Bs0m1diNGaCAQH-1hmry4<Jut$xh#
zV)gqFztg=Lvd^pZS&`(@&p6Rgl2S-W4hcC_rS^nj{=a^&b<3pModn75l~@tng8q&A
zc5TZ6!BikyeKF^)TQZ)W;`a9TNEUK*<O6{C(AP0rT6Ql@vtS7;%e=9<$sBVZ`HpVW
zFfbs5{RViIGc=@wQb8gXB<6;W9I{tlUS3E9U2UFvU{V0L$kl9K`H}Ge)K37YBg6nB
z7Xpk~TU#5^*x1-W*Uj1SF@WrYIG)tXO8w=o``fi9zSy-#>D_dkU|fEGy9BAY*<c|W
z+8B8yHS#P|?PQG7MtQgUcD=SQHQ9tqE0@crHbAosS{S5=EVmIU$jZ9=@F4}TOfWQF
zWeg2Boml>TxnB55L{D#TV^69a8d^Zdhr4pw+Mi?IKzQafiTd*NFCs1m_7yVzJ^s&a
z<5$4lfjE&>K2?U#AlySf3-EJK;a6W@P;4v}h!3@GVNDpXYIKmXpI=>jgBJkXhufY_
zwIZUTihh35eFO3^Oi|UHjA?LBjh&su&=Q1J4SR7(Nvbx-)cpJ_lUgt2_mJrpmX~K9
zyib9Z%WTVEA|xb)CIr%218zY2yuds_49(CDf_G|aXx#nZXB!PEvr@c$`*srIHL$E&
zRrH6`p}bLXalxgfLJ$i;GrnK4LG9m5tC{Y<jhA(DfV7N1sU@XkWa!w?(9tD$P2_4%
xEcPi9FbXTfCkwufD8!-u+fNnzr_+2&G#N#&+G*k}2p`8lDc@6*&zCiO@jr#`_$UAX

literal 0
HcmV?d00001


From e86b583fcfc22974e04dcb0e7b4d2d4bf3a669fe Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 28 Feb 2024 15:44:44 +0100
Subject: [PATCH 053/282] Update comment

---
 front/app/components/EsriMap/utils.tsx                      | 2 +-
 front/app/components/PostShowComponents/DropdownMap/Map.tsx | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/front/app/components/EsriMap/utils.tsx b/front/app/components/EsriMap/utils.tsx
index b8140fa73cf9..703856feee9e 100644
--- a/front/app/components/EsriMap/utils.tsx
+++ b/front/app/components/EsriMap/utils.tsx
@@ -373,7 +373,7 @@ export const showAddInputPopup = ({
 };
 
 // createEsriFeatureLayers
-// Description: Create list of Esri GeoJSON layers from a list of IMapLayerAttributes
+// Description: Create list of Esri Feature layers from a list of IMapLayerAttributes
 export const createEsriFeatureLayers = (
   layers: IMapLayerAttributes[],
   localize: Localize
diff --git a/front/app/components/PostShowComponents/DropdownMap/Map.tsx b/front/app/components/PostShowComponents/DropdownMap/Map.tsx
index 45dacbfe571c..893d02d0c0dd 100644
--- a/front/app/components/PostShowComponents/DropdownMap/Map.tsx
+++ b/front/app/components/PostShowComponents/DropdownMap/Map.tsx
@@ -23,7 +23,7 @@ const MapComponent = memo<Props>(({ position, projectId }) => {
   const center = position.coordinates;
 
   // Load layers from project
-  // Create GeoJSON layers to add to Esri map
+  // Create Esri layers to add to map
   const layers = useMemo(() => {
     const mapConfigLayers = mapConfig?.data.attributes.layers;
     // All layers are either of type Esri or GeoJSON, so we can check just the first layer

From d28b235e06bb688baccc3e2191a4c3c62b964152 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 28 Feb 2024 17:41:20 +0100
Subject: [PATCH 054/282] Move web map out of initialData

---
 front/app/components/EsriMap/index.tsx        | 22 +++++++++++++------
 front/app/components/IdeasMap/index.tsx       |  2 +-
 .../IdeationConfigurationMap.tsx              |  2 +-
 3 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index a6288ccb3782..2da874d76b3d 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -63,6 +63,7 @@ export type EsriMapProps = {
   initialData?: InitialData;
   layers?: Layer[];
   graphics?: Graphic[];
+  webMapId?: string | null;
   onClick?: (event: any, mapView: MapView) => void;
   onHover?: (event: any, mapView: MapView) => void;
   globalMapSettings: AppConfigurationMapSettings;
@@ -77,7 +78,6 @@ type InitialData = {
   showLegend?: boolean;
   showLayerVisibilityControl?: boolean;
   zoomWidgetLocation?: 'left' | 'right';
-  webMapId?: string | null;
   onInit?: (mapView: MapView) => void;
 };
 
@@ -89,6 +89,7 @@ const EsriMap = ({
   graphics,
   onClick,
   onHover,
+  webMapId,
   initialData,
   globalMapSettings,
 }: EsriMapProps) => {
@@ -165,10 +166,10 @@ const EsriMap = ({
       };
 
       // Set web map if it was provided
-      if (initialData?.webMapId) {
+      if (webMapId) {
         const webMap = new WebMap({
           portalItem: {
-            id: initialData?.webMapId,
+            id: webMapId,
           },
         });
 
@@ -235,7 +236,14 @@ const EsriMap = ({
 
       initialValuesLoaded.current = true;
     }
-  }, [globalMapSettings, initialData, isMobileOrSmaller, map, mapView]);
+  }, [
+    globalMapSettings,
+    initialData,
+    isMobileOrSmaller,
+    map,
+    mapView,
+    webMapId,
+  ]);
 
   // Load dynamic data that was passed in.
   // Note: This data is dynamic and may change.
@@ -317,10 +325,10 @@ const EsriMap = ({
 
   useEffect(() => {
     // Set web map if it was provided
-    if (initialData?.webMapId && mapView) {
+    if (webMapId && mapView) {
       const webMap = new WebMap({
         portalItem: {
-          id: initialData.webMapId,
+          id: webMapId,
         },
       });
       mapView.map = webMap;
@@ -330,7 +338,7 @@ const EsriMap = ({
       mapView.map = map;
       setWebMap(null);
     }
-  }, [initialData?.webMapId, layers, map, mapView]);
+  }, [webMapId, layers, map, mapView]);
 
   return (
     <>
diff --git a/front/app/components/IdeasMap/index.tsx b/front/app/components/IdeasMap/index.tsx
index 6ba309d2110f..370421f96d13 100644
--- a/front/app/components/IdeasMap/index.tsx
+++ b/front/app/components/IdeasMap/index.tsx
@@ -513,8 +513,8 @@ const IdeasMap = memo<Props>(
                 showLegend: true,
                 zoomWidgetLocation: 'right',
                 onInit: onMapInit,
-                webMapId: mapConfig?.data.attributes.esri_web_map_id,
               }}
+              webMapId={mapConfig?.data.attributes.esri_web_map_id}
               height={isMobileOrSmaller ? '68vh' : '80vh'}
               layers={layers}
               onHover={onMapHover}
diff --git a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
index 8bae67a51227..6d2c35b473c3 100644
--- a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
+++ b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
@@ -89,8 +89,8 @@ const IdeationConfigurationMap = memo<Props>(
             showLayerVisibilityControl: true,
             showLegend: true,
             onInit: onMapInit,
-            webMapId: mapConfig.data.attributes.esri_web_map_id,
           }}
+          webMapId={mapConfig.data.attributes.esri_web_map_id}
           height={'700px'}
           layers={mapLayers}
           onHover={onHover}

From e4e156d1f181e72e6199a44ae8b494a542c72d1a Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 28 Feb 2024 17:43:24 +0100
Subject: [PATCH 055/282] Remove comment

---
 front/app/components/EsriMap/index.tsx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index 2da874d76b3d..0a99569034cc 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -284,7 +284,6 @@ const EsriMap = ({
       if (mapView) {
         map.removeAll();
 
-        // mapView.map = map;
         layers.map((layer) => {
           map.add(layer);
         });

From 4b5a149621f622dd4ada44fa72075935e16b3938 Mon Sep 17 00:00:00 2001
From: Adrien Dessy <adrien@citizenlab.co>
Date: Wed, 28 Feb 2024 16:33:13 +0100
Subject: [PATCH 056/282] [TAN-966] Upgrade Que to 2.0.0

---
 back/Gemfile                                   |  2 +-
 back/Gemfile.lock                              |  4 ++--
 back/app/models/que_job.rb                     | 13 +++++++------
 ...0228145938_update_que_tables_to_version6.rb | 10 ++++++++++
 back/db/structure.sql                          | 18 ++++++++++--------
 back/lib/active_job_que_extension.rb           | 18 ++++++++++++------
 6 files changed, 42 insertions(+), 23 deletions(-)
 create mode 100644 back/db/migrate/20240228145938_update_que_tables_to_version6.rb

diff --git a/back/Gemfile b/back/Gemfile
index 37d21a61ea5d..3929a71114b1 100644
--- a/back/Gemfile
+++ b/back/Gemfile
@@ -89,7 +89,7 @@ gem 'pundit', '~> 2.3.0'
 gem 'active_model_serializers', '~> 0.10.12'
 
 gem 'jwt', '~> 2.7.0'
-gem 'que', '~> 1.4.1'
+gem 'que', '~> 2.0.0'
 gem 'que-web', '~> 0.10.0'
 
 gem 'activerecord-import', '~> 1.4'
diff --git a/back/Gemfile.lock b/back/Gemfile.lock
index 2e8201264d2e..7cb594d0b17d 100644
--- a/back/Gemfile.lock
+++ b/back/Gemfile.lock
@@ -910,7 +910,7 @@ GEM
     pundit (2.3.0)
       activesupport (>= 3.0.0)
     qonfig (0.28.0)
-    que (1.4.1)
+    que (2.0.0)
     que-web (0.10.0)
       que (>= 1)
       sinatra
@@ -1304,7 +1304,7 @@ DEPENDENCIES
   public_api!
   puma (~> 6.4.2)
   pundit (~> 2.3.0)
-  que (~> 1.4.1)
+  que (~> 2.0.0)
   que-web (~> 0.10.0)
   rack-attack (~> 6)
   rack-cors (= 2.0.0)
diff --git a/back/app/models/que_job.rb b/back/app/models/que_job.rb
index 82bcdfca6baf..ccb5cf5d15bd 100644
--- a/back/app/models/que_job.rb
+++ b/back/app/models/que_job.rb
@@ -16,20 +16,21 @@
 #  expired_at           :timestamptz
 #  args                 :jsonb            not null
 #  data                 :jsonb            not null
-#  job_schema_version   :integer          default(1)
+#  job_schema_version   :integer          not null
+#  kwargs               :jsonb            not null
 #
 # Indexes
 #
-#  que_jobs_args_gin_idx                 (args) USING gin
-#  que_jobs_data_gin_idx                 (data) USING gin
-#  que_poll_idx                          (queue,priority,run_at,id) WHERE ((finished_at IS NULL) AND (expired_at IS NULL))
-#  que_poll_idx_with_job_schema_version  (job_schema_version,queue,priority,run_at,id) WHERE ((finished_at IS NULL) AND (expired_at IS NULL))
+#  que_jobs_args_gin_idx    (args) USING gin
+#  que_jobs_data_gin_idx    (data) USING gin
+#  que_jobs_kwargs_gin_idx  (kwargs) USING gin
+#  que_poll_idx             (job_schema_version,queue,priority,run_at,id) WHERE ((finished_at IS NULL) AND (expired_at IS NULL))
 #
 require 'que/active_record/model'
 
 class QueJob < Que::ActiveRecord::Model
   def self.find(id)
-    by_args(job_id: id).sole
+    by_args({ job_id: id }, {}).sole
   end
 
   def args
diff --git a/back/db/migrate/20240228145938_update_que_tables_to_version6.rb b/back/db/migrate/20240228145938_update_que_tables_to_version6.rb
new file mode 100644
index 000000000000..017bedbd4a49
--- /dev/null
+++ b/back/db/migrate/20240228145938_update_que_tables_to_version6.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class UpdateQueTablesToVersion6 < ActiveRecord::Migration[6.1]
+  def change
+    reversible do |dir|
+      dir.up { Que.migrate!(version: 6) }
+      dir.down { Que.migrate!(version: 5) }
+    end
+  end
+end
diff --git a/back/db/structure.sql b/back/db/structure.sql
index 09f3554fcc35..4818b67b3563 100644
--- a/back/db/structure.sql
+++ b/back/db/structure.sql
@@ -134,8 +134,8 @@ DROP TRIGGER IF EXISTS que_job_notify ON public.que_jobs;
 DROP INDEX IF EXISTS public.users_unique_lower_email_idx;
 DROP INDEX IF EXISTS public.spam_reportable_index;
 DROP INDEX IF EXISTS public.report_builder_published_data_units_report_id_idx;
-DROP INDEX IF EXISTS public.que_poll_idx_with_job_schema_version;
 DROP INDEX IF EXISTS public.que_poll_idx;
+DROP INDEX IF EXISTS public.que_jobs_kwargs_gin_idx;
 DROP INDEX IF EXISTS public.que_jobs_data_gin_idx;
 DROP INDEX IF EXISTS public.que_jobs_args_gin_idx;
 DROP INDEX IF EXISTS public.moderation_statuses_moderatable;
@@ -747,7 +747,8 @@ CREATE TABLE public.que_jobs (
     expired_at timestamp with time zone,
     args jsonb DEFAULT '[]'::jsonb NOT NULL,
     data jsonb DEFAULT '{}'::jsonb NOT NULL,
-    job_schema_version integer DEFAULT 1,
+    job_schema_version integer NOT NULL,
+    kwargs jsonb DEFAULT '{}'::jsonb NOT NULL,
     CONSTRAINT error_length CHECK (((char_length(last_error_message) <= 500) AND (char_length(last_error_backtrace) <= 10000))),
     CONSTRAINT job_class_length CHECK ((char_length(
 CASE job_class
@@ -765,7 +766,7 @@ WITH (fillfactor='90');
 -- Name: TABLE que_jobs; Type: COMMENT; Schema: public; Owner: -
 --
 
-COMMENT ON TABLE public.que_jobs IS '5';
+COMMENT ON TABLE public.que_jobs IS '6';
 
 
 --
@@ -6007,17 +6008,17 @@ CREATE INDEX que_jobs_data_gin_idx ON public.que_jobs USING gin (data jsonb_path
 
 
 --
--- Name: que_poll_idx; Type: INDEX; Schema: public; Owner: -
+-- Name: que_jobs_kwargs_gin_idx; Type: INDEX; Schema: public; Owner: -
 --
 
-CREATE INDEX que_poll_idx ON public.que_jobs USING btree (queue, priority, run_at, id) WHERE ((finished_at IS NULL) AND (expired_at IS NULL));
+CREATE INDEX que_jobs_kwargs_gin_idx ON public.que_jobs USING gin (kwargs jsonb_path_ops);
 
 
 --
--- Name: que_poll_idx_with_job_schema_version; Type: INDEX; Schema: public; Owner: -
+-- Name: que_poll_idx; Type: INDEX; Schema: public; Owner: -
 --
 
-CREATE INDEX que_poll_idx_with_job_schema_version ON public.que_jobs USING btree (job_schema_version, queue, priority, run_at, id) WHERE ((finished_at IS NULL) AND (expired_at IS NULL));
+CREATE INDEX que_poll_idx ON public.que_jobs USING btree (job_schema_version, queue, priority, run_at, id) WHERE ((finished_at IS NULL) AND (expired_at IS NULL));
 
 
 --
@@ -7432,6 +7433,7 @@ INSERT INTO "schema_migrations" (version) VALUES
 ('20240130170644'),
 ('20240206165004'),
 ('20240214125557'),
-('20240226170510');
+('20240226170510'),
+('20240228145938');
 
 
diff --git a/back/lib/active_job_que_extension.rb b/back/lib/active_job_que_extension.rb
index a1f8948753df..ed00be505de0 100644
--- a/back/lib/active_job_que_extension.rb
+++ b/back/lib/active_job_que_extension.rb
@@ -24,16 +24,22 @@ def destroy_in(delay)
     DeleteQueJobJob.set(wait: delay).perform_later(job_id)
   end
 
-  # Removing the freeze step from
-  # https://github.com/que-rb/que/blob/77c6b92952b821898c393239ce0e4047b17d7dae/lib/que/active_job/extensions.rb#L14
+  # For some reason, `Que` freezes the arguments and keyword arguments when the job
+  # loaded from the DB. We don't want that (the code base as it is today modify those
+  # arguments in place in many places), so we override the `Que::ActiveJob::JobExtensions#perform`
+  # method to skip the freezing step.
   def perform(*args)
-    Que.internal_log(:active_job_perform, self) { { args: args } }
+    args, kwargs = Que.split_out_ruby2_keywords(args)
+
+    Que.internal_log(:active_job_perform, self) do
+      { args: args, kwargs: kwargs }
+    end
 
     _run(
-      args: que_filter_args(
-        args.map { |a| a.is_a?(Hash) ? a.deep_symbolize_keys : a }
-      ),
+      args: que_filter_args(args.map { |a| a.is_a?(Hash) ? a.deep_symbolize_keys : a }),
+      kwargs: que_filter_args(kwargs.deep_symbolize_keys),
       reraise_errors: true
     )
   end
+  ruby2_keywords(:perform) if respond_to?(:ruby2_keywords, true)
 end

From a6635116e1a104fa277483cda98d27479dbcbef4 Mon Sep 17 00:00:00 2001
From: Adrien Dessy <adrien@citizenlab.co>
Date: Thu, 29 Feb 2024 13:08:45 +0100
Subject: [PATCH 057/282] [NO-TICKET] Fix flaky tests that were dependent on
 the local timezone

---
 back/app/services/timeline_service.rb       | 4 +---
 back/spec/services/timeline_service_spec.rb | 6 +++---
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/back/app/services/timeline_service.rb b/back/app/services/timeline_service.rb
index 4a4a6e30f948..862236963c7c 100644
--- a/back/app/services/timeline_service.rb
+++ b/back/app/services/timeline_service.rb
@@ -18,9 +18,7 @@ def past_phases(project, time = Time.now)
   def current_phase(project, time = Time.now)
     date = time.in_time_zone(AppConfiguration.instance.settings('core', 'timezone')).to_date
 
-    project.phases.find do |phase|
-      phase.start_at <= date && (phase.end_at.nil? || phase.end_at >= date)
-    end
+    project.phases.find { |phase| phase.start_at <= date && (phase.end_at.nil? || phase.end_at >= date) }
   end
 
   def phase_is_complete?(phase, time = Time.now)
diff --git a/back/spec/services/timeline_service_spec.rb b/back/spec/services/timeline_service_spec.rb
index 659ba410d820..016764ef2fc5 100644
--- a/back/spec/services/timeline_service_spec.rb
+++ b/back/spec/services/timeline_service_spec.rb
@@ -47,7 +47,7 @@
     it 'respects the tenant timezone' do
       phase = create(:phase, project: project, start_at: Date.new(2019, 9, 2), end_at: Date.new(2019, 9, 9))
 
-      t = Time.new(2019, 9, 9, 23) # 11 pm utc = 1 am Brussels == 8pm Santiage
+      t = Time.utc(2019, 9, 9, 23) # 11 pm utc = 1 am Brussels == 8pm Santiage
 
       settings = AppConfiguration.instance.settings
       settings['core']['timezone'] = 'Europe/Brussels'
@@ -159,7 +159,7 @@
       phase = create(:phase, start_at: Date.new(2019, 9, 2), end_at: Date.new(2019, 9, 9))
       project = phase.project
 
-      t = Time.new(2019, 9, 9, 23) # 11 pm utc = 1 am Brussels == 8pm Santiage
+      t = Time.utc(2019, 9, 9, 23) # 11 pm utc = 1 am Brussels == 8pm Santiage
 
       settings = AppConfiguration.instance.settings
       settings['core']['timezone'] = 'Europe/Brussels'
@@ -231,7 +231,7 @@
       phase = create(:phase, start_at: Date.new(2019, 9, 2), end_at: Date.new(2019, 9, 9))
       project = phase.project
 
-      travel_to Time.new(2019, 9, 9, 23) do # 11 pm utc = 1 am Brussels == 8pm Santiage
+      travel_to Time.utc(2019, 9, 9, 23) do # 11 pm utc = 1 am Brussels == 8pm Santiage
         settings = AppConfiguration.instance.settings
         settings['core']['timezone'] = 'Europe/Brussels'
         AppConfiguration.instance.update!(settings: settings)

From bf8da4312593fc2fc35b9d26389671980852b76b Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Thu, 29 Feb 2024 15:36:11 +0100
Subject: [PATCH 058/282] Fixes from code review

---
 front/app/components/EsriMap/index.tsx        | 26 ++++++++++--------
 front/app/components/EsriMap/utils.tsx        | 25 ++++++++++++++++-
 .../IdeationConfigurationMap.tsx              | 25 +++--------------
 .../PostShowComponents/DropdownMap/Map.tsx    | 27 ++-----------------
 .../EsriImportOptions.tsx                     |  5 +---
 .../GeoJsonImportButton.tsx                   |  2 +-
 .../Admin/tools/Esri/EsriKeyInput.tsx         | 18 ++++---------
 7 files changed, 51 insertions(+), 77 deletions(-)

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index 0a99569034cc..8eb78e8f71fc 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -104,16 +104,6 @@ const EsriMap = ({
   const mapRef = useRef<HTMLDivElement | null>(null);
   const initialValuesLoaded = useRef(false);
 
-  // Sets the locale of the map
-  intl.setLocale(locale);
-
-  // Set Esri API key
-  const esriApiKey =
-    appConfig?.data.attributes.settings.esri_integration?.api_key;
-  if (esriApiKey) {
-    esriConfig.apiKey = esriApiKey;
-  }
-
   // On initial render, create a new map and map view and save them to state variables
   useEffect(() => {
     if (mapRef.current) {
@@ -284,7 +274,7 @@ const EsriMap = ({
       if (mapView) {
         map.removeAll();
 
-        layers.map((layer) => {
+        layers.forEach((layer) => {
           map.add(layer);
         });
       }
@@ -339,6 +329,20 @@ const EsriMap = ({
     }
   }, [webMapId, layers, map, mapView]);
 
+  useEffect(() => {
+    // Sets the locale of the map
+    intl.setLocale(locale);
+  }, [locale]);
+
+  useEffect(() => {
+    // Set Esri API key
+    const esriApiKey =
+      appConfig?.data.attributes.settings.esri_integration?.api_key;
+    if (esriApiKey) {
+      esriConfig.apiKey = esriApiKey;
+    }
+  }, [appConfig?.data.attributes.settings.esri_integration?.api_key]);
+
   return (
     <>
       <MapContainer
diff --git a/front/app/components/EsriMap/utils.tsx b/front/app/components/EsriMap/utils.tsx
index 703856feee9e..d671e36a6432 100644
--- a/front/app/components/EsriMap/utils.tsx
+++ b/front/app/components/EsriMap/utils.tsx
@@ -28,6 +28,7 @@ import {
   DEFAULT_TILE_PROVIDER,
   MAPTILER_ATTRIBUTION,
 } from './constants';
+import { IMapConfig } from 'api/map_config/types';
 
 // getDefaultBasemap
 // Description: Gets the correct basemap given a certain tileProvider URL.
@@ -380,7 +381,7 @@ export const createEsriFeatureLayers = (
 ) => {
   // create new Feature Layers from the Map Config layers
   const esriLayers: Layer[] = [];
-  layers.map((layer) => {
+  layers.forEach((layer) => {
     if (localize(layer.title_multiloc)) {
       const title = localize(layer.title_multiloc);
 
@@ -413,6 +414,28 @@ export const createEsriFeatureLayers = (
   return esriLayers;
 };
 
+// parseLayers
+// Description: Parse the layers from the map config and create Esri layers
+export const parseLayers = (
+  mapConfig: IMapConfig | undefined,
+  localize: Localize
+) => {
+  const mapConfigLayers = mapConfig?.data.attributes.layers;
+  // All layers are either of type Esri or GeoJSON, so we can check just the first layer
+  if (
+    mapConfigLayers &&
+    mapConfigLayers[0]?.type === 'CustomMaps::GeojsonLayer'
+  ) {
+    return createEsriGeoJsonLayers(mapConfig?.data.attributes.layers, localize);
+  } else if (
+    mapConfigLayers &&
+    mapConfigLayers[0]?.type === 'CustomMaps::EsriFeatureLayer'
+  ) {
+    return createEsriFeatureLayers(mapConfig.data.attributes.layers, localize);
+  }
+  return [];
+};
+
 // createEsriGeoJsonLayers
 // Description: Create list of Esri GeoJSON layers from a list of IMapLayerAttributes
 export const createEsriGeoJsonLayers = (
diff --git a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
index 6d2c35b473c3..f31c12f09a75 100644
--- a/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
+++ b/front/app/components/IdeationConfigurationMap/IdeationConfigurationMap.tsx
@@ -10,11 +10,7 @@ import MapHelperOptions from './components/MapHelperOptions';
 import useLocalize from 'hooks/useLocalize';
 
 // utils
-import {
-  changeCursorOnHover,
-  createEsriFeatureLayers,
-  createEsriGeoJsonLayers,
-} from 'components/EsriMap/utils';
+import { changeCursorOnHover, parseLayers } from 'components/EsriMap/utils';
 
 // types
 import { IMapConfig } from 'api/map_config/types';
@@ -35,23 +31,8 @@ const IdeationConfigurationMap = memo<Props>(
 
     // Create layers from map config to add to Esri map
     const mapLayers = useMemo(() => {
-      const layers = mapConfig.data.attributes.layers;
-      if (layers && layers.length > 0) {
-        // All layers are either of type Esri or GeoJSON, so we can check just the first layer
-        if (layers[0]?.type === 'CustomMaps::GeojsonLayer') {
-          return createEsriGeoJsonLayers(
-            mapConfig.data.attributes.layers,
-            localize
-          );
-        } else if (layers[0]?.type === 'CustomMaps::EsriFeatureLayer') {
-          return createEsriFeatureLayers(
-            mapConfig.data.attributes.layers,
-            localize
-          );
-        }
-      }
-      return [];
-    }, [localize, mapConfig?.data?.attributes?.layers]);
+      return parseLayers(mapConfig, localize);
+    }, [mapConfig, localize]);
 
     const onMapInit = useCallback(
       (esriMapView: MapView) => {
diff --git a/front/app/components/PostShowComponents/DropdownMap/Map.tsx b/front/app/components/PostShowComponents/DropdownMap/Map.tsx
index 893d02d0c0dd..0447f60ab3c9 100644
--- a/front/app/components/PostShowComponents/DropdownMap/Map.tsx
+++ b/front/app/components/PostShowComponents/DropdownMap/Map.tsx
@@ -2,11 +2,7 @@ import EsriMap from 'components/EsriMap';
 import React, { memo, useMemo } from 'react';
 import Graphic from '@arcgis/core/Graphic';
 import Point from '@arcgis/core/geometry/Point';
-import {
-  createEsriFeatureLayers,
-  createEsriGeoJsonLayers,
-  getMapPinSymbol,
-} from 'components/EsriMap/utils';
+import { getMapPinSymbol, parseLayers } from 'components/EsriMap/utils';
 import { useTheme } from 'styled-components';
 import useMapConfig from 'api/map_config/useMapConfig';
 import useLocalize from 'hooks/useLocalize';
@@ -25,26 +21,7 @@ const MapComponent = memo<Props>(({ position, projectId }) => {
   // Load layers from project
   // Create Esri layers to add to map
   const layers = useMemo(() => {
-    const mapConfigLayers = mapConfig?.data.attributes.layers;
-    // All layers are either of type Esri or GeoJSON, so we can check just the first layer
-    if (
-      mapConfigLayers &&
-      mapConfigLayers[0]?.type === 'CustomMaps::GeojsonLayer'
-    ) {
-      return createEsriGeoJsonLayers(
-        mapConfig?.data.attributes.layers,
-        localize
-      );
-    } else if (
-      mapConfigLayers &&
-      mapConfigLayers[0]?.type === 'CustomMaps::EsriFeatureLayer'
-    ) {
-      return createEsriFeatureLayers(
-        mapConfig.data.attributes.layers,
-        localize
-      );
-    }
-    return [];
+    return parseLayers(mapConfig, localize);
   }, [mapConfig, localize]);
 
   // Create point graphic for idea location
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
index 3b970cb620a6..b90955515ebc 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
@@ -17,7 +17,6 @@ import useFeatureFlag from 'hooks/useFeatureFlag';
 
 // utils
 import { getLayerType } from './utils';
-import { isNilOrError } from 'utils/helperUtils';
 
 interface Props {
   projectId: string;
@@ -30,9 +29,7 @@ const EsriImportOptions = memo<Props>(({ setView, mapConfig }) => {
   const isEsriIntegrationEnabled = useFeatureFlag({ name: 'esri_integration' });
 
   const layerType = getLayerType(mapConfig);
-  const hasExistingWebMap = !isNilOrError(
-    mapConfig?.data?.attributes?.esri_web_map_id
-  );
+  const hasExistingWebMap = !!mapConfig.data.attributes.esri_web_map_id;
 
   const webMapUploadDisabled =
     hasExistingWebMap ||
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
index 9baeb0cb465a..306c61a2f2f9 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
@@ -78,7 +78,7 @@ const GeoJsonImportButton = memo<Props>(
     const [importError, setImportError] = useState(false);
 
     const layerType = getLayerType(mapConfig);
-    const hasExistingWebMap = !!mapConfig?.data?.attributes?.esri_web_map_id;
+    const hasExistingWebMap = !!mapConfig.data.attributes.esri_web_map_id;
 
     const handleGeoJsonImport = (event: any) => {
       const fileReader = new FileReader();
diff --git a/front/app/containers/Admin/tools/Esri/EsriKeyInput.tsx b/front/app/containers/Admin/tools/Esri/EsriKeyInput.tsx
index 8c36cf965b70..470de0bb39ba 100644
--- a/front/app/containers/Admin/tools/Esri/EsriKeyInput.tsx
+++ b/front/app/containers/Admin/tools/Esri/EsriKeyInput.tsx
@@ -18,7 +18,6 @@ import useFeatureFlag from 'hooks/useFeatureFlag';
 
 // utils
 import clHistory from 'utils/cl-router/history';
-import { invalidateQueryCache } from 'utils/cl-react-query/resetQueryCache';
 
 // intl
 import { useIntl } from 'utils/cl-intl';
@@ -39,20 +38,13 @@ const EsriKeyInput = () => {
   } = useUpdateAppConfiguration();
 
   const saveApiKey = () => {
-    updateAppConfiguration(
-      {
-        settings: {
-          esri_integration: {
-            api_key: apiKey,
-          },
+    updateAppConfiguration({
+      settings: {
+        esri_integration: {
+          api_key: apiKey,
         },
       },
-      {
-        onSuccess: () => {
-          invalidateQueryCache();
-        },
-      }
-    );
+    });
   };
 
   return (

From 04d9c2ca5bd602d0d35e2817ca751e052d9917d5 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Thu, 29 Feb 2024 17:55:20 +0100
Subject: [PATCH 059/282] Code cleanup

---
 front/app/components/EsriMap/index.tsx        | 29 ++++++++++++-------
 .../GeoJsonImportButton.tsx                   | 10 +++----
 2 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index 8eb78e8f71fc..fcdd0286bcfd 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -155,7 +155,7 @@ const EsriMap = ({
         minZoom: 5,
       };
 
-      // Set web map if it was provided
+      // Set Web Map if it was provided
       if (webMapId) {
         const webMap = new WebMap({
           portalItem: {
@@ -235,29 +235,34 @@ const EsriMap = ({
     webMapId,
   ]);
 
-  // Load dynamic data that was passed in.
-  // Note: This data is dynamic and may change.
+  // Following useEffects are used for loading dynamic data that is passed in.
+  // Description: This data is dynamic and may change during runtime.
+
   useEffect(() => {
     // Add any map layers which were passed in
 
-    // Handle when we're using a webmap
+    // If we're using a Web Map from ArcGIS Online, add the layers to the Web Map
     webMap?.when(() => {
       if (webMap && layers) {
-        // If there are any Web Map reference layers, re-order so they are below other layers created in our application
+        // If the Web Map has any reference layers, re-order so they sit below any additional layers that were uploaded or created in our application
+        // Reference layers: https://developers.arcgis.com/javascript/latest/api-reference/esri-Basemap.html#referenceLayers
         if (referenceLayers && referenceLayers.length > 0) {
+          // Get the current basemap layers
           const newBasemapLayers = webMap.basemap.baseLayers;
+          // Add the reference layers to the new basemap layers list
           webMap.addMany(referenceLayers.toArray());
+          // Set the WebMap basemap so it includes the Web Map reference layers
           webMap.basemap = new Basemap({
             baseLayers: newBasemapLayers,
           });
         }
 
-        // Add any layers passed in as props
+        // Add layers that passed in as props to the Web Map
         layers.forEach((layer) => {
           webMap.add(layer);
         });
 
-        // If we have WebMap reference layers, save them in state
+        // If the WebMap has reference layers, save them in state
         const refLayers =
           webMap.basemap.referenceLayers.length > 0
             ? webMap.basemap.referenceLayers
@@ -269,7 +274,9 @@ const EsriMap = ({
       }
     });
 
-    // Handle layers for the default map (when we're not using a Web Map)
+    // Add the layers to the default Map object
+    // Note: If we're using a Web Map and decide to remove it, then the default Map which appears again
+    // will already have any layers the admin added.
     if (map && layers) {
       if (mapView) {
         map.removeAll();
@@ -313,7 +320,7 @@ const EsriMap = ({
   }, [onHover, mapView]);
 
   useEffect(() => {
-    // Set web map if it was provided
+    // Set the Web Map if it was provided
     if (webMapId && mapView) {
       const webMap = new WebMap({
         portalItem: {
@@ -323,7 +330,7 @@ const EsriMap = ({
       mapView.map = webMap;
       setWebMap(webMap);
     } else if (mapView && map) {
-      // Else, set the default map
+      // Oterwise, we use the default Map
       mapView.map = map;
       setWebMap(null);
     }
@@ -335,7 +342,7 @@ const EsriMap = ({
   }, [locale]);
 
   useEffect(() => {
-    // Set Esri API key
+    // Set the Esri API key
     const esriApiKey =
       appConfig?.data.attributes.settings.esri_integration?.api_key;
     if (esriApiKey) {
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
index 306c61a2f2f9..954b5fa6e65c 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
@@ -80,6 +80,9 @@ const GeoJsonImportButton = memo<Props>(
     const layerType = getLayerType(mapConfig);
     const hasExistingWebMap = !!mapConfig.data.attributes.esri_web_map_id;
 
+    const geoJsonImportDisabled =
+      layerType === 'CustomMaps::EsriFeatureLayer' || hasExistingWebMap;
+
     const handleGeoJsonImport = (event: any) => {
       const fileReader = new FileReader();
       fileReader.readAsText(event.target.files[0], 'UTF-8');
@@ -125,16 +128,13 @@ const GeoJsonImportButton = memo<Props>(
             placement="top"
             content={formatMessage(messages.geojsonRemoveEsriTooltip)}
             hideOnClick={true}
-            disabled={layerType === 'CustomMaps::GeojsonLayer'}
+            disabled={!geoJsonImportDisabled}
           >
             <div>
               <StyledButton
                 icon="upload-file"
                 buttonStyle="secondary"
-                disabled={
-                  layerType === 'CustomMaps::EsriFeatureLayer' ||
-                  hasExistingWebMap
-                }
+                disabled={geoJsonImportDisabled}
               >
                 <StyledLabel aria-hidden htmlFor="file-attachment-uploader" />
                 <FormattedMessage {...messages.import} />

From 60b051244ab7fcac0a917a4d6ecd23619bc41e20 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Thu, 29 Feb 2024 18:08:30 +0100
Subject: [PATCH 060/282] Move components into folders

---
 .../{ => DataImportOptions}/EsriImportOptions.tsx   |   6 +++---
 .../{ => DataImportOptions}/FeatureLayerUpload.tsx  |   8 ++++----
 .../{ => DataImportOptions}/GeoJsonImportButton.tsx |   6 +++---
 .../{ => DataImportOptions}/WebMapUpload.tsx        |   6 +++---
 .../{ => LayerConfiguration}/MapLayerConfig.tsx     |   4 ++--
 .../{ => LayerConfiguration}/MapLayersList.tsx      |  10 +++++-----
 .../{ => LayerConfiguration}/addOrderingToLayers.ts |   0
 .../MapCenterAndZoomConfig.tsx                      |   4 ++--
 .../{ => MapConfiguration}/MapConfigOverview.tsx    |   8 ++++----
 .../esri_feature_url_example.png                    | Bin
 .../esri_portal_id_example.png                      | Bin
 .../Admin/ProjectCustomMapConfigPage/index.tsx      |   6 +++---
 12 files changed, 29 insertions(+), 29 deletions(-)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{ => DataImportOptions}/EsriImportOptions.tsx (96%)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{ => DataImportOptions}/FeatureLayerUpload.tsx (96%)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{ => DataImportOptions}/GeoJsonImportButton.tsx (96%)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{ => DataImportOptions}/WebMapUpload.tsx (97%)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{ => LayerConfiguration}/MapLayerConfig.tsx (99%)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{ => LayerConfiguration}/MapLayersList.tsx (97%)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{ => LayerConfiguration}/addOrderingToLayers.ts (100%)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{ => MapConfiguration}/MapCenterAndZoomConfig.tsx (98%)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{ => MapConfiguration}/MapConfigOverview.tsx (92%)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{images => TooltipImages}/esri_feature_url_example.png (100%)
 rename front/app/containers/Admin/ProjectCustomMapConfigPage/{images => TooltipImages}/esri_portal_id_example.png (100%)

diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/EsriImportOptions.tsx
similarity index 96%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/EsriImportOptions.tsx
index b90955515ebc..6efec434cd21 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/EsriImportOptions.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/EsriImportOptions.tsx
@@ -6,17 +6,17 @@ import Tippy from '@tippyjs/react';
 
 // intl
 import { useIntl } from 'utils/cl-intl';
-import messages from './messages';
+import messages from '../messages';
 
 // types
-import { ViewOptions } from '.';
+import { ViewOptions } from '..';
 import { IMapConfig } from 'api/map_config/types';
 
 // hooks
 import useFeatureFlag from 'hooks/useFeatureFlag';
 
 // utils
-import { getLayerType } from './utils';
+import { getLayerType } from '../utils';
 
 interface Props {
   projectId: string;
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/FeatureLayerUpload.tsx
similarity index 96%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/FeatureLayerUpload.tsx
index 7b3baa2ab2d9..8e5a58300f09 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/FeatureLayerUpload.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/FeatureLayerUpload.tsx
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
 
 // intl
 import { useIntl } from 'utils/cl-intl';
-import messages from './messages';
+import messages from '../messages';
 
 // components
 import Error from 'components/UI/Error';
@@ -15,10 +15,10 @@ import {
   Button,
   Success,
 } from '@citizenlab/cl2-component-library';
-import tooltipImage from './images/esri_feature_url_example.png';
+import tooltipImage from '../TooltipImages/esri_feature_url_example.png';
 
 // types
-import { ViewOptions } from '.';
+import { ViewOptions } from '..';
 
 // utils
 import { isNilOrError } from 'utils/helperUtils';
@@ -28,7 +28,7 @@ import { request, ErrorTypes, ApiKeyManager } from '@esri/arcgis-rest-request';
 import useAppConfigurationLocales from 'hooks/useAppConfigurationLocales';
 import useAddMapLayer from 'api/map_layers/useAddMapLayer';
 import useAppConfiguration from 'api/app_configuration/useAppConfiguration';
-import { getFeatureLayerInitialTitleMultiloc } from './utils';
+import { getFeatureLayerInitialTitleMultiloc } from '../utils';
 
 type Props = {
   projectId: string;
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/GeoJsonImportButton.tsx
similarity index 96%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/GeoJsonImportButton.tsx
index 954b5fa6e65c..51d5d309f71c 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/GeoJsonImportButton.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/GeoJsonImportButton.tsx
@@ -11,10 +11,10 @@ import Error from 'components/UI/Error';
 import useAppConfigurationLocales from 'hooks/useAppConfigurationLocales';
 
 // utils
-import { getUnnamedLayerTitleMultiloc } from '../../../utils/mapUtils/map';
+import { getUnnamedLayerTitleMultiloc } from '../../../../utils/mapUtils/map';
 
 // i18n
-import messages from './messages';
+import messages from '../messages';
 import { FormattedMessage, useIntl } from 'utils/cl-intl';
 
 // styling
@@ -23,7 +23,7 @@ import styled from 'styled-components';
 // components
 import Button from 'components/UI/Button';
 import { IMapConfig } from 'api/map_config/types';
-import { getLayerType } from './utils';
+import { getLayerType } from '../utils';
 import Tippy from '@tippyjs/react';
 
 const Container = styled.div``;
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/WebMapUpload.tsx
similarity index 97%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/WebMapUpload.tsx
index 9b80e01c172a..b533a94179e8 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/WebMapUpload.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/DataImportOptions/WebMapUpload.tsx
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
 
 // intl
 import { useIntl } from 'utils/cl-intl';
-import messages from './messages';
+import messages from '../messages';
 
 // components
 import Error from 'components/UI/Error';
@@ -15,10 +15,10 @@ import {
   Button,
   Success,
 } from '@citizenlab/cl2-component-library';
-import tooltipImage from './images/esri_portal_id_example.png';
+import tooltipImage from '../TooltipImages/esri_portal_id_example.png';
 
 // types
-import { ViewOptions } from '.';
+import { ViewOptions } from '..';
 
 // utils
 import { request, ErrorTypes, ApiKeyManager } from '@esri/arcgis-rest-request';
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayerConfig.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/MapLayerConfig.tsx
similarity index 99%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayerConfig.tsx
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/MapLayerConfig.tsx
index 1cfb9897f339..949b016dbbed 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayerConfig.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/MapLayerConfig.tsx
@@ -25,12 +25,12 @@ import {
   getGeojsonLayerType,
   makiIconNames,
   getUnnamedLayerTitleMultiloc,
-} from '../../../utils/mapUtils/map';
+} from '../../../../utils/mapUtils/map';
 
 // i18n
 import { injectIntl, FormattedMessage } from 'utils/cl-intl';
 import { WrappedComponentProps } from 'react-intl';
-import messages from './messages';
+import messages from '../messages';
 
 // styling
 import styled from 'styled-components';
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/MapLayersList.tsx
similarity index 97%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/MapLayersList.tsx
index 116de44bb3b6..f300dcc05496 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapLayersList.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/MapLayersList.tsx
@@ -12,25 +12,25 @@ import {
 import Tippy from '@tippyjs/react';
 import { SubSectionTitle } from 'components/admin/Section';
 import { SortableList, SortableRow } from 'components/admin/ResourceList';
-import GeoJsonImportButton from './GeoJsonImportButton';
-import EsriImportOptions from './EsriImportOptions';
+import GeoJsonImportButton from '../DataImportOptions/GeoJsonImportButton';
+import EsriImportOptions from '../DataImportOptions/EsriImportOptions';
 
 // hooks
 import useDeleteMapLayer from 'api/map_layers/useDeleteMapLayer';
 import useReorderMapLayer from 'api/map_layers/useReorderMapLayer';
 
 // utils
-import { getLayerColor, getLayerIcon } from '../../../utils/mapUtils/map';
+import { getLayerColor, getLayerIcon } from '../../../../utils/mapUtils/map';
 import addOrderingToLayers, {
   IMapLayerAttributesWithOrdering,
 } from './addOrderingToLayers';
-import { ViewOptions } from '.';
+import { ViewOptions } from '..';
 
 // i18n
 import { injectIntl, FormattedMessage } from 'utils/cl-intl';
 import injectLocalize, { InjectedLocalized } from 'utils/localize';
 import { WrappedComponentProps } from 'react-intl';
-import messages from './messages';
+import messages from '../messages';
 
 // styling
 import styled from 'styled-components';
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/addOrderingToLayers.ts b/front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/addOrderingToLayers.ts
similarity index 100%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/addOrderingToLayers.ts
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/addOrderingToLayers.ts
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapCenterAndZoomConfig.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfiguration/MapCenterAndZoomConfig.tsx
similarity index 98%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/MapCenterAndZoomConfig.tsx
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfiguration/MapCenterAndZoomConfig.tsx
index 72105725bf82..3d568f93134e 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapCenterAndZoomConfig.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfiguration/MapCenterAndZoomConfig.tsx
@@ -15,12 +15,12 @@ import { SubSectionTitle } from 'components/admin/Section';
 import MapView from '@arcgis/core/views/MapView';
 
 // utils
-import { getCenter, getZoomLevel } from '../../../utils/mapUtils/map';
+import { getCenter, getZoomLevel } from '../../../../utils/mapUtils/map';
 
 // i18n
 import { injectIntl, FormattedMessage } from 'utils/cl-intl';
 import { WrappedComponentProps } from 'react-intl';
-import messages from './messages';
+import messages from '../messages';
 
 // styling
 import styled from 'styled-components';
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfigOverview.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfiguration/MapConfigOverview.tsx
similarity index 92%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfigOverview.tsx
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfiguration/MapConfigOverview.tsx
index eda647a54643..deb10f1baefa 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfigOverview.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/MapConfiguration/MapConfigOverview.tsx
@@ -1,8 +1,8 @@
 import React, { memo, useState } from 'react';
 
 // components
-import MapLayersList from './MapLayersList';
-import MapLayerConfig from './MapLayerConfig';
+import MapLayersList from '../LayerConfiguration/MapLayersList';
+import MapLayerConfig from '../LayerConfiguration/MapLayerConfig';
 import MapCenterAndZoomConfig from './MapCenterAndZoomConfig';
 import { SectionTitle } from 'components/admin/Section';
 import Warning from 'components/UI/Warning';
@@ -11,11 +11,11 @@ import MapView from '@arcgis/core/views/MapView';
 
 // i18n
 import { FormattedMessage } from 'utils/cl-intl';
-import messages from './messages';
+import messages from '../messages';
 
 // styling
 import styled from 'styled-components';
-import { ViewOptions } from '.';
+import { ViewOptions } from '..';
 
 const Container = styled.div``;
 
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/images/esri_feature_url_example.png b/front/app/containers/Admin/ProjectCustomMapConfigPage/TooltipImages/esri_feature_url_example.png
similarity index 100%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/images/esri_feature_url_example.png
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/TooltipImages/esri_feature_url_example.png
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/images/esri_portal_id_example.png b/front/app/containers/Admin/ProjectCustomMapConfigPage/TooltipImages/esri_portal_id_example.png
similarity index 100%
rename from front/app/containers/Admin/ProjectCustomMapConfigPage/images/esri_portal_id_example.png
rename to front/app/containers/Admin/ProjectCustomMapConfigPage/TooltipImages/esri_portal_id_example.png
diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx
index 52e5ff2994fd..f900d9ddfcd9 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/index.tsx
@@ -4,7 +4,7 @@ import { useParams } from 'react-router-dom';
 // components
 import { Box, Spinner } from '@citizenlab/cl2-component-library';
 import Centerer from 'components/UI/Centerer';
-import MapConfigOverview from './MapConfigOverview';
+import MapConfigOverview from './MapConfiguration/MapConfigOverview';
 import MapView from '@arcgis/core/views/MapView';
 
 // hooks
@@ -19,8 +19,8 @@ import { getCenter, getZoomLevel } from '../../../utils/mapUtils/map';
 // styling
 import styled from 'styled-components';
 import IdeationConfigurationMap from '../../../components/IdeationConfigurationMap/IdeationConfigurationMap';
-import FeatureLayerUpload from './FeatureLayerUpload';
-import WebMapUpload from './WebMapUpload';
+import FeatureLayerUpload from './DataImportOptions/FeatureLayerUpload';
+import WebMapUpload from './DataImportOptions/WebMapUpload';
 
 const Container = styled.div`
   display: flex;

From 12caf198324377c8bbea1a675de48382d30372df Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Fri, 1 Mar 2024 10:00:58 +0100
Subject: [PATCH 061/282] Add code to utils file

---
 front/app/components/EsriMap/index.tsx | 151 +++++++------------------
 front/app/components/EsriMap/utils.tsx |  80 ++++++++++++-
 2 files changed, 122 insertions(+), 109 deletions(-)

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index fcdd0286bcfd..b7403cfd85a6 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -13,16 +13,17 @@ import Layer from '@arcgis/core/layers/Layer';
 import Graphic from '@arcgis/core/Graphic';
 import { Box, media, useBreakpoint } from '@citizenlab/cl2-component-library';
 import Fullscreen from '@arcgis/core/widgets/Fullscreen';
-import Point from '@arcgis/core/geometry/Point';
-import Expand from '@arcgis/core/widgets/Expand';
-import Legend from '@arcgis/core/widgets/Legend';
-import LayerList from '@arcgis/core/widgets/LayerList';
 import WebMap from '@arcgis/core/WebMap';
 import Collection from '@arcgis/core/core/Collection';
 
 // utils
-import { getDefaultBasemap } from './utils';
-import { isNil } from 'utils/helperUtils';
+import {
+  addMapLegend,
+  getDefaultBasemap,
+  handleWebMapReferenceLayers,
+  setMapCenter,
+  showLayerVisibilityControls,
+} from './utils';
 import { debounce } from 'lodash-es';
 import styled from 'styled-components';
 import * as intl from '@arcgis/core/intl.js';
@@ -69,7 +70,7 @@ export type EsriMapProps = {
   globalMapSettings: AppConfigurationMapSettings;
 };
 
-type InitialData = {
+export type InitialData = {
   center?: GeoJSON.Point | null;
   zoom?: number;
   maxZoom?: number;
@@ -96,11 +97,13 @@ const EsriMap = ({
   const locale = useLocale();
   const isMobileOrSmaller = useBreakpoint('phone');
   const { data: appConfig } = useAppConfiguration();
+
   const [map, setMap] = useState<Map | null>(null);
   const [webMap, setWebMap] = useState<WebMap | null>(null);
   const [mapView, setMapView] = useState<MapView | null>(null);
   const [referenceLayers, setReferenceLayers] =
     useState<Collection<Layer> | null>(null);
+
   const mapRef = useRef<HTMLDivElement | null>(null);
   const initialValuesLoaded = useRef(false);
 
@@ -108,9 +111,11 @@ const EsriMap = ({
   useEffect(() => {
     if (mapRef.current) {
       const newMap = new Map();
+      const webMap = webMapId && new WebMap({ portalItem: { id: webMapId } }); // If webMapId is provided, create a Web Map
+
       const mapView = new MapView({
         container: mapRef.current, // Reference to DOM node that will contain the view
-        map: newMap,
+        map: webMap || newMap, // Use the Web Map if it exists, or the default Map
         popupEnabled: false,
         popup: {
           dockEnabled: false,
@@ -121,31 +126,25 @@ const EsriMap = ({
       });
 
       setMap(newMap);
+      setWebMap(webMap || null);
       setMapView(mapView);
+
       return () => {
         mapView.destroy();
       };
     }
 
     return;
-  }, []);
+  }, [webMapId]);
 
   // Load initial map configuration data that was passed in.
   // Note: This data is static and will not change.
   useEffect(() => {
     if (!initialValuesLoaded.current && mapView && map) {
       // Set map center
-      mapView.center = !isNil(initialData?.center)
-        ? new Point({
-            latitude: initialData?.center.coordinates[1],
-            longitude: initialData?.center.coordinates[0],
-          })
-        : new Point({
-            latitude: Number(globalMapSettings.map_center?.lat) || 0,
-            longitude: Number(globalMapSettings.map_center?.long) || 0,
-          });
+      setMapCenter(mapView, initialData, globalMapSettings);
 
-      // Set the basemap
+      // Set the basemap & initial extent
       map.basemap = new Basemap({
         baseLayers: [getDefaultBasemap(globalMapSettings.tile_provider)],
       });
@@ -155,18 +154,6 @@ const EsriMap = ({
         minZoom: 5,
       };
 
-      // Set Web Map if it was provided
-      if (webMapId) {
-        const webMap = new WebMap({
-          portalItem: {
-            id: webMapId,
-          },
-        });
-
-        mapView.map = webMap;
-        setWebMap(webMap);
-      }
-
       // Change location of zoom widget if specified
       if (initialData?.zoomWidgetLocation === 'right') {
         const zoom = mapView.ui.find('zoom');
@@ -183,33 +170,12 @@ const EsriMap = ({
 
       // Add map legend if set
       if (initialData?.showLegend) {
-        const legend = new Expand({
-          content: new Legend({
-            view: mapView,
-            hideLayersNotInCurrentView: false,
-            style: { type: 'classic', layout: 'stack' },
-          }),
-          view: mapView,
-          expanded: isMobileOrSmaller ? false : true,
-          mode: 'floating',
-        });
-
-        mapView.ui.add(legend, 'bottom-right');
+        addMapLegend(mapView, isMobileOrSmaller);
       }
 
       // Show layer visibility controls if set
       if (initialData?.showLayerVisibilityControl) {
-        const layerList = new Expand({
-          content: new LayerList({
-            view: mapView,
-          }),
-          view: mapView,
-          expanded: false,
-          mode: 'floating',
-        });
-        mapView.ui.add(layerList, {
-          position: 'bottom-right',
-        });
+        showLayerVisibilityControls(mapView);
       }
 
       // Add any ui elements that were passed in
@@ -233,51 +199,17 @@ const EsriMap = ({
     map,
     mapView,
     webMapId,
+    webMap,
   ]);
 
-  // Following useEffects are used for loading dynamic data that is passed in.
+  // The following useEffects are used for handling dynamic data that is passed in.
   // Description: This data is dynamic and may change during runtime.
 
   useEffect(() => {
     // Add any map layers which were passed in
 
-    // If we're using a Web Map from ArcGIS Online, add the layers to the Web Map
-    webMap?.when(() => {
-      if (webMap && layers) {
-        // If the Web Map has any reference layers, re-order so they sit below any additional layers that were uploaded or created in our application
-        // Reference layers: https://developers.arcgis.com/javascript/latest/api-reference/esri-Basemap.html#referenceLayers
-        if (referenceLayers && referenceLayers.length > 0) {
-          // Get the current basemap layers
-          const newBasemapLayers = webMap.basemap.baseLayers;
-          // Add the reference layers to the new basemap layers list
-          webMap.addMany(referenceLayers.toArray());
-          // Set the WebMap basemap so it includes the Web Map reference layers
-          webMap.basemap = new Basemap({
-            baseLayers: newBasemapLayers,
-          });
-        }
-
-        // Add layers that passed in as props to the Web Map
-        layers.forEach((layer) => {
-          webMap.add(layer);
-        });
-
-        // If the WebMap has reference layers, save them in state
-        const refLayers =
-          webMap.basemap.referenceLayers.length > 0
-            ? webMap.basemap.referenceLayers
-            : undefined;
-
-        if (refLayers?.length && refLayers.length > 0) {
-          setReferenceLayers(refLayers);
-        }
-      }
-    });
-
-    // Add the layers to the default Map object
-    // Note: If we're using a Web Map and decide to remove it, then the default Map which appears again
-    // will already have any layers the admin added.
-    if (map && layers) {
+    // If we're not using a Web Map, add the layers to the default Map object
+    if (map && layers && !webMap) {
       if (mapView) {
         map.removeAll();
 
@@ -286,6 +218,23 @@ const EsriMap = ({
         });
       }
     }
+
+    // Otherwise add the layers into the WebMap
+    webMap &&
+      webMap.when(() => {
+        if (layers) {
+          // If the Web Map has any reference layers, re-order them so the layer hierarchy is correct
+          if (referenceLayers && referenceLayers.length > 0) {
+            handleWebMapReferenceLayers(webMap, referenceLayers);
+          }
+          // Now, add any additional layers that passed in as props to the Web Map
+          layers.forEach((layer) => {
+            webMap.add(layer);
+          });
+          // If the WebMap has reference layers, save them in state
+          setReferenceLayers(webMap.basemap?.referenceLayers || null);
+        }
+      });
   }, [layers, map, mapView, referenceLayers, webMap]);
 
   useEffect(() => {
@@ -319,22 +268,10 @@ const EsriMap = ({
     }
   }, [onHover, mapView]);
 
+  // If webMapId changes, re-load the initial settings
   useEffect(() => {
-    // Set the Web Map if it was provided
-    if (webMapId && mapView) {
-      const webMap = new WebMap({
-        portalItem: {
-          id: webMapId,
-        },
-      });
-      mapView.map = webMap;
-      setWebMap(webMap);
-    } else if (mapView && map) {
-      // Oterwise, we use the default Map
-      mapView.map = map;
-      setWebMap(null);
-    }
-  }, [webMapId, layers, map, mapView]);
+    initialValuesLoaded.current = false;
+  }, [webMapId]);
 
   useEffect(() => {
     // Sets the locale of the map
diff --git a/front/app/components/EsriMap/utils.tsx b/front/app/components/EsriMap/utils.tsx
index d671e36a6432..d219cc0b3dd6 100644
--- a/front/app/components/EsriMap/utils.tsx
+++ b/front/app/components/EsriMap/utils.tsx
@@ -14,9 +14,15 @@ import FeatureReductionCluster from '@arcgis/core/layers/support/FeatureReductio
 import MapView from '@arcgis/core/views/MapView';
 import SimpleLineSymbol from '@arcgis/core/symbols/SimpleLineSymbol';
 import FeatureLayer from '@arcgis/core/layers/FeatureLayer';
+import Basemap from '@arcgis/core/Basemap';
+import Collection from '@arcgis/core/core/Collection';
+import WebMap from '@arcgis/core/WebMap';
+import Expand from '@arcgis/core/widgets/Expand';
+import LayerList from '@arcgis/core/widgets/LayerList';
+import Legend from '@arcgis/core/widgets/Legend';
 
 // utils
-import { hexToRGBA } from 'utils/helperUtils';
+import { hexToRGBA, isNil } from 'utils/helperUtils';
 
 // types
 import { Localize } from 'hooks/useLocalize';
@@ -29,6 +35,8 @@ import {
   MAPTILER_ATTRIBUTION,
 } from './constants';
 import { IMapConfig } from 'api/map_config/types';
+import { InitialData } from '.';
+import { AppConfigurationMapSettings } from 'api/app_configuration/types';
 
 // getDefaultBasemap
 // Description: Gets the correct basemap given a certain tileProvider URL.
@@ -271,7 +279,6 @@ export const goToMapLocation = async (
       },
       {
         duration: 1000,
-        easing: 'ease-in-out',
       }
     )
     .catch(() => {
@@ -517,3 +524,72 @@ export const createEsriGeoJsonLayers = (
     return geoJsonLayer;
   });
 };
+
+// handleWebMapReferenceLayers
+// Description: Re-order any reference layers which are part of the WebMap's basemap
+// These need to be re-ordered so they appear underneath any additional layers we create (E.g. Idea pins)
+// API doc: https://developers.arcgis.com/javascript/latest/api-reference/esri-Basemap.html#referenceLayers
+export const handleWebMapReferenceLayers = (
+  webMap: WebMap,
+  referenceLayers: Collection<Layer>
+) => {
+  // Add current basemap layers to new variable
+  const newBasemapLayers = webMap.basemap?.baseLayers;
+  // Append the reference layers to the new basemap layers list
+  webMap.addMany(referenceLayers.toArray());
+  // Set the WebMap basemap to this new list of layers
+  webMap.basemap = new Basemap({
+    baseLayers: newBasemapLayers,
+  });
+};
+
+// showLayerVisibilityControls
+// Description: Shows the layer visibility controls on the map
+export const showLayerVisibilityControls = (mapView: MapView) => {
+  const layerList = new Expand({
+    content: new LayerList({
+      view: mapView,
+    }),
+    view: mapView,
+    expanded: false,
+    mode: 'floating',
+  });
+  mapView.ui.add(layerList, {
+    position: 'bottom-right',
+  });
+};
+
+// addMapLegend
+// Description: Adds a legend to the map
+export const addMapLegend = (mapView: MapView, isMobileOrSmaller: boolean) => {
+  const legend = new Expand({
+    content: new Legend({
+      view: mapView,
+      hideLayersNotInCurrentView: false,
+      style: { type: 'classic', layout: 'stack' },
+    }),
+    view: mapView,
+    expanded: isMobileOrSmaller ? false : true,
+    mode: 'floating',
+  });
+
+  mapView.ui.add(legend, 'bottom-right');
+};
+
+// setMapCenter
+// Description: Set the center of the map
+export const setMapCenter = (
+  mapView: MapView,
+  initialData: InitialData | undefined,
+  globalMapSettings: AppConfigurationMapSettings
+) => {
+  mapView.center = !isNil(initialData?.center)
+    ? new Point({
+        latitude: initialData?.center.coordinates[1],
+        longitude: initialData?.center.coordinates[0],
+      })
+    : new Point({
+        latitude: Number(globalMapSettings.map_center?.lat) || 0,
+        longitude: Number(globalMapSettings.map_center?.long) || 0,
+      });
+};

From 5fe2389d64590dc7e0ebf62dc05b0ee0b72879ef Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Fri, 1 Mar 2024 11:08:19 +0100
Subject: [PATCH 062/282] UI tweak - we don't need to show double maps when
 browsing idea map

---
 .../components/MetaInformation/Location.tsx          | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/front/app/containers/IdeasShow/components/MetaInformation/Location.tsx b/front/app/containers/IdeasShow/components/MetaInformation/Location.tsx
index 2a6152935d3d..f6bb7311c70e 100644
--- a/front/app/containers/IdeasShow/components/MetaInformation/Location.tsx
+++ b/front/app/containers/IdeasShow/components/MetaInformation/Location.tsx
@@ -101,11 +101,13 @@ const Location = memo<Props>(({ ideaId, compact, className }) => {
                 </Button>
               </Box>
 
-              <Box width="100%" mt="8px" id="e2e-location-map">
-                <IdeaLocationMap
-                  location={idea?.data.attributes?.location_point_geojson}
-                />
-              </Box>
+              {!compact && (
+                <Box width="100%" mt="8px" id="e2e-location-map">
+                  <IdeaLocationMap
+                    location={idea?.data.attributes?.location_point_geojson}
+                  />
+                </Box>
+              )}
             </Box>
           )}
 

From aa68e6e3bf9ced1e5f09a1eef202aab046a9e834 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Fri, 1 Mar 2024 11:14:38 +0100
Subject: [PATCH 063/282] Cleanup

---
 front/app/components/EsriMap/utils.tsx  |  4 ++--
 front/app/components/IdeasMap/index.tsx | 19 ++-----------------
 2 files changed, 4 insertions(+), 19 deletions(-)

diff --git a/front/app/components/EsriMap/utils.tsx b/front/app/components/EsriMap/utils.tsx
index d219cc0b3dd6..5a46bfa1fab7 100644
--- a/front/app/components/EsriMap/utils.tsx
+++ b/front/app/components/EsriMap/utils.tsx
@@ -424,7 +424,7 @@ export const createEsriFeatureLayers = (
 // parseLayers
 // Description: Parse the layers from the map config and create Esri layers
 export const parseLayers = (
-  mapConfig: IMapConfig | undefined,
+  mapConfig: IMapConfig | null | undefined,
   localize: Localize
 ) => {
   const mapConfigLayers = mapConfig?.data.attributes.layers;
@@ -438,7 +438,7 @@ export const parseLayers = (
     mapConfigLayers &&
     mapConfigLayers[0]?.type === 'CustomMaps::EsriFeatureLayer'
   ) {
-    return createEsriFeatureLayers(mapConfig.data.attributes.layers, localize);
+    return createEsriFeatureLayers(mapConfig?.data.attributes.layers, localize);
   }
   return [];
 };
diff --git a/front/app/components/IdeasMap/index.tsx b/front/app/components/IdeasMap/index.tsx
index 370421f96d13..a1fae59712e7 100644
--- a/front/app/components/IdeasMap/index.tsx
+++ b/front/app/components/IdeasMap/index.tsx
@@ -37,14 +37,13 @@ import useAuthUser from 'api/me/useAuthUser';
 
 // utils
 import {
-  createEsriGeoJsonLayers,
   getMapPinSymbol,
   getClusterConfiguration,
   showAddInputPopup,
   goToMapLocation,
   esriPointToGeoJson,
   changeCursorOnHover,
-  createEsriFeatureLayers,
+  parseLayers,
 } from 'components/EsriMap/utils';
 import {
   InnerContainer,
@@ -197,21 +196,7 @@ const IdeasMap = memo<Props>(
 
     // Create Esri layers from mapConfig layers
     const mapLayers = useMemo(() => {
-      const layers = mapConfig?.data.attributes.layers;
-
-      // All layers are either of type Esri or GeoJSON, so we can check just the first layer
-      if (layers && layers[0]?.type === 'CustomMaps::GeojsonLayer') {
-        return createEsriGeoJsonLayers(
-          mapConfig?.data.attributes.layers,
-          localize
-        );
-      } else if (layers && layers[0]?.type === 'CustomMaps::EsriFeatureLayer') {
-        return createEsriFeatureLayers(
-          mapConfig.data.attributes.layers,
-          localize
-        );
-      }
-      return [];
+      return parseLayers(mapConfig, localize);
     }, [mapConfig, localize]);
 
     // Create a point graphics layer for idea pins

From 0344ec039fd9dcd9cbe1ea97af2e018e4f17bf48 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 1 Mar 2024 16:25:58 +0100
Subject: [PATCH 064/282] Fix tests that fail with `raise_exception: true`

---
 .../mention_in_official_feedback_mailer.rb    |  2 +-
 .../project_published_mailer.rb               |  2 +-
 .../admin_digest_mailer/_statistics.mjml      | 20 +++++++++++---
 .../campaign_mail.mjml                        | 26 ++++++++++++++-----
 4 files changed, 37 insertions(+), 13 deletions(-)

diff --git a/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb b/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb
index b39c696c3507..048c3069b088 100644
--- a/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb
+++ b/back/engines/free/email_campaigns/app/mailers/email_campaigns/mention_in_official_feedback_mailer.rb
@@ -31,7 +31,7 @@ def header_message
     def preheader
       # initiating_user_first_name is never present.
       # TODO: fix. We previously removed this field from the event https://github.com/CitizenLabDotCo/citizenlab/commit/72a778f#diff-f9b809a7dcedf9fd13177f3b9b05ac24ddde8f5f36d197d65e256c20b22ae62aL25
-      format_message('preheader', values: { commentAuthor: event.initiating_user_first_name })
+      format_message('preheader', values: { commentAuthor: event['initiating_user_first_name'] })
     end
   end
 end
diff --git a/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb b/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb
index 1c6cff1a4ac1..a37b16931489 100644
--- a/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb
+++ b/back/engines/free/email_campaigns/app/mailers/email_campaigns/project_published_mailer.rb
@@ -18,7 +18,7 @@ def header_message
         values: {
           # post_title_multiloc is never present.
           # TODO: fix. We previously removed this field from the event https://github.com/CitizenLabDotCo/citizenlab/pull/5556/files#diff-ade4ca4ef24ba6dab628047c521bfc1addf2e0255d401c931124ec7fea5a07f0L78
-          ideaTitle: localize_for_recipient(event.post_title_multiloc),
+          ideaTitle: localize_for_recipient(event['post_title_multiloc']),
           organizationName: organization_name
         }
       )
diff --git a/back/engines/free/email_campaigns/app/views/email_campaigns/admin_digest_mailer/_statistics.mjml b/back/engines/free/email_campaigns/app/views/email_campaigns/admin_digest_mailer/_statistics.mjml
index ea1c172e557a..1353c6e1e07c 100644
--- a/back/engines/free/email_campaigns/app/views/email_campaigns/admin_digest_mailer/_statistics.mjml
+++ b/back/engines/free/email_campaigns/app/views/email_campaigns/admin_digest_mailer/_statistics.mjml
@@ -4,7 +4,11 @@
   <mj-section padding="25px" border="1px solid #EAEAEA" border-radius="5px">
     <mj-column>
       <mj-text font-size="28px" align="center" font-weight="700">
-        <%= count_from(event.statistics.new_users_increase) %>
+        <%# TODO: replace [''] with method call. Currently, the tests fail (if WhinyOpenStruct is initialized with `raise_exception: true``)
+        because they use (https://github.com/CitizenLabDotCo/citizenlab/blob/5370e4e8eea41c7b577247e1e8a020bed0b7a908/back/engines/free/email_campaigns/spec/mailers/admin_digest_mailer_spec.rb#L18)
+        an outdated `activities` field that was removed in this PR https://github.com/CitizenLabDotCo/citizenlab/pull/5808/files %>
+        <%# TODO: fix tests by using `Campaigns::AdminDigest#generate_commands` in tests instead of building the command hash. %>
+        <%= count_from(event.statistics['new_users_increase']) %>
         <img
           alt="User icon"
           width="29px"
@@ -18,7 +22,11 @@
 
     <mj-column>
       <mj-text font-size="28px" align="center" font-weight="700">
-        <%= count_from(event.statistics.new_ideas_increase) %>
+        <%# TODO: replace [''] with method call. Currently, the tests fail (if WhinyOpenStruct is initialized with `raise_exception: true``)
+        because they use (https://github.com/CitizenLabDotCo/citizenlab/blob/5370e4e8eea41c7b577247e1e8a020bed0b7a908/back/engines/free/email_campaigns/spec/mailers/admin_digest_mailer_spec.rb#L18)
+        an outdated `activities` field that was removed in this PR https://github.com/CitizenLabDotCo/citizenlab/pull/5808/files %>
+        <%# TODO: fix tests by using `Campaigns::AdminDigest#generate_commands` in tests instead of building the command hash. %>
+        <%= count_from(event.statistics['new_ideas_increase']) %>
         <img
           alt="Idea icon"
           width="24px"
@@ -32,7 +40,11 @@
 
     <mj-column>
       <mj-text font-size="28px" align="center" font-weight="700">
-        <%= count_from(event.statistics.new_comments_increase) %>
+        <%# TODO: replace [''] with method call. Currently, the tests fail (if WhinyOpenStruct is initialized with `raise_exception: true``)
+        because they use (https://github.com/CitizenLabDotCo/citizenlab/blob/5370e4e8eea41c7b577247e1e8a020bed0b7a908/back/engines/free/email_campaigns/spec/mailers/admin_digest_mailer_spec.rb#L18)
+        an outdated `activities` field that was removed in this PR https://github.com/CitizenLabDotCo/citizenlab/pull/5808/files %>
+        <%# TODO: fix tests by using `Campaigns::AdminDigest#generate_commands` in tests instead of building the command hash. %>
+        <%= count_from(event.statistics['new_comments_increase']) %>
         <img
           alt="Comment icon"
           width="26px"
@@ -44,4 +56,4 @@
       </mj-text>
     </mj-column>
   </mj-section>
-</mj-wrapper>
\ No newline at end of file
+</mj-wrapper>
diff --git a/back/engines/free/email_campaigns/app/views/email_campaigns/moderator_digest_mailer/campaign_mail.mjml b/back/engines/free/email_campaigns/app/views/email_campaigns/moderator_digest_mailer/campaign_mail.mjml
index 37f451df6ca1..ec52c482f36e 100644
--- a/back/engines/free/email_campaigns/app/views/email_campaigns/moderator_digest_mailer/campaign_mail.mjml
+++ b/back/engines/free/email_campaigns/app/views/email_campaigns/moderator_digest_mailer/campaign_mail.mjml
@@ -21,7 +21,11 @@
   >
     <mj-column>
       <mj-text font-size="28px" align="center" font-weight="700">
-        <%= event.statistics.new_participants_increase %>
+        <%# TODO: replace [''] with method call. Currently, the tests fail (if WhinyOpenStruct is initialized with `raise_exception: true``)
+        because they use (https://github.com/CitizenLabDotCo/citizenlab/blob/5370e4e8eea41c7b577247e1e8a020bed0b7a908/back/engines/free/email_campaigns/spec/mailers/moderator_digest_mailer_spec.rb#L20) an outdated `activities` %>
+        <%# field that was removed in this PR https://github.com/CitizenLabDotCo/citizenlab/pull/5808/files %>
+        <%# TODO: fix tests by using `Campaigns::ModeratorDigest#generate_commands` in tests instead of building the command hash. %>
+        <%= event.statistics['new_participants_increase'] %>
         <img
           alt="User icon"
           width="29px"
@@ -35,7 +39,11 @@
 
     <mj-column>
       <mj-text font-size="28px" align="center" font-weight="700">
-        <%= event.statistics.new_ideas_increase %>
+        <%# TODO: replace [''] with method call. Currently, the tests fail (if WhinyOpenStruct is initialized with `raise_exception: true``)
+        because they use (https://github.com/CitizenLabDotCo/citizenlab/blob/5370e4e8eea41c7b577247e1e8a020bed0b7a908/back/engines/free/email_campaigns/spec/mailers/moderator_digest_mailer_spec.rb#L20) an outdated `activities` %>
+        <%# field that was removed in this PR https://github.com/CitizenLabDotCo/citizenlab/pull/5808/files %>
+        <%# TODO: fix tests by using `Campaigns::ModeratorDigest#generate_commands` in tests instead of building the command hash. %>
+        <%= event.statistics['new_ideas_increase'] %>
         <img
           alt="Idea icon"
           width="24px"
@@ -49,7 +57,11 @@
 
     <mj-column>
       <mj-text font-size="28px" align="center" font-weight="700">
-        <%= event.statistics.new_comments_increase %>
+        <%# TODO: replace [''] with method call. Currently, the tests fail (if WhinyOpenStruct is initialized with `raise_exception: true``)
+        because they use (https://github.com/CitizenLabDotCo/citizenlab/blob/5370e4e8eea41c7b577247e1e8a020bed0b7a908/back/engines/free/email_campaigns/spec/mailers/moderator_digest_mailer_spec.rb#L20) an outdated `activities` %>
+        <%# field that was removed in this PR https://github.com/CitizenLabDotCo/citizenlab/pull/5808/files %>
+        <%# TODO: fix tests by using `Campaigns::ModeratorDigest#generate_commands` in tests instead of building the command hash. %>
+        <%= event.statistics['new_comments_increase'] %>
         <img
           alt="Comment icon"
           width="26px"
@@ -85,9 +97,9 @@
   </mj-column>
 </mj-section>
 
-<%= 
-  render partial: 'application/cta_button', 
-  locals: { 
+<%=
+  render partial: 'application/cta_button',
+  locals: {
   href:  "#{url_service.admin_project_url(event.project_id)}",
-  message: format_message('cta_manage') } 
+  message: format_message('cta_manage') }
 %>

From 2b381863c5895ea358373df60f0e6af095deb76b Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 1 Mar 2024 17:07:11 +0100
Subject: [PATCH 065/282] Avoid preview failures if unfollow_url is not set

---
 .../app/views/email_campaigns/follow/_card.mjml          | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/back/engines/free/email_campaigns/app/views/email_campaigns/follow/_card.mjml b/back/engines/free/email_campaigns/app/views/email_campaigns/follow/_card.mjml
index 0c322acf289b..f9299c9ff789 100644
--- a/back/engines/free/email_campaigns/app/views/email_campaigns/follow/_card.mjml
+++ b/back/engines/free/email_campaigns/app/views/email_campaigns/follow/_card.mjml
@@ -1,7 +1,12 @@
 <mj-section padding="20px 25px 10px">
   <mj-column>
     <mj-text>
-      <p><%= format_message('unfollow_here', component: 'follow', values: { unfollow_url: event.unfollow_url }, escape_html: false) %></p>
+      <%# TODO: replace [''] with method call. Currently, the preview fails (if WhinyOpenStruct is initialized with `raise_exception: true``)
+        because it builds not correct hash that doesn't contain `unfollow_url`.
+        Use `Campaigns#generate_commands` instead of building the hash.
+        Affected previews: official_feedback_on_idea_you_follow_mailer, official_feedback_on_initiative_you_follow_mailer, project_phase_started_mailer
+      %>
+      <p><%= format_message('unfollow_here', component: 'follow', values: { unfollow_url: event['unfollow_url'] }, escape_html: false) %></p>
     </mj-text>
   </mj-column>
-</mj-section>
\ No newline at end of file
+</mj-section>

From a086565c0531223dd39656391529453b1c1d009c Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 1 Mar 2024 17:25:55 +0100
Subject: [PATCH 066/282] Add to `make migrate` rake tasks the same as on
 production

---
 Makefile | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Makefile b/Makefile
index fbdcfd912082..43edd631824a 100644
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,7 @@ reset-dev-env:
 	docker-compose run --rm -e RAILS_ENV=test web bin/rails db:drop db:create db:schema:load
 
 migrate:
-	docker-compose run --rm web bin/rails db:migrate
+	docker-compose run --rm web bin/rails db:migrate cl2back:clean_tenant_settings email_campaigns:assure_campaign_records fix_existing_tenants:update_permissions cl2back:clear_cache_store email_campaigns:remove_deprecated
 
 be-up:
 	docker-compose up
@@ -61,12 +61,12 @@ add-campaign-and-notification:
 blint back-lint-autocorrect:
 	docker compose run web bundle exec rubocop -P --format simple --autocorrect
 
-# Usage example: 
+# Usage example:
 # make r file=spec/models/idea_spec.rb
 r rspec:
 	docker-compose run --rm web bin/rspec ${file}
 
-# Usage example: 
+# Usage example:
 # make feature-toggle feature=initiative_cosponsors enabled=true
 feature-toggle:
 	docker-compose run web "bin/rails runner \"enabled = ${enabled}; feature = '${feature}'; Tenant.find_by(host: 'localhost').switch!; c = AppConfiguration.first; c.settings['${feature}'] ||= {}; c.settings['${feature}']['allowed'] = ${enabled}; c.settings['${feature}']['enabled'] = ${enabled}; c.save!\""

From 8f6311933557f49b8ef4e702d29ec5b09d40a8d7 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Mon, 4 Mar 2024 11:28:14 +0000
Subject: [PATCH 067/282] Restructure EsriMap

---
 front/app/components/EsriMap/config.ts | 109 +++++++++++++
 front/app/components/EsriMap/index.tsx | 215 ++++++++++---------------
 front/app/components/EsriMap/types.ts  |  14 ++
 front/app/components/EsriMap/utils.tsx |  58 +------
 4 files changed, 209 insertions(+), 187 deletions(-)
 create mode 100644 front/app/components/EsriMap/config.ts

diff --git a/front/app/components/EsriMap/config.ts b/front/app/components/EsriMap/config.ts
new file mode 100644
index 000000000000..52bf5eb5c5fc
--- /dev/null
+++ b/front/app/components/EsriMap/config.ts
@@ -0,0 +1,109 @@
+import Fullscreen from '@arcgis/core/widgets/Fullscreen';
+import Point from '@arcgis/core/geometry/Point';
+import Legend from '@arcgis/core/widgets/Legend';
+import Expand from '@arcgis/core/widgets/Expand';
+import LayerList from '@arcgis/core/widgets/LayerList';
+
+// typings
+import MapView from '@arcgis/core/views/MapView';
+import { InitialData } from './types';
+import { AppConfigurationMapSettings } from 'api/app_configuration/types';
+
+export const configureMapView = (
+  mapView: MapView,
+  initialData: InitialData | undefined,
+  globalMapSettings: AppConfigurationMapSettings,
+  isMobileOrSmaller: boolean
+) => {
+  // Set map center
+  setMapCenter(mapView, initialData, globalMapSettings);
+
+  // Set initial extent
+  mapView.zoom = initialData?.zoom || globalMapSettings.zoom_level || 18;
+  mapView.constraints = {
+    maxZoom: initialData?.maxZoom || 22,
+    minZoom: 5,
+  };
+
+  // Change location of zoom widget if specified
+  if (initialData?.zoomWidgetLocation === 'right') {
+    const zoom = mapView.ui.find('zoom');
+    mapView.ui.add(zoom, 'top-right');
+  }
+
+  // Add fullscreen widget if set
+  if (initialData?.showFullscreenOption) {
+    const fullscreen = new Fullscreen({
+      view: mapView,
+    });
+    mapView.ui.add(fullscreen, 'top-right');
+  }
+
+  // Add map legend if set
+  if (initialData?.showLegend) {
+    addMapLegend(mapView, isMobileOrSmaller);
+  }
+
+  // Show layer visibility controls if set
+  if (initialData?.showLayerVisibilityControl) {
+    showLayerVisibilityControls(mapView);
+  }
+
+  // Add any ui elements that were passed in
+  if (initialData?.uiElements && mapView) {
+    initialData?.uiElements.forEach((uiElement) => {
+      mapView.ui.add(uiElement.element, uiElement.position);
+    });
+  }
+};
+
+// setMapCenter
+// Description: Set the center of the map
+export const setMapCenter = (
+  mapView: MapView,
+  initialData: InitialData | undefined,
+  globalMapSettings: AppConfigurationMapSettings
+) => {
+  mapView.center = initialData?.center
+    ? new Point({
+        latitude: initialData?.center.coordinates[1],
+        longitude: initialData?.center.coordinates[0],
+      })
+    : new Point({
+        latitude: Number(globalMapSettings.map_center?.lat) || 0,
+        longitude: Number(globalMapSettings.map_center?.long) || 0,
+      });
+};
+
+// addMapLegend
+// Description: Adds a legend to the map
+export const addMapLegend = (mapView: MapView, isMobileOrSmaller: boolean) => {
+  const legend = new Expand({
+    content: new Legend({
+      view: mapView,
+      hideLayersNotInCurrentView: false,
+      style: { type: 'classic', layout: 'stack' },
+    }),
+    view: mapView,
+    expanded: isMobileOrSmaller ? false : true,
+    mode: 'floating',
+  });
+
+  mapView.ui.add(legend, 'bottom-right');
+};
+
+// showLayerVisibilityControls
+// Description: Shows the layer visibility controls on the map
+export const showLayerVisibilityControls = (mapView: MapView) => {
+  const layerList = new Expand({
+    content: new LayerList({
+      view: mapView,
+    }),
+    view: mapView,
+    expanded: false,
+    mode: 'floating',
+  });
+  mapView.ui.add(layerList, {
+    position: 'bottom-right',
+  });
+};
diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index b7403cfd85a6..0ba0d6a4ebee 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -12,25 +12,19 @@ import Basemap from '@arcgis/core/Basemap';
 import Layer from '@arcgis/core/layers/Layer';
 import Graphic from '@arcgis/core/Graphic';
 import { Box, media, useBreakpoint } from '@citizenlab/cl2-component-library';
-import Fullscreen from '@arcgis/core/widgets/Fullscreen';
 import WebMap from '@arcgis/core/WebMap';
 import Collection from '@arcgis/core/core/Collection';
 
 // utils
-import {
-  addMapLegend,
-  getDefaultBasemap,
-  handleWebMapReferenceLayers,
-  setMapCenter,
-  showLayerVisibilityControls,
-} from './utils';
+import { getDefaultBasemap, handleWebMapReferenceLayers } from './utils';
+import { configureMapView } from './config';
 import { debounce } from 'lodash-es';
 import styled from 'styled-components';
 import * as intl from '@arcgis/core/intl.js';
 import esriConfig from '@arcgis/core/config';
 
 // typings
-import { EsriUiElement } from './types';
+import { InitialData } from './types';
 import { AppConfigurationMapSettings } from 'api/app_configuration/types';
 
 // Custom Esri styles
@@ -70,18 +64,6 @@ export type EsriMapProps = {
   globalMapSettings: AppConfigurationMapSettings;
 };
 
-export type InitialData = {
-  center?: GeoJSON.Point | null;
-  zoom?: number;
-  maxZoom?: number;
-  uiElements?: EsriUiElement[];
-  showFullscreenOption?: boolean;
-  showLegend?: boolean;
-  showLayerVisibilityControl?: boolean;
-  zoomWidgetLocation?: 'left' | 'right';
-  onInit?: (mapView: MapView) => void;
-};
-
 const EsriMap = ({
   id,
   height,
@@ -98,144 +80,122 @@ const EsriMap = ({
   const isMobileOrSmaller = useBreakpoint('phone');
   const { data: appConfig } = useAppConfiguration();
 
-  const [map, setMap] = useState<Map | null>(null);
-  const [webMap, setWebMap] = useState<WebMap | null>(null);
+  const [map, setMap] = useState<Map | WebMap | null>(null);
   const [mapView, setMapView] = useState<MapView | null>(null);
   const [referenceLayers, setReferenceLayers] =
     useState<Collection<Layer> | null>(null);
 
   const mapRef = useRef<HTMLDivElement | null>(null);
-  const initialValuesLoaded = useRef(false);
+  const [updateMapViewConfig, setUpdateMapViewConfig] = useState(false);
+  const [initialized, setInitialized] = useState(false);
+
+  const mapRefAvailable = !!mapRef.current;
 
-  // On initial render, create a new map and map view and save them to state variables
   useEffect(() => {
-    if (mapRef.current) {
-      const newMap = new Map();
-      const webMap = webMapId && new WebMap({ portalItem: { id: webMapId } }); // If webMapId is provided, create a Web Map
-
-      const mapView = new MapView({
-        container: mapRef.current, // Reference to DOM node that will contain the view
-        map: webMap || newMap, // Use the Web Map if it exists, or the default Map
-        popupEnabled: false,
-        popup: {
-          dockEnabled: false,
-          dockOptions: {
-            breakpoint: false,
-          },
-        },
-      });
+    if (!mapRefAvailable) return;
 
-      setMap(newMap);
-      setWebMap(webMap || null);
-      setMapView(mapView);
+    let map: Map | WebMap;
 
-      return () => {
-        mapView.destroy();
-      };
+    if (webMapId) {
+      map = new WebMap({ portalItem: { id: webMapId } });
+    } else {
+      map = new Map();
+      map.basemap = new Basemap({
+        baseLayers: [getDefaultBasemap(globalMapSettings.tile_provider)],
+      });
     }
 
-    return;
-  }, [webMapId]);
+    setMap(map);
+
+    const mapView = new MapView({
+      container: mapRef.current as HTMLDivElement, // Reference to DOM node that will contain the view
+      map,
+      popupEnabled: false,
+      popup: {
+        dockEnabled: false,
+        dockOptions: {
+          breakpoint: false,
+        },
+      },
+    });
+
+    setMapView(mapView);
+    setUpdateMapViewConfig(true);
+
+    return () => {
+      mapView.destroy();
+    };
+  }, [mapRefAvailable, webMapId, globalMapSettings.tile_provider]);
 
   // Load initial map configuration data that was passed in.
-  // Note: This data is static and will not change.
+  // This will run on initial render and whenever the
+  // webMapId changes
   useEffect(() => {
-    if (!initialValuesLoaded.current && mapView && map) {
-      // Set map center
-      setMapCenter(mapView, initialData, globalMapSettings);
-
-      // Set the basemap & initial extent
-      map.basemap = new Basemap({
-        baseLayers: [getDefaultBasemap(globalMapSettings.tile_provider)],
-      });
-      mapView.zoom = initialData?.zoom || globalMapSettings.zoom_level || 18;
-      mapView.constraints = {
-        maxZoom: initialData?.maxZoom || 22,
-        minZoom: 5,
-      };
-
-      // Change location of zoom widget if specified
-      if (initialData?.zoomWidgetLocation === 'right') {
-        const zoom = mapView.ui.find('zoom');
-        mapView.ui.add(zoom, 'top-right');
-      }
-
-      // Add fullscreen widget if set
-      if (initialData?.showFullscreenOption) {
-        const fullscreen = new Fullscreen({
-          view: mapView,
-        });
-        mapView.ui.add(fullscreen, 'top-right');
-      }
-
-      // Add map legend if set
-      if (initialData?.showLegend) {
-        addMapLegend(mapView, isMobileOrSmaller);
-      }
-
-      // Show layer visibility controls if set
-      if (initialData?.showLayerVisibilityControl) {
-        showLayerVisibilityControls(mapView);
-      }
-
-      // Add any ui elements that were passed in
-      if (initialData?.uiElements && mapView) {
-        initialData?.uiElements.forEach((uiElement) => {
-          mapView.ui.add(uiElement.element, uiElement.position);
-        });
-      }
+    if (!mapView || !updateMapViewConfig) return;
 
-      // Run onInit function if it was provided
-      if (initialData?.onInit) {
-        initialData.onInit(mapView);
-      }
+    configureMapView(
+      mapView,
+      initialData,
+      globalMapSettings,
+      isMobileOrSmaller
+    );
 
-      initialValuesLoaded.current = true;
-    }
+    setUpdateMapViewConfig(false);
   }, [
+    mapView,
+    updateMapViewConfig,
     globalMapSettings,
     initialData,
     isMobileOrSmaller,
-    map,
-    mapView,
-    webMapId,
-    webMap,
   ]);
 
+  // Run onInit function once on init if it was provided
+  useEffect(() => {
+    if (!mapView || initialized) return;
+
+    if (initialData?.onInit) {
+      initialData.onInit(mapView);
+    }
+
+    setInitialized(true);
+  }, [initialData, initialized, mapView]);
+
   // The following useEffects are used for handling dynamic data that is passed in.
   // Description: This data is dynamic and may change during runtime.
-
   useEffect(() => {
     // Add any map layers which were passed in
+    if (!layers || !mapView) return;
+
+    const isRegularMap = map instanceof Map;
+    const isWebMap = map instanceof WebMap;
 
     // If we're not using a Web Map, add the layers to the default Map object
-    if (map && layers && !webMap) {
-      if (mapView) {
-        map.removeAll();
+    if (isRegularMap) {
+      map.removeAll();
 
-        layers.forEach((layer) => {
-          map.add(layer);
-        });
-      }
+      layers.forEach((layer) => {
+        map.add(layer);
+      });
     }
 
     // Otherwise add the layers into the WebMap
-    webMap &&
-      webMap.when(() => {
-        if (layers) {
-          // If the Web Map has any reference layers, re-order them so the layer hierarchy is correct
-          if (referenceLayers && referenceLayers.length > 0) {
-            handleWebMapReferenceLayers(webMap, referenceLayers);
-          }
-          // Now, add any additional layers that passed in as props to the Web Map
-          layers.forEach((layer) => {
-            webMap.add(layer);
-          });
-          // If the WebMap has reference layers, save them in state
-          setReferenceLayers(webMap.basemap?.referenceLayers || null);
+    if (isWebMap) {
+      map.when(() => {
+        // If the Web Map has any reference layers, re-order them so the layer hierarchy is correct
+        if (referenceLayers && referenceLayers.length > 0) {
+          handleWebMapReferenceLayers(map, referenceLayers);
         }
+
+        // Now, add any additional layers that passed in as props to the Web Map
+        layers.forEach((layer) => {
+          map.add(layer);
+        });
+
+        // If the WebMap has reference layers, save them in state
+        setReferenceLayers(map.basemap?.referenceLayers || null);
       });
-  }, [layers, map, mapView, referenceLayers, webMap]);
+    }
+  }, [layers, map, mapView, referenceLayers]);
 
   useEffect(() => {
     // Add any graphics which were passed in
@@ -268,11 +228,6 @@ const EsriMap = ({
     }
   }, [onHover, mapView]);
 
-  // If webMapId changes, re-load the initial settings
-  useEffect(() => {
-    initialValuesLoaded.current = false;
-  }, [webMapId]);
-
   useEffect(() => {
     // Sets the locale of the map
     intl.setLocale(locale);
diff --git a/front/app/components/EsriMap/types.ts b/front/app/components/EsriMap/types.ts
index f3407f188b89..6ed8cc4b9454 100644
--- a/front/app/components/EsriMap/types.ts
+++ b/front/app/components/EsriMap/types.ts
@@ -1,3 +1,5 @@
+import MapView from '@arcgis/core/views/MapView';
+
 export type EsriUiElement = {
   position:
     | 'top-left'
@@ -7,3 +9,15 @@ export type EsriUiElement = {
     | 'manual';
   element: HTMLDivElement;
 };
+
+export type InitialData = {
+  center?: GeoJSON.Point | null;
+  zoom?: number;
+  maxZoom?: number;
+  uiElements?: EsriUiElement[];
+  showFullscreenOption?: boolean;
+  showLegend?: boolean;
+  showLayerVisibilityControl?: boolean;
+  zoomWidgetLocation?: 'left' | 'right';
+  onInit?: (mapView: MapView) => void;
+};
diff --git a/front/app/components/EsriMap/utils.tsx b/front/app/components/EsriMap/utils.tsx
index 5a46bfa1fab7..660ad9994dc8 100644
--- a/front/app/components/EsriMap/utils.tsx
+++ b/front/app/components/EsriMap/utils.tsx
@@ -17,12 +17,9 @@ import FeatureLayer from '@arcgis/core/layers/FeatureLayer';
 import Basemap from '@arcgis/core/Basemap';
 import Collection from '@arcgis/core/core/Collection';
 import WebMap from '@arcgis/core/WebMap';
-import Expand from '@arcgis/core/widgets/Expand';
-import LayerList from '@arcgis/core/widgets/LayerList';
-import Legend from '@arcgis/core/widgets/Legend';
 
 // utils
-import { hexToRGBA, isNil } from 'utils/helperUtils';
+import { hexToRGBA } from 'utils/helperUtils';
 
 // types
 import { Localize } from 'hooks/useLocalize';
@@ -35,8 +32,6 @@ import {
   MAPTILER_ATTRIBUTION,
 } from './constants';
 import { IMapConfig } from 'api/map_config/types';
-import { InitialData } from '.';
-import { AppConfigurationMapSettings } from 'api/app_configuration/types';
 
 // getDefaultBasemap
 // Description: Gets the correct basemap given a certain tileProvider URL.
@@ -542,54 +537,3 @@ export const handleWebMapReferenceLayers = (
     baseLayers: newBasemapLayers,
   });
 };
-
-// showLayerVisibilityControls
-// Description: Shows the layer visibility controls on the map
-export const showLayerVisibilityControls = (mapView: MapView) => {
-  const layerList = new Expand({
-    content: new LayerList({
-      view: mapView,
-    }),
-    view: mapView,
-    expanded: false,
-    mode: 'floating',
-  });
-  mapView.ui.add(layerList, {
-    position: 'bottom-right',
-  });
-};
-
-// addMapLegend
-// Description: Adds a legend to the map
-export const addMapLegend = (mapView: MapView, isMobileOrSmaller: boolean) => {
-  const legend = new Expand({
-    content: new Legend({
-      view: mapView,
-      hideLayersNotInCurrentView: false,
-      style: { type: 'classic', layout: 'stack' },
-    }),
-    view: mapView,
-    expanded: isMobileOrSmaller ? false : true,
-    mode: 'floating',
-  });
-
-  mapView.ui.add(legend, 'bottom-right');
-};
-
-// setMapCenter
-// Description: Set the center of the map
-export const setMapCenter = (
-  mapView: MapView,
-  initialData: InitialData | undefined,
-  globalMapSettings: AppConfigurationMapSettings
-) => {
-  mapView.center = !isNil(initialData?.center)
-    ? new Point({
-        latitude: initialData?.center.coordinates[1],
-        longitude: initialData?.center.coordinates[0],
-      })
-    : new Point({
-        latitude: Number(globalMapSettings.map_center?.lat) || 0,
-        longitude: Number(globalMapSettings.map_center?.long) || 0,
-      });
-};

From 2500a2827a6031564fb98f93a47cb907d503e2a4 Mon Sep 17 00:00:00 2001
From: EdwinKato <katedwin88@gmail.com>
Date: Tue, 5 Mar 2024 12:00:56 +0300
Subject: [PATCH 068/282] Fix scroll reposition after pasting

---
 front/app/components/UI/QuillEditor/index.tsx | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/front/app/components/UI/QuillEditor/index.tsx b/front/app/components/UI/QuillEditor/index.tsx
index c79f565e7694..8541ffbee350 100644
--- a/front/app/components/UI/QuillEditor/index.tsx
+++ b/front/app/components/UI/QuillEditor/index.tsx
@@ -232,6 +232,14 @@ const Container = styled.div<{
     box-shadow: inset ${defaultStyles.boxShadowError};
   }
 
+  // This fixes a wierd scroll to the top after pasting. See https://github.com/quilljs/quill/issues/1374
+  .ql-clipboard {
+    position: fixed;
+    display: none;
+    left: 50%;
+    top: 50%;
+  }
+
   .ql-toolbar.ql-snow + .ql-container.ql-snow {
     width: 100%;
     height: 100%;

From 06e82afc8712b36f8039d362180ef64688fb4ca7 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Tue, 5 Mar 2024 09:42:20 +0000
Subject: [PATCH 069/282] _

---
 .../components/ReportBuilder/ViewContainer/index.tsx        | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/index.tsx
index b00351f4b3a5..2e3117e20f67 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/index.tsx
@@ -25,23 +25,23 @@ const getBoxProps = (view: View) => {
     };
 
     const innerBox: BoxProps = {
+      width: '100%',
+      minHeight: A4_HEIGHT,
       background: 'white',
       px: '30px',
       py: '30px',
-      width: '100%',
-      minHeight: A4_HEIGHT,
     };
 
     return { outerBox, innerBox };
   }
 
   const outerBox: BoxProps = {
+    width: view === 'phone' ? '360px' : '1140px',
     height: '620px',
     border: 'solid black',
     borderWidth: '40px 20px 20px 20px',
     zIndex: '1',
     mb: '12px',
-    width: view === 'phone' ? '360px' : '1140px',
     py: view === 'phone' ? '20px' : '40px',
     borderRadius: '20px',
     overflowX: 'hidden',

From 6ead28302982c68f157e69d2a562a532787c7a31 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Tue, 5 Mar 2024 11:46:24 +0000
Subject: [PATCH 070/282] _

---
 .../reporting/components/ReportBuilder/TopBar/index.tsx     | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index 878f318efa38..0e1907b18f84 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -150,9 +150,11 @@ const ContentBuilderTopBar = ({
           }
         );
       }, 5000);
-    }
 
-    setInitialized(true);
+      setInitialized(true);
+    } else {
+      setInitialized(true);
+    }
   }, [
     isTemplate,
     query,

From 13a6f8a6bece91c94f7cf3d75a9ba1c984fddcc3 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Tue, 5 Mar 2024 13:50:52 +0100
Subject: [PATCH 071/282] [TAN-1241] Disable print button if not saved

---
 .../FullscreenContentBuilder/index.tsx        |  4 +-
 .../components/ReportBuilder/TopBar/index.tsx | 11 ++++-
 .../ReportBuilder/TopBar/messages.ts          |  5 ++
 .../ReportRow/Buttons/PrintReportButton.tsx   | 48 +++++++++++++------
 .../containers/ReportBuilder/index.tsx        |  2 +-
 5 files changed, 51 insertions(+), 19 deletions(-)

diff --git a/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx b/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx
index 4fbd69769ded..1f90d3708fe3 100644
--- a/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx
+++ b/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx
@@ -14,6 +14,8 @@ import {
   IMAGE_UPLOADING_EVENT,
 } from '../constants';
 
+export const CONTENT_BUILDER_Z_INDEX = 10000;
+
 type ContentBuilderErrors = Record<
   string,
   { hasError: boolean; selectedLocale?: Locale }
@@ -72,7 +74,7 @@ export const ContentBuilder = ({
       display="flex"
       flexDirection="column"
       w="100%"
-      zIndex="10000"
+      zIndex={String(CONTENT_BUILDER_Z_INDEX)}
       position="fixed"
       bgColor={colors.background}
       h="100vh"
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index 878f318efa38..0f1af16461c1 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -21,7 +21,7 @@ import PrintReportButton from '../../ReportBuilderPage/ReportRow/Buttons/PrintRe
 
 // i18n
 import messages from './messages';
-import { FormattedMessage } from 'utils/cl-intl';
+import { FormattedMessage, useIntl } from 'utils/cl-intl';
 import useLocalize from 'hooks/useLocalize';
 
 // routing
@@ -60,8 +60,10 @@ const ContentBuilderTopBar = ({
   const { data: project } = useProjectById(projectId);
   const { data: phase } = usePhase(phaseId);
   const localize = useLocalize();
+  const { formatMessage } = useIntl();
 
   const disableSave = !!hasError || !!hasPendingState || saved;
+  const disablePrint = !!hasError || !!hasPendingState || !saved;
 
   const closeModal = () => {
     setShowQuitModal(false);
@@ -221,7 +223,12 @@ const ContentBuilderTopBar = ({
           onSelectLocale={setSelectedLocale}
         />
         <Box mx="20px">
-          <PrintReportButton reportId={reportId} />
+          <PrintReportButton
+            reportId={reportId}
+            disabledTooltipText={
+              disablePrint ? formatMessage(messages.cannotPrint) : undefined
+            }
+          />
         </Box>
         <SaveButton
           disabled={disableSave}
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/messages.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/messages.ts
index c371dc6397a6..926a2ae2da7a 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/messages.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/messages.ts
@@ -21,4 +21,9 @@ export default defineMessages({
     id: 'app.containers.AdminPage.ProjectEdit.survey.cancelQuitButtonText',
     defaultMessage: 'Cancel',
   },
+  cannotPrint: {
+    id: 'app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint',
+    defaultMessage:
+      'This report contains unsaved changes. Please save before printing.',
+  },
 });
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx b/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
index 4c88de999481..07dfed63e8f7 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
@@ -5,19 +5,25 @@ import useReport from 'api/reports/useReport';
 
 // components
 import Button from 'components/UI/Button';
+import Tippy from '@tippyjs/react';
 
 // styling
-import { colors } from '@citizenlab/cl2-component-library';
+import {
+  TooltipContentWrapper,
+  colors,
+} from '@citizenlab/cl2-component-library';
 
 // i18n
 import messages from '../messages';
 import { FormattedMessage } from 'utils/cl-intl';
+import { CONTENT_BUILDER_Z_INDEX } from 'components/admin/ContentBuilder/FullscreenContentBuilder';
 
 interface Props {
   reportId: string;
+  disabledTooltipText?: string;
 }
 
-const PrintReportButton = ({ reportId }: Props) => {
+const PrintReportButton = ({ reportId, disabledTooltipText }: Props) => {
   const { data: report } = useReport(reportId);
   const printReportPath = `/admin/reporting/report-builder/${reportId}/print`;
 
@@ -27,19 +33,31 @@ const PrintReportButton = ({ reportId }: Props) => {
     report.data.attributes.action_descriptor.editing_report.enabled;
 
   return (
-    <>
-      <Button
-        icon="blank-paper"
-        buttonStyle="primary"
-        bgColor={colors.primary}
-        iconSize="18px"
-        linkTo={printReportPath}
-        disabled={!canEdit}
-        openLinkInNewTab
-      >
-        <FormattedMessage {...messages.print} />
-      </Button>
-    </>
+    <Tippy
+      interactive={false}
+      placement="bottom"
+      disabled={!disabledTooltipText}
+      zIndex={CONTENT_BUILDER_Z_INDEX + 1}
+      content={
+        <TooltipContentWrapper tippytheme="light">
+          {disabledTooltipText}
+        </TooltipContentWrapper>
+      }
+    >
+      <div>
+        <Button
+          icon="blank-paper"
+          buttonStyle="primary"
+          bgColor={colors.primary}
+          iconSize="18px"
+          linkTo={printReportPath}
+          disabled={!canEdit || !!disabledTooltipText}
+          openLinkInNewTab
+        >
+          <FormattedMessage {...messages.print} />
+        </Button>
+      </div>
+    </Tippy>
   );
 };
 
diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index 91d21d155980..dee9c94a6764 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -67,7 +67,7 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
   const [imageUploading, setImageUploading] = useState(false);
   const [selectedLocale, setSelectedLocale] = useState<Locale>(platformLocale);
 
-  const [saved, setSaved] = useState(false);
+  const [saved, setSaved] = useState(true);
   const [contentBuilderErrors, setContentBuilderErrors] =
     useState<ContentBuilderErrors>({});
 

From 8b46a5345fec0bf3b620679e8e3369c755c34bbc Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Tue, 5 Mar 2024 12:53:30 +0000
Subject: [PATCH 072/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/en.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 9f280ada3653..afc0a7acdbc2 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -855,6 +855,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Report summary",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Add the goal of the project, participation methods used, and the outcome",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Visitors",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "This report contains unsaved changes. Please save before printing.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "No appropriate phases found in this project",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "No phase selected. Please select a phase first.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "No project",

From e133e8aa08deaad2b98544e30fdaa796901d2d92 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Tue, 5 Mar 2024 13:15:39 +0000
Subject: [PATCH 073/282] Replace go back button

---
 .../components/ReportBuilder/TopBar/index.tsx | 27 +++++++++++++++----
 .../ReportBuilder/TopBar/messages.ts          |  4 +++
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index 0e1907b18f84..65e1f9985171 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -11,17 +11,22 @@ import { useReportContext } from 'containers/Admin/reporting/context/ReportConte
 
 // components
 import Container from 'components/admin/ContentBuilder/TopBar/Container';
-import GoBackButton from 'components/admin/ContentBuilder/TopBar/GoBackButton';
 import LocaleSwitcher from 'components/admin/ContentBuilder/TopBar/LocaleSwitcher';
 import SaveButton from 'components/admin/ContentBuilder/TopBar/SaveButton';
-import { Box, Text, Title, colors } from '@citizenlab/cl2-component-library';
+import {
+  Box,
+  IconButton,
+  Text,
+  Title,
+  colors,
+} from '@citizenlab/cl2-component-library';
 import Modal from 'components/UI/Modal';
 import Button from 'components/UI/Button';
 import PrintReportButton from '../../ReportBuilderPage/ReportRow/Buttons/PrintReportButton';
 
 // i18n
 import messages from './messages';
-import { FormattedMessage } from 'utils/cl-intl';
+import { FormattedMessage, useIntl } from 'utils/cl-intl';
 import useLocalize from 'hooks/useLocalize';
 
 // routing
@@ -52,6 +57,8 @@ const ContentBuilderTopBar = ({
   setSaved,
   setSelectedLocale,
 }: ContentBuilderTopBarProps) => {
+  const { formatMessage } = useIntl();
+
   const [initialized, setInitialized] = useState(false);
   const [showQuitModal, setShowQuitModal] = useState(false);
   const { query } = useEditor();
@@ -203,8 +210,18 @@ const ContentBuilderTopBar = ({
           </Box>
         </Box>
       </Modal>
-      <GoBackButton onClick={goBack} />
-      <Box display="flex" p="15px" flexGrow={1} alignItems="center">
+      {/* <GoBackButton onClick={goBack} /> */}
+      <IconButton
+        iconName="arrow-left"
+        onClick={goBack}
+        buttonType="button"
+        iconColor={colors.textSecondary}
+        iconColorOnHover={colors.primary}
+        iconWidth="20px"
+        a11y_buttonActionMessage={formatMessage}
+        ml="8px"
+      />
+      <Box display="flex" p="15px" pl="8px" flexGrow={1} alignItems="center">
         <Box flexGrow={2}>
           <Title variant="h3" as="h1" mb="0px" mt="0px">
             <FormattedMessage {...messages.reportBuilder} />
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/messages.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/messages.ts
index c371dc6397a6..1a4895c7e38f 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/messages.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/messages.ts
@@ -21,4 +21,8 @@ export default defineMessages({
     id: 'app.containers.AdminPage.ProjectEdit.survey.cancelQuitButtonText',
     defaultMessage: 'Cancel',
   },
+  goBackButtonMessage: {
+    id: 'app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage',
+    defaultMessage: 'Go back',
+  },
 });

From 1779b3d31fbd8ccdf4af107546dab09d0938cd90 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Tue, 5 Mar 2024 13:16:07 +0000
Subject: [PATCH 074/282] _

---
 .../Admin/reporting/components/ReportBuilder/TopBar/index.tsx  | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index 65e1f9985171..cc23686d86a9 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -210,7 +210,6 @@ const ContentBuilderTopBar = ({
           </Box>
         </Box>
       </Modal>
-      {/* <GoBackButton onClick={goBack} /> */}
       <IconButton
         iconName="arrow-left"
         onClick={goBack}
@@ -218,7 +217,7 @@ const ContentBuilderTopBar = ({
         iconColor={colors.textSecondary}
         iconColorOnHover={colors.primary}
         iconWidth="20px"
-        a11y_buttonActionMessage={formatMessage}
+        a11y_buttonActionMessage={formatMessage(messages.goBackButtonMessage)}
         ml="8px"
       />
       <Box display="flex" p="15px" pl="8px" flexGrow={1} alignItems="center">

From fae6eca433db2a2ddcf6b2f1cc140bb8935c22f6 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Tue, 5 Mar 2024 14:18:25 +0100
Subject: [PATCH 075/282] [TAN-1241] Store z-indexes in one place

---
 .../ContentBuilder/FullscreenContentBuilder/index.tsx      | 7 +++++--
 .../ReportRow/Buttons/PrintReportButton.tsx                | 2 +-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx b/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx
index 1f90d3708fe3..452db1a4dd59 100644
--- a/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx
+++ b/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx
@@ -14,7 +14,10 @@ import {
   IMAGE_UPLOADING_EVENT,
 } from '../constants';
 
-export const CONTENT_BUILDER_Z_INDEX = 10000;
+export const CONTENT_BUILDER_Z_INDEX = {
+  main: 10000,
+  tooltip: 10010,
+};
 
 type ContentBuilderErrors = Record<
   string,
@@ -74,7 +77,7 @@ export const ContentBuilder = ({
       display="flex"
       flexDirection="column"
       w="100%"
-      zIndex={String(CONTENT_BUILDER_Z_INDEX)}
+      zIndex={String(CONTENT_BUILDER_Z_INDEX.main)}
       position="fixed"
       bgColor={colors.background}
       h="100vh"
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx b/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
index 07dfed63e8f7..ae31a414a1a4 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
@@ -37,7 +37,7 @@ const PrintReportButton = ({ reportId, disabledTooltipText }: Props) => {
       interactive={false}
       placement="bottom"
       disabled={!disabledTooltipText}
-      zIndex={CONTENT_BUILDER_Z_INDEX + 1}
+      zIndex={CONTENT_BUILDER_Z_INDEX.tooltip}
       content={
         <TooltipContentWrapper tippytheme="light">
           {disabledTooltipText}

From 43687931d3397053e6fa4ad375c6ec0cc4c4d64d Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Tue, 5 Mar 2024 13:29:03 +0000
Subject: [PATCH 076/282] Add print icon to component library

---
 cl2-component-library/src/components/Icon/index.tsx | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/cl2-component-library/src/components/Icon/index.tsx b/cl2-component-library/src/components/Icon/index.tsx
index 1e19300ad978..50e1f75824f6 100644
--- a/cl2-component-library/src/components/Icon/index.tsx
+++ b/cl2-component-library/src/components/Icon/index.tsx
@@ -2138,6 +2138,15 @@ export const icons = {
       <path d="M1.38587 16.8334C1.00543 16.8334 0.679348 16.6904 0.407609 16.4045C0.13587 16.1185 0 15.7802 0 15.3896V11.3093L2.85326 8.08694L3.8519 9.11225L1.44701 11.7906H13.553L11.2908 9.1541L12.2894 8.12879L15 11.3093V15.3896C15 15.7802 14.8641 16.1185 14.5924 16.4045C14.3207 16.6904 13.9946 16.8334 13.6141 16.8334H1.38587ZM6.60326 10.2003L3.44429 6.95702C3.14538 6.65012 3.00951 6.31184 3.03668 5.94217C3.06386 5.57251 3.22011 5.2412 3.50543 4.94826L7.74456 0.595945C8.0163 0.316951 8.34239 0.173966 8.72283 0.166991C9.10326 0.160016 9.43614 0.303001 9.72147 0.595945L12.8804 3.86018C13.1522 4.12522 13.288 4.44607 13.288 4.82271C13.288 5.19935 13.1386 5.54112 12.8397 5.84801L8.60054 10.2003C8.3288 10.4793 8.00272 10.6258 7.62228 10.6397C7.24185 10.6537 6.90217 10.5072 6.60326 10.2003ZM11.7187 4.78086L8.74321 1.72587L4.5856 5.99449L7.56114 9.0704L11.7187 4.78086Z" />
     </Svg>
   ),
+  print: (props: IconPropsWithoutName) => (
+    <Svg
+      className={`cl-icon ${props.className ? props.className : ''}`}
+      viewBox="0 0 14 12"
+      {...props}
+    >
+      <path d="M11.666 3.333H2.333c-1.107 0-2 .894-2 2v4H3V12h8V9.333h2.666v-4c0-1.106-.893-2-2-2Zm-2 7.334H4.333V7.333h5.333v3.334Zm2-4.667A.669.669 0 0 1 11 5.333c0-.366.3-.666.666-.666.367 0 .667.3.667.666 0 .367-.3.667-.667.667ZM11 0H3v2.667h8V0Z" />
+    </Svg>
+  ),
 } as const;
 
 const Icon = (props: IconProps) => {

From bd1f6eb73ae26f040178848edc676b730550f463 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Tue, 5 Mar 2024 13:39:12 +0000
Subject: [PATCH 077/282] _

---
 .../components/ReportBuilder/TopBar/index.tsx        | 12 +++++++++++-
 .../containers/Admin/reporting/components/Tabs.tsx   |  2 +-
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index cc23686d86a9..223eed7c02b1 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -239,7 +239,17 @@ const ContentBuilderTopBar = ({
           onSelectLocale={setSelectedLocale}
         />
         <Box mx="20px">
-          <PrintReportButton reportId={reportId} />
+          {/* <PrintReportButton reportId={reportId} /> */}
+          <Button
+            icon="print"
+            onClick={goBack}
+            buttonStyle="secondary"
+            iconColor={colors.textSecondary}
+            iconSize="20px"
+            ml="8px"
+            px="12px"
+            py="12px"
+          />
         </Box>
         <SaveButton
           disabled={disableSave}
diff --git a/front/app/containers/Admin/reporting/components/Tabs.tsx b/front/app/containers/Admin/reporting/components/Tabs.tsx
index 28d7003dd8fe..a6a6edfcfe34 100644
--- a/front/app/containers/Admin/reporting/components/Tabs.tsx
+++ b/front/app/containers/Admin/reporting/components/Tabs.tsx
@@ -82,7 +82,7 @@ const DashboardTabs = ({
             badge={
               name === 'project_reports' ? (
                 <Box display="inline" ml="12px">
-                  <Badge color={colors.background}>
+                  <Badge color={colors.textSecondary} className="inverse">
                     {formatMessage(messages.deprecated)}
                   </Badge>
                 </Box>

From 1eed23a4c12cf0590f440b175c92581aab8adb7a Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Tue, 5 Mar 2024 13:59:38 +0000
Subject: [PATCH 078/282] Add print button

---
 .../Admin/reporting/components/ReportBuilder/TopBar/index.tsx  | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index 223eed7c02b1..df3261158705 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -22,7 +22,6 @@ import {
 } from '@citizenlab/cl2-component-library';
 import Modal from 'components/UI/Modal';
 import Button from 'components/UI/Button';
-import PrintReportButton from '../../ReportBuilderPage/ReportRow/Buttons/PrintReportButton';
 
 // i18n
 import messages from './messages';
@@ -239,14 +238,12 @@ const ContentBuilderTopBar = ({
           onSelectLocale={setSelectedLocale}
         />
         <Box mx="20px">
-          {/* <PrintReportButton reportId={reportId} /> */}
           <Button
             icon="print"
             onClick={goBack}
             buttonStyle="secondary"
             iconColor={colors.textSecondary}
             iconSize="20px"
-            ml="8px"
             px="12px"
             py="12px"
           />

From f9df5ccbf6343476aa7dada1280abbda85fec63c Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 15:40:39 +0100
Subject: [PATCH 079/282] New translations en.json (French)

---
 front/app/translations/fr-FR.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/front/app/translations/fr-FR.json b/front/app/translations/fr-FR.json
index 8d2d7345d5f2..122bb7cf7eba 100644
--- a/front/app/translations/fr-FR.json
+++ b/front/app/translations/fr-FR.json
@@ -1879,7 +1879,7 @@
   "app.utils.votingMethodUtils.budgetSubmittedWithIcon": "Votre budget a été soumis 🎉",
   "app.utils.votingMethodUtils.budgetingPreSubmissionWarning": "<b>Votre budget ne sera pas pris en compte</b> tant que vous n'aurez pas cliqué sur \"Soumettre\"",
   "app.utils.votingMethodUtils.budgetingSubmissionInstructionsMinBudget": "Le budget minimum requis est de {amount} {currency}.",
-  "app.utils.votingMethodUtils.budgetingSubmissionInstructionsOnceYouAreDone": "Une fois que vous avez terminé, cliquez sur \"Soumettre\" pour soumettre votre budget.",
+  "app.utils.votingMethodUtils.budgetingSubmissionInstructionsOnceYouAreDone": "Une fois terminé, cliquez sur « Soumettre » pour soumettre votre budget.",
   "app.utils.votingMethodUtils.budgetingSubmissionInstructionsPreferredOptions": "Sélectionnez vos options préférées en cliquant sur \"Ajouter\".",
   "app.utils.votingMethodUtils.budgetingSubmissionInstructionsTotalBudget": "Vous disposez d'un total de <b>{maxBudget} {currency} à répartir entre {optionCount} options</b>.",
   "app.utils.votingMethodUtils.budgetingSubmittedInstructions2": "<b>Félicitations ! Votre budget a été soumis avec succès !</b> Vous pouvez vérifier vos choix ci-dessous. Vous avez la possibilité de les modifier jusqu'au <b>{endDate}</b>.",
@@ -1888,9 +1888,9 @@
   "app.utils.votingMethodUtils.budgets": "Budgets",
   "app.utils.votingMethodUtils.castYourVote": "Participez au vote",
   "app.utils.votingMethodUtils.cumulativeVotingInstructionsMaxVotesPerIdea": "Vous pouvez accorder jusqu'à {maxVotes} votes par option.",
-  "app.utils.votingMethodUtils.cumulativeVotingInstructionsOnceYouAreDone": "Une fois que vous avez terminé, cliquez sur \"Soumettre\" pour voter.",
+  "app.utils.votingMethodUtils.cumulativeVotingInstructionsOnceYouAreDone": "Une fois terminé, cliquez sur « Soumettre » pour voter.",
   "app.utils.votingMethodUtils.cumulativeVotingInstructionsPreferredOptions": "Sélectionnez vos options préférées en cliquant sur \"Voter\".",
-  "app.utils.votingMethodUtils.cumulativeVotingInstructionsTotalVotes": "Vous disposez d'un total de <b>{totalVotes} {voteTerm} à répartir entre {optionCount} options</b>.",
+  "app.utils.votingMethodUtils.cumulativeVotingInstructionsTotalVotes": "Vous disposez de <b>{totalVotes} {voteTerm} à répartir entre {optionCount} options</b>.",
   "app.utils.votingMethodUtils.finalResults": "Résultats finaux",
   "app.utils.votingMethodUtils.finalTally": "Résultat final",
   "app.utils.votingMethodUtils.howToParticipate": "Comment participer",
@@ -1903,10 +1903,10 @@
   "app.utils.votingMethodUtils.singleVotingEnded": "Le vote a été clôturé le <b>{endDate}.</b> Les participants pouvaient <b>voter pour {maxVotes} options.</b>",
   "app.utils.votingMethodUtils.singleVotingMultipleVotesPreferredOptions": "Sélectionnez vos options préférées en cliquant sur \"Voter\"",
   "app.utils.votingMethodUtils.singleVotingMultipleVotesYouCanVote2": "Vous disposez de <b>{totalVotes} votes</b> que vous pouvez attribuer aux différentes options.",
-  "app.utils.votingMethodUtils.singleVotingOnceYouAreDone": "Une fois que vous avez terminé, cliquez sur \"Soumettre\" pour voter.",
+  "app.utils.votingMethodUtils.singleVotingOnceYouAreDone": "Une fois terminé, cliquez sur « Soumettre » pour voter.",
   "app.utils.votingMethodUtils.singleVotingOneVoteEnded": "Le vote a été clôturé le <b>{endDate}.</b> Les participants pouvaient <b>voter pour une seule option</b>.",
-  "app.utils.votingMethodUtils.singleVotingOneVotePreferredOption": "Sélectionnez votre option préférée en cliquant sur \"Vote\".",
-  "app.utils.votingMethodUtils.singleVotingOneVoteYouCanVote2": "Vous disposez d''<b>un unique vote</b> que vous pouvez attribuer à l'une des options.",
+  "app.utils.votingMethodUtils.singleVotingOneVotePreferredOption": "Choisissez votre option préférée en cliquant sur « Sélectionner ».",
+  "app.utils.votingMethodUtils.singleVotingOneVoteYouCanVote2": "Vous disposez d'<b>un vote</b> que vous pouvez attribuer à l'une des options.",
   "app.utils.votingMethodUtils.singleVotingUnlimitedEnded": "Le vote a été clôturé le <b>{endDate}.</b> Les participants pouvaient <b>voter pour autant d'options qu'ils le souhaitaient</b>.",
   "app.utils.votingMethodUtils.singleVotingUnlimitedVotesYouCanVote": "Vous pouvez voter pour autant d'options que vous le souhaitez.",
   "app.utils.votingMethodUtils.submitYourBudget": "Soumettre ton budget",

From e38612fdce84008c8ee2660cd4c57ba9cc1d1346 Mon Sep 17 00:00:00 2001
From: Brent Guffens <brentguf@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:15:32 +0100
Subject: [PATCH 080/282] Revert "Revert "Release 2024-03-05""

---
 front/app/api/ideas/useDraftIdeaByPhaseId.ts  |  4 +-
 .../app/api/users/__mocks__/useUserBySlug.ts  |  7 +++
 front/app/api/users/__mocks__/useUsers.ts     |  4 +-
 .../PostPreview/Idea/AdminIdeaContent.tsx     | 18 ++++--
 .../Initiative/AdminInitiativeContent.tsx     | 15 ++++-
 .../components/PostPreview/index.tsx          |  4 +-
 .../components/PostPreview/messages.ts        |  4 ++
 .../ProjectFolderSelect.test.tsx              | 34 +----------
 .../components/ProjectFolderSelect/index.tsx  |  9 ++-
 .../app/containers/Admin/projects/routes.tsx  |  9 ---
 .../components/DesktopTopBar.tsx              |  6 +-
 .../IdeasNewIdeationForm/index.tsx            | 16 +++--
 .../containers/IdeasNewPage/IdeasNewMeta.tsx  | 21 +++----
 .../IdeasNewPage/components/Heading.tsx       | 10 +++-
 front/app/containers/IdeasNewPage/index.tsx   |  4 +-
 front/app/containers/IdeasNewPage/messages.ts |  3 +-
 .../components/Notification/index.tsx         |  4 +-
 .../UsersShowPage/UserHeader.test.tsx         | 45 ++++----------
 front/app/translations/admin/ach-UG.json      |  1 +
 front/app/translations/admin/ar-SA.json       |  1 +
 front/app/translations/admin/da-DK.json       |  1 +
 front/app/translations/admin/de-DE.json       |  5 +-
 front/app/translations/admin/en-CA.json       |  1 +
 front/app/translations/admin/en-GB.json       |  1 +
 front/app/translations/admin/en.json          |  1 +
 front/app/translations/admin/es-CL.json       |  1 +
 front/app/translations/admin/es-ES.json       |  1 +
 front/app/translations/admin/fi-FI.json       |  1 +
 front/app/translations/admin/fr-BE.json       |  1 +
 front/app/translations/admin/fr-FR.json       |  1 +
 front/app/translations/admin/hr-HR.json       |  1 +
 front/app/translations/admin/lv-LV.json       |  1 +
 front/app/translations/admin/nb-NO.json       |  1 +
 front/app/translations/admin/nl-BE.json       |  5 +-
 front/app/translations/admin/nl-NL.json       |  5 +-
 front/app/translations/admin/pl-PL.json       |  1 +
 front/app/translations/admin/pt-BR.json       |  1 +
 front/app/translations/admin/sr-Latn.json     |  1 +
 front/app/translations/admin/sr-SP.json       |  1 +
 front/app/translations/admin/sv-SE.json       |  1 +
 front/app/translations/admin/tr-TR.json       |  1 +
 front/app/utils/permissions/permissions.ts    |  6 +-
 front/app/utils/permissions/roles.test.ts     | 13 +++++
 front/app/utils/permissions/roles.ts          | 13 ++---
 .../rules/projectFolderPermissions.ts         |  2 +-
 .../permissions/rules/routePermissions.ts     |  4 +-
 .../e2e/admin/initiative_manager.cy.ts        | 36 ++++++++++++
 front/cypress/e2e/admin/input_manager.cy.ts   | 58 +++++++++++++++++++
 48 files changed, 248 insertions(+), 136 deletions(-)
 create mode 100644 front/app/api/users/__mocks__/useUserBySlug.ts

diff --git a/front/app/api/ideas/useDraftIdeaByPhaseId.ts b/front/app/api/ideas/useDraftIdeaByPhaseId.ts
index 17d2b103fc62..49bcbc6f43ab 100644
--- a/front/app/api/ideas/useDraftIdeaByPhaseId.ts
+++ b/front/app/api/ideas/useDraftIdeaByPhaseId.ts
@@ -3,7 +3,7 @@ import { CLErrors } from 'typings';
 import fetcher from 'utils/cl-react-query/fetcher';
 import ideasKeys from './keys';
 import { IIdea, IdeasKeys } from './types';
-import {queryClient} from "../../utils/cl-react-query/queryClient";
+import { queryClient } from '../../utils/cl-react-query/queryClient';
 
 export const fetchIdea = ({ phaseId }: { phaseId?: string }) =>
   fetcher<IIdea>({ path: `/ideas/draft/${phaseId}`, action: 'get' });
@@ -19,6 +19,6 @@ const useDraftIdeaByPhaseId = (phaseId?: string) => {
 
 export const clearDraftIdea = (phaseId?: string) => {
   queryClient.removeQueries(ideasKeys.item({ id: phaseId }));
-}
+};
 
 export default useDraftIdeaByPhaseId;
diff --git a/front/app/api/users/__mocks__/useUserBySlug.ts b/front/app/api/users/__mocks__/useUserBySlug.ts
new file mode 100644
index 000000000000..bd3b4f53d63f
--- /dev/null
+++ b/front/app/api/users/__mocks__/useUserBySlug.ts
@@ -0,0 +1,7 @@
+import { makeUser } from './useUsers';
+
+const mockUser = makeUser();
+
+export default jest.fn(() => {
+  return { data: mockUser };
+});
diff --git a/front/app/api/users/__mocks__/useUsers.ts b/front/app/api/users/__mocks__/useUsers.ts
index 9c40bb3975f6..93e57d4119e7 100644
--- a/front/app/api/users/__mocks__/useUsers.ts
+++ b/front/app/api/users/__mocks__/useUsers.ts
@@ -18,7 +18,9 @@ export const makeUser = (attributes = {}, id?: string): IUser => {
         },
         roles: [],
         highest_role: 'user',
-        bio_multiloc: {},
+        bio_multiloc: {
+          en: 'I am a test user',
+        },
         registration_completed_at: '2018-11-26T15:40:54.355Z',
         invite_status: null,
         created_at: '2018-11-26T15:41:19.782Z',
diff --git a/front/app/components/admin/PostManager/components/PostPreview/Idea/AdminIdeaContent.tsx b/front/app/components/admin/PostManager/components/PostPreview/Idea/AdminIdeaContent.tsx
index 21781da7841b..65b15c34286f 100644
--- a/front/app/components/admin/PostManager/components/PostPreview/Idea/AdminIdeaContent.tsx
+++ b/front/app/components/admin/PostManager/components/PostPreview/Idea/AdminIdeaContent.tsx
@@ -174,7 +174,7 @@ const AdminIdeaContent = ({ handleClickEdit, closePreview, ideaId }: Props) => {
 
   if (!idea || !project) return null;
 
-  const handleClickDelete = () => () => {
+  const handleClickDelete = () => {
     const deleteConfirmationMessage =
       messages.deleteInputInTimelineConfirmation;
 
@@ -205,16 +205,26 @@ const AdminIdeaContent = ({ handleClickEdit, closePreview, ideaId }: Props) => {
       <Top>
         <Button
           mr="8px"
-          buttonStyle="secondary"
+          buttonStyle="primary"
           icon="edit"
           onClick={handleClickEdit}
         >
           <FormattedMessage {...messages.edit} />
         </Button>
         <Button
+          linkTo={`/ideas/${idea.data.attributes.slug}`}
+          // We open in a new tab not lose state of the input manager
+          openLinkInNewTab
+          icon="eye"
+          buttonStyle="secondary"
+        >
+          <FormattedMessage {...messages.view} />
+        </Button>
+        <Button
+          id="e2e-input-manager-side-modal-delete-button"
+          buttonStyle="text"
           icon="delete"
-          buttonStyle="delete"
-          onClick={handleClickDelete()}
+          onClick={handleClickDelete}
         >
           <FormattedMessage {...messages.delete} />
         </Button>
diff --git a/front/app/components/admin/PostManager/components/PostPreview/Initiative/AdminInitiativeContent.tsx b/front/app/components/admin/PostManager/components/PostPreview/Initiative/AdminInitiativeContent.tsx
index e1b5687cd7f8..16d78e3c25d4 100644
--- a/front/app/components/admin/PostManager/components/PostPreview/Initiative/AdminInitiativeContent.tsx
+++ b/front/app/components/admin/PostManager/components/PostPreview/Initiative/AdminInitiativeContent.tsx
@@ -36,6 +36,7 @@ import useInitiativeImages from 'api/initiative_images/useInitiativeImages';
 
 const StyledTitle = styled(Title)`
   margin-bottom: 30px;
+  margin-right: 8px;
 `;
 
 const Row = styled.div`
@@ -147,14 +148,24 @@ const AdminInitiativeContent = ({
           <Button
             mr="8px"
             icon="edit"
-            buttonStyle="secondary"
+            buttonStyle="primary"
             onClick={handleClickEdit}
           >
             <FormattedMessage {...messages.edit} />
           </Button>
           <Button
+            linkTo={`/initiatives/${initiative.data.attributes.slug}`}
+            // We open in a new tab not lose state of the proposals manager
+            openLinkInNewTab
+            icon="eye"
+            buttonStyle="secondary"
+          >
+            <FormattedMessage {...messages.view} />
+          </Button>
+          <Button
+            id="e2e-initiative-manager-side-modal-delete-button"
             icon="delete"
-            buttonStyle="delete"
+            buttonStyle="text"
             onClick={handleClickDelete}
           >
             <FormattedMessage {...messages.delete} />
diff --git a/front/app/components/admin/PostManager/components/PostPreview/index.tsx b/front/app/components/admin/PostManager/components/PostPreview/index.tsx
index ff8234bedfa1..95a54ce4ab79 100644
--- a/front/app/components/admin/PostManager/components/PostPreview/index.tsx
+++ b/front/app/components/admin/PostManager/components/PostPreview/index.tsx
@@ -83,7 +83,7 @@ const PostPreview = ({
       return {
         idea: (
           <IdeaPostPreview
-            onClose={onClose}
+            onClose={handleOnClose}
             ideaId={postId}
             onSwitchPreviewMode={onSwitchPreviewMode}
             mode={mode}
@@ -91,7 +91,7 @@ const PostPreview = ({
         ),
         initiative: (
           <InitiativePostPreview
-            onClose={onClose}
+            onClose={handleOnClose}
             initiativeId={postId}
             onSwitchPreviewMode={onSwitchPreviewMode}
             mode={mode}
diff --git a/front/app/components/admin/PostManager/components/PostPreview/messages.ts b/front/app/components/admin/PostManager/components/PostPreview/messages.ts
index efec089467a2..55547dea1040 100644
--- a/front/app/components/admin/PostManager/components/PostPreview/messages.ts
+++ b/front/app/components/admin/PostManager/components/PostPreview/messages.ts
@@ -115,4 +115,8 @@ export default defineMessages({
     defaultMessage:
       'One or more files failed to upload. Please check the file size and format and try again.',
   },
+  view: {
+    id: 'app.components.admin.PostManager.view',
+    defaultMessage: 'View',
+  },
 });
diff --git a/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/ProjectFolderSelect.test.tsx b/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/ProjectFolderSelect.test.tsx
index 335b3a813cf0..cd2c332a8545 100644
--- a/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/ProjectFolderSelect.test.tsx
+++ b/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/ProjectFolderSelect.test.tsx
@@ -8,10 +8,6 @@ jest.mock('utils/permissions', () => {
   return { usePermission: () => mockPermission };
 });
 
-beforeEach(() => {
-  mockPermission = false;
-});
-
 const projectFolders = {
   data: [
     { id: 'folder1', attributes: { title_multiloc: { en: 'Folder 1' } } },
@@ -23,13 +19,7 @@ jest.mock('api/project_folders/useProjectFolders', () => () => {
   return { data: projectFolders };
 });
 
-const mockUser = {
-  data: {
-    id: 'userId',
-  },
-};
-
-jest.mock('api/me/useAuthUser', () => () => ({ data: mockUser }));
+jest.mock('api/me/useAuthUser');
 
 describe('ProjectFolderSelect', () => {
   it('should render', () => {
@@ -80,28 +70,6 @@ describe('ProjectFolderSelect', () => {
       container.querySelector('label[for="folderSelect-no"]')
     ).not.toHaveClass('disabled');
   });
-  it('should render as disabled with "no" option selected when isNewProject is false', () => {
-    const { container } = render(
-      <ProjectFolderSelect
-        projectAttrs={{}}
-        onProjectAttributesDiffChange={jest.fn()}
-        isNewProject={false}
-      />
-    );
-    expect(container.querySelector('#folderSelect-no')).toHaveAttribute(
-      'aria-checked',
-      'true'
-    );
-
-    expect(container.querySelector('#folderSelect-yes')).toHaveAttribute(
-      'aria-checked',
-      'false'
-    );
-
-    expect(container.querySelector('label[for="folderSelect-no"]')).toHaveClass(
-      'disabled'
-    );
-  });
   it('should set folder_id to null when "no" option is selected', () => {
     mockPermission = true;
     const onProjectAttributesDiffChange = jest.fn();
diff --git a/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/index.tsx b/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/index.tsx
index 16a0b8c09269..7b48bc5dfaff 100644
--- a/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/index.tsx
+++ b/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/index.tsx
@@ -27,8 +27,7 @@ import { isNilOrError, isNil } from 'utils/helperUtils';
 import { IOption } from 'typings';
 
 // i18n
-import { FormattedMessage, injectIntl } from 'utils/cl-intl';
-import { WrappedComponentProps } from 'react-intl';
+import { FormattedMessage, useIntl } from 'utils/cl-intl';
 import messages from './messages';
 import useAuthUser from 'api/me/useAuthUser';
 
@@ -46,8 +45,8 @@ const ProjectFolderSelect = ({
   projectAttrs: { folder_id },
   onProjectAttributesDiffChange,
   isNewProject,
-  intl: { formatMessage },
-}: Props & WrappedComponentProps) => {
+}: Props) => {
+  const { formatMessage } = useIntl();
   const { data: projectFolders } = useProjectFolders({});
   const { data: authUser } = useAuthUser();
 
@@ -202,4 +201,4 @@ const ProjectFolderSelect = ({
   return null;
 };
 
-export default injectIntl(ProjectFolderSelect);
+export default ProjectFolderSelect;
diff --git a/front/app/containers/Admin/projects/routes.tsx b/front/app/containers/Admin/projects/routes.tsx
index deadc6ebb1df..fa5082daedd7 100644
--- a/front/app/containers/Admin/projects/routes.tsx
+++ b/front/app/containers/Admin/projects/routes.tsx
@@ -172,15 +172,6 @@ const createAdminProjectsRoutes = () => {
               </PageLoading>
             ),
           },
-          // TODO: Hook up input manager on phase
-          // {
-          //   path: 'timeline/:id/ideas',
-          //   element: (
-          //     <PageLoading>
-          //       <AdminProjectIdeas />
-          //     </PageLoading>
-          //   ),
-          // },
           {
             path: 'phases/:phaseId',
             element: (
diff --git a/front/app/containers/EventsShowPage/components/DesktopTopBar.tsx b/front/app/containers/EventsShowPage/components/DesktopTopBar.tsx
index 9ed0e364e456..3fc787892fe2 100644
--- a/front/app/containers/EventsShowPage/components/DesktopTopBar.tsx
+++ b/front/app/containers/EventsShowPage/components/DesktopTopBar.tsx
@@ -39,10 +39,10 @@ interface Props {
 
 const TopBar = ({ project, event }: Props) => {
   const location = useLocation();
-  const user = useAuthUser();
+  const { data: user } = useAuthUser();
   const { formatMessage } = useIntl();
-  const isAdminUser = isAdmin(user.data);
-  const isModerator = isProjectModerator(user.data, project.id);
+  const isAdminUser = isAdmin(user);
+  const isModerator = user ? isProjectModerator(user, project.id) : false;
 
   return (
     <Bar>
diff --git a/front/app/containers/IdeasNewPage/IdeasNewIdeationForm/index.tsx b/front/app/containers/IdeasNewPage/IdeasNewIdeationForm/index.tsx
index 13fbf4bf3aaf..1bb61809b496 100644
--- a/front/app/containers/IdeasNewPage/IdeasNewIdeationForm/index.tsx
+++ b/front/app/containers/IdeasNewPage/IdeasNewIdeationForm/index.tsx
@@ -38,7 +38,7 @@ import { Multiloc } from 'typings';
 import { IPhases, IPhaseData } from 'api/phases/types';
 import { AjvErrorGetter, ApiErrorGetter } from 'components/Form/typings';
 import { IProject } from 'api/projects/types';
-import { IdeaPublicationStatus } from "api/ideas/types";
+import { IdeaPublicationStatus } from 'api/ideas/types';
 
 const getConfig = (
   phaseFromUrl: IPhaseData | undefined,
@@ -179,7 +179,11 @@ const IdeasNewIdeationForm = ({ project }: Props) => {
     });
 
     const ideaId = idea.data.id;
-    participationMethodConfig?.onFormSubmission({project: project.data, ideaId, idea});
+    participationMethodConfig?.onFormSubmission({
+      project: project.data,
+      ideaId,
+      idea,
+    });
   };
 
   const getApiErrorMessage: ApiErrorGetter = useCallback(
@@ -201,7 +205,7 @@ const IdeasNewIdeationForm = ({ project }: Props) => {
             getFieldNameFromPath(error.instancePath) ||
             error?.params?.missingProperty
           }_${error.keyword}`
-          ] ||
+        ] ||
         messages[
           `ajv_error_${
             getFieldNameFromPath(error.instancePath) ||
@@ -235,7 +239,10 @@ const IdeasNewIdeationForm = ({ project }: Props) => {
 
   return (
     <PageContainer id="e2e-idea-new-page" overflow="hidden">
-      {!processingLocation && schema && uiSchema && participationMethodConfig ? (
+      {!processingLocation &&
+      schema &&
+      uiSchema &&
+      participationMethodConfig ? (
         <>
           <IdeasNewMeta />
           <Form
@@ -298,4 +305,3 @@ const IdeasNewIdeationForm = ({ project }: Props) => {
 };
 
 export default IdeasNewIdeationForm;
-
diff --git a/front/app/containers/IdeasNewPage/IdeasNewMeta.tsx b/front/app/containers/IdeasNewPage/IdeasNewMeta.tsx
index 17fff330d891..72f13db2f64a 100644
--- a/front/app/containers/IdeasNewPage/IdeasNewMeta.tsx
+++ b/front/app/containers/IdeasNewPage/IdeasNewMeta.tsx
@@ -39,16 +39,17 @@ const IdeasNewMeta = ({ isSurvey }: Props) => {
 
     const inputTerm = getInputTerm(phases?.data);
     const ideasIndexTitle = formatMessage(
-      isSurvey ?
-        messages.surveyNewMetaTitle :
-        getInputTermMessage(inputTerm, {
-          idea: messages.ideaNewMetaTitle,
-          option: messages.optionMetaTitle,
-          project: messages.projectMetaTitle,
-          question: messages.questionMetaTitle,
-          issue: messages.issueMetaTitle,
-          contribution: messages.contributionMetaTitle,
-        }), { projectName }
+      isSurvey
+        ? messages.surveyNewMetaTitle
+        : getInputTermMessage(inputTerm, {
+            idea: messages.ideaNewMetaTitle,
+            option: messages.optionMetaTitle,
+            project: messages.projectMetaTitle,
+            question: messages.questionMetaTitle,
+            issue: messages.issueMetaTitle,
+            contribution: messages.contributionMetaTitle,
+          }),
+      { projectName }
     );
     const ideasIndexDescription = formatMessage(
       messages.ideaNewMetaDescription,
diff --git a/front/app/containers/IdeasNewPage/components/Heading.tsx b/front/app/containers/IdeasNewPage/components/Heading.tsx
index 28bc2ae1a7b0..42638dc90729 100644
--- a/front/app/containers/IdeasNewPage/components/Heading.tsx
+++ b/front/app/containers/IdeasNewPage/components/Heading.tsx
@@ -152,7 +152,11 @@ export const Heading = ({
                 />
               </Title>
               <Text color="primary" fontSize="l">
-                <FormattedMessage {...(loggedIn ? messages.leaveSurveyTextLoggedIn : messages.leaveSurveyText)} />
+                <FormattedMessage
+                  {...(loggedIn
+                    ? messages.leaveSurveyTextLoggedIn
+                    : messages.leaveSurveyText)}
+                />
               </Text>
             </Box>
             <Box
@@ -162,9 +166,9 @@ export const Heading = ({
               alignItems="center"
             >
               <Button
-                icon={loggedIn ? "arrow-left-circle" : "delete"}
+                icon={loggedIn ? 'arrow-left-circle' : 'delete'}
                 data-cy="e2e-confirm-delete-survey-results"
-                buttonStyle={loggedIn ? "primary" : "delete"}
+                buttonStyle={loggedIn ? 'primary' : 'delete'}
                 width="100%"
                 mb={isSmallerThanPhone ? '16px' : undefined}
                 mr={!isSmallerThanPhone ? '20px' : undefined}
diff --git a/front/app/containers/IdeasNewPage/index.tsx b/front/app/containers/IdeasNewPage/index.tsx
index 99f240ac50d0..c20802eb14eb 100644
--- a/front/app/containers/IdeasNewPage/index.tsx
+++ b/front/app/containers/IdeasNewPage/index.tsx
@@ -7,8 +7,8 @@ import Unauthorized from 'components/Unauthorized';
 import PageNotFound from 'components/PageNotFound';
 import VerticalCenterer from 'components/VerticalCenterer';
 import SurveySubmittedNotice from './components/SurveySubmittedNotice';
-import IdeasNewSurveyForm from "./IdeasNewSurveyForm";
-import IdeasNewIdeationForm from "./IdeasNewIdeationForm";
+import IdeasNewSurveyForm from './IdeasNewSurveyForm';
+import IdeasNewIdeationForm from './IdeasNewIdeationForm';
 
 // hooks
 import useProjectBySlug from 'api/projects/useProjectBySlug';
diff --git a/front/app/containers/IdeasNewPage/messages.ts b/front/app/containers/IdeasNewPage/messages.ts
index 40d98379b1a5..5cbd774fa07f 100644
--- a/front/app/containers/IdeasNewPage/messages.ts
+++ b/front/app/containers/IdeasNewPage/messages.ts
@@ -385,7 +385,8 @@ export default defineMessages({
   },
   leaveSurveyTextLoggedIn: {
     id: 'app.containers.IdeasNewPage.leaveSurveyTextLoggedIn',
-    defaultMessage: "Your draft answers have been saved privately and you can return to complete this survey later.",
+    defaultMessage:
+      'Your draft answers have been saved privately and you can return to complete this survey later.',
   },
   confirmLeaveSurveyButtonText: {
     id: 'app.containers.IdeasNewPage.confirmLeaveSurveyButtonText',
diff --git a/front/app/containers/MainHeader/Components/NotificationMenu/components/Notification/index.tsx b/front/app/containers/MainHeader/Components/NotificationMenu/components/Notification/index.tsx
index 46d773c592f6..c5a141499e19 100644
--- a/front/app/containers/MainHeader/Components/NotificationMenu/components/Notification/index.tsx
+++ b/front/app/containers/MainHeader/Components/NotificationMenu/components/Notification/index.tsx
@@ -294,10 +294,10 @@ const Notification = ({ notification }: Props) => {
     case 'native_survey_not_submitted':
       return (
         <NativeSurveyNotSubmittedNotification
-            notification={
+          notification={
             notification as INativeSurveyNotSubmittedNotificationData
           }
-            />
+        />
       );
     case 'voting_basket_not_submitted':
       return (
diff --git a/front/app/containers/UsersShowPage/UserHeader.test.tsx b/front/app/containers/UsersShowPage/UserHeader.test.tsx
index 67d264efc847..3e2011f18b7c 100644
--- a/front/app/containers/UsersShowPage/UserHeader.test.tsx
+++ b/front/app/containers/UsersShowPage/UserHeader.test.tsx
@@ -2,47 +2,26 @@ import React from 'react';
 
 import { render, screen } from 'utils/testUtils/rtl';
 import UserHeader from './UserHeader';
+import { makeUser } from 'api/users/__mocks__/useUsers';
 
-jest.mock('api/users/useUserBySlug', () =>
-  jest.fn(() => ({
-    data: {
-      data: {
-        id: 'userId',
-        attributes: {
-          first_name: 'Jane',
-          last_name: 'Doe',
-          bio_multiloc: { en: '<p>My bio</p>' },
-          created_at: '2022-10-22T00:00:00.000Z',
-        },
-      },
-    },
-  }))
-);
-
-let mockUserId = 'userId';
-
-jest.mock('api/me/useAuthUser', () => () => ({
-  data: { data: { id: mockUserId } },
-}));
-
+jest.mock('api/users/useUserBySlug');
+let mockUser = makeUser();
+jest.mock('api/me/useAuthUser', () => () => ({ data: mockUser }));
 let mockDisableUsersBiosValue = false;
-
 jest.mock('hooks/useFeatureFlag', () => {
   return () => mockDisableUsersBiosValue;
 });
 
+const userSlug = mockUser.data.attributes.slug;
+
 describe('UserHeader', () => {
   it('displays correctly', () => {
-    render(<UserHeader userSlug="user-slug" />);
+    render(<UserHeader userSlug={userSlug} />);
     expect(screen.getByTestId('userHeader')).toBeInTheDocument();
-    expect(screen.getByText('Jane Doe')).toBeInTheDocument();
-    expect(
-      screen.getByText('Member since October 22, 2022')
-    ).toBeInTheDocument();
   });
 
   it('renders edit button link when it is a personal profile', () => {
-    render(<UserHeader userSlug="user-slug" />);
+    render(<UserHeader userSlug={userSlug} />);
     expect(screen.getByText('Edit my profile')).toBeInTheDocument();
     expect(screen.getByRole('link')).toHaveAttribute(
       'href',
@@ -50,19 +29,19 @@ describe('UserHeader', () => {
     );
   });
   it('does not render edit button when it is a different user profile', () => {
-    mockUserId = 'differentUserId';
-    render(<UserHeader userSlug="user-slug" />);
+    mockUser = makeUser({}, 'differentUserId');
+    render(<UserHeader userSlug={userSlug} />);
     expect(screen.queryByText('Edit my profile')).not.toBeInTheDocument();
   });
 
   it('shows bio when disable_user_bios is false', () => {
-    render(<UserHeader userSlug="user-slug" />);
+    render(<UserHeader userSlug={userSlug} />);
     expect(screen.getByTestId('userHeaderBio')).toBeInTheDocument();
   });
 
   it('hides bio when disable_user_bios is true', () => {
     mockDisableUsersBiosValue = true;
-    render(<UserHeader userSlug="user-slug" />);
+    render(<UserHeader userSlug={userSlug} />);
     expect(screen.queryByTestId('userHeaderBio')).not.toBeInTheDocument();
   });
 });
diff --git a/front/app/translations/admin/ach-UG.json b/front/app/translations/admin/ach-UG.json
index c0e3d584ad60..d7f83bc637e3 100644
--- a/front/app/translations/admin/ach-UG.json
+++ b/front/app/translations/admin/ach-UG.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "crwdns209348:0crwdne209348:0",
   "app.components.admin.PostManager.topicsTab": "crwdns209350:0crwdne209350:0",
   "app.components.admin.PostManager.topicsTabTooltipText": "crwdns209352:0crwdne209352:0",
+  "app.components.admin.PostManager.view": "crwdns1877216:0crwdne1877216:0",
   "app.components.admin.PostManager.votes": "crwdns209356:0crwdne209356:0",
   "app.components.admin.PostManager.xDaysLeft": "crwdns353652:0x={x}crwdne353652:0",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "crwdns209358:0crwdne209358:0",
diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index 7030b40b52dc..2303c39a9776 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "العنوان",
   "app.components.admin.PostManager.topicsTab": "الموضوعات",
   "app.components.admin.PostManager.topicsTabTooltipText": "قُم بإضافة مواضيع إلى مُدخل باستخدام السحب والإسقاط. ",
+  "app.components.admin.PostManager.view": "منظر",
   "app.components.admin.PostManager.votes": "الأصوات",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {اقل من يوم} one {يوم واحد} other {# أيام}} غادر",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "من",
diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 061a6829218f..934798808878 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Titel",
   "app.components.admin.PostManager.topicsTab": "Emner",
   "app.components.admin.PostManager.topicsTabTooltipText": "Føj emner til et input ved hjælp af træk og slip.",
+  "app.components.admin.PostManager.view": "Se",
   "app.components.admin.PostManager.votes": "Stemmer",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mindre end en dag} one {En dag} other {# dage}} tilbage",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "fra",
diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index 5e72070904e6..44904268f59d 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Titel",
   "app.components.admin.PostManager.topicsTab": "Themen",
   "app.components.admin.PostManager.topicsTabTooltipText": "Fügen Sie Themen per Drag & Drop zu einem Eintrag hinzu.",
+  "app.components.admin.PostManager.view": "Vorschau",
   "app.components.admin.PostManager.votes": "Stimmen",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Weniger als ein Tag} one {Ein Tag} other {# Tage}} verbleibend",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "von",
@@ -234,7 +235,7 @@
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupport": "Geben Sie hier den Link zu Ihrem Konveio-Dokument an. Weitere Informationen zum Einrichten von Konveio finden Sie in unserer {supportArticleLink}.",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportArticle": "Support-Artikel",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportPageURL": "https://support.citizenlab.co/en/articles/7946532-embedding-konveio-pdf-documents-for-collecting-feedback",
-  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dies ist in Ihrem aktuellen Plan nicht enthalten. Wenden Sie sich an Ihren Government Success Manager oder Administrator, um es freizuschalten.",
+  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Diese Funktion ist in Ihrer aktuellen Lizenz nicht enthalten. Sprechen Sie mit Ihrer Kundenbetreuerin oder Ihrem Admin, um sie freizuschalten.",
   "app.components.app.containers.AdminPage.ProjectEdit.maxBudgetRequired": "Ein maximales Budget ist erforderlich",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesPerOptionError": "Die maximale Anzahl der Stimmen pro Option muss kleiner oder gleich der Gesamtzahl der Stimmen sein",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesRequired": "Eine maximale Anzahl von Stimmen ist erforderlich",
@@ -2471,7 +2472,7 @@
   "app.modules.navbar.admin.containers.pageHeader": "Seiten & Menü",
   "app.modules.navbar.admin.containers.pageSubtitle": "In Ihrer Navigationsleiste können bis zu fünf Seiten zusätzlich zur Startseite und den Projektseiten angezeigt werden. Sie können Menü-Elemente umbenennen, neu anordnen und neue Seiten mit eigenem Inhalt hinzufügen.",
   "app.modules.project_management.admin.components.permissionsTab": "Zugriffsrechte",
-  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dies ist in Ihrem aktuellen Plan nicht enthalten. Wenden Sie sich an Ihren Government Success Manager oder Administrator, um es freizuschalten.",
+  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Diese Funktion ist in Ihrer aktuellen Lizenz nicht enthalten. Sprechen Sie mit Ihrer Kundenbetreuerin oder Ihrem Admin, um sie freizuschalten.",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupBySurveyQuestion": "Nach Frage gruppieren",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupByUserField": "Nach Nutzer*innenfeld gruppieren",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupMode": "Gruppieren",
diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index cdef37d1a44e..c937a7a9f711 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Title",
   "app.components.admin.PostManager.topicsTab": "Tags",
   "app.components.admin.PostManager.topicsTabTooltipText": "Add tags to an input using drag and drop.",
+  "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Votes",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Less than a day} one {One day} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "from",
diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index fde872972d30..c2b55980f320 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Title",
   "app.components.admin.PostManager.topicsTab": "Tags",
   "app.components.admin.PostManager.topicsTabTooltipText": "Add tags to an input using drag and drop.",
+  "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Votes",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Less than a day} one {One day} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "from",
diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 9f280ada3653..4231e1c37305 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Title",
   "app.components.admin.PostManager.topicsTab": "Tags",
   "app.components.admin.PostManager.topicsTabTooltipText": "Add tags to an input using drag and drop.",
+  "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Votes",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Less than a day} one {One day} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "from",
diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index 5bdbb02c339f..6a1ef59136f7 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Título",
   "app.components.admin.PostManager.topicsTab": "Temas",
   "app.components.admin.PostManager.topicsTabTooltipText": "Agrega temas/etiquetas a un aporte usando arrastrar y soltar.",
+  "app.components.admin.PostManager.view": "Ver",
   "app.components.admin.PostManager.votes": "Votos",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural,=0 {Queda menos de un día} one {Queda un día} other {Quedan # días}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de",
diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index fa8bc573b17d..5c7e4c76b3ec 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Título",
   "app.components.admin.PostManager.topicsTab": "Temas",
   "app.components.admin.PostManager.topicsTabTooltipText": "Agrega temas a una entrada usando arrastrar y soltar.",
+  "app.components.admin.PostManager.view": "Ver",
   "app.components.admin.PostManager.votes": "Votos",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural,=0 {Queda menos de un día} one {Queda un día} other {Quedan # días}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de",
diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index 33a823ab443a..96bb78efda83 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Otsikko",
   "app.components.admin.PostManager.topicsTab": "Tunnisteet",
   "app.components.admin.PostManager.topicsTabTooltipText": "Lisää tunnisteita syötteeseen vetämällä ja pudottamalla.",
+  "app.components.admin.PostManager.view": "Näytä",
   "app.components.admin.PostManager.votes": "Äänet",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Alle päivä} one {Yksi päivä} other {# päivää}} jäljellä",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "alkaen",
diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index 0081f3b521dd..ef29b7b305f7 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Titre",
   "app.components.admin.PostManager.topicsTab": "Étiquettes",
   "app.components.admin.PostManager.topicsTabTooltipText": "Ajoutez des étiquettes à une contribution en les glissant vers l'étiquette de votre choix.",
+  "app.components.admin.PostManager.view": "Voir",
   "app.components.admin.PostManager.votes": "Votes",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Moins d'un jour restant} one {Un jour restant} other {# jours restants}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de ",
diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index e7b2e6cec00c..c081e7772c2e 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Titre",
   "app.components.admin.PostManager.topicsTab": "Étiquettes",
   "app.components.admin.PostManager.topicsTabTooltipText": "Ajoutez des étiquettes à une contribution en les glissant vers l'étiquette de votre choix.",
+  "app.components.admin.PostManager.view": "Voir",
   "app.components.admin.PostManager.votes": "Votes",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Moins d'un jour restant} one {Un jour restant} other {# jours restants}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de ",
diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index fc372b4ddab7..b91cc131f59e 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Naslov",
   "app.components.admin.PostManager.topicsTab": "Oznake",
   "app.components.admin.PostManager.topicsTabTooltipText": "Povucite i ispustite kako biste dodali oznake ovom unosu.",
+  "app.components.admin.PostManager.view": "Pogled",
   "app.components.admin.PostManager.votes": "Glasovi",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Manje od jednog dana} one {Jednog dana} other {# dana}} lijevo",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "od",
diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 0417ddcf431a..38c2cc14fa9d 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Nosaukums",
   "app.components.admin.PostManager.topicsTab": "Tagi",
   "app.components.admin.PostManager.topicsTabTooltipText": "Pievienojiet ievadei tagus, izmantojot funkciju vilkt un nomest.",
+  "app.components.admin.PostManager.view": "Skatīt",
   "app.components.admin.PostManager.votes": "Balsis",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mazāk nekā diena} one {Viena diena} other {# dienas}} pa kreisi",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "no",
diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index d23be4cd611f..d954201dfa73 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Tittel",
   "app.components.admin.PostManager.topicsTab": "Emner",
   "app.components.admin.PostManager.topicsTabTooltipText": "Legg til tagger i en oppføring ved å dra og slippe.",
+  "app.components.admin.PostManager.view": "Utsikt",
   "app.components.admin.PostManager.votes": "Stemmer",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mindre enn en dag} one {En dag} other {# dager}} venstre",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "fra",
diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index c14f499759b2..5b56509bc62d 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Titel",
   "app.components.admin.PostManager.topicsTab": "Tags",
   "app.components.admin.PostManager.topicsTabTooltipText": "Voeg tags toe aan een bijdrage door ze naar daar te verslepen.",
+  "app.components.admin.PostManager.view": "Bekijk",
   "app.components.admin.PostManager.votes": "Stemmen",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Minder dan een dag} one {Een dag} other {# dagen}} over",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "van",
@@ -234,7 +235,7 @@
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupport": "Geef hier de link naar je Konveio-document. Lees ons {supportArticleLink} voor meer informatie over het instellen van Konveio.",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportArticle": "support-artikel",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportPageURL": "https://support.citizenlab.co/en/articles/7946532-embedding-konveio-pdf-documents-for-collecting-feedback",
-  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dit is niet inbegrepen in je huidige plan. Neem contact op met je Government Success Manager of admin om het vrij te geven.",
+  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dit is niet in je huidige abonnement inbegrepen. Neem contact op met je Government Success Manager of platformbeheerder om deze functionaliteit te ontgrendelen.",
   "app.components.app.containers.AdminPage.ProjectEdit.maxBudgetRequired": "Er is een maximumbudget nodig",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesPerOptionError": "Maximum aantal stemmen per optie moet kleiner zijn dan of gelijk aan totaal aantal stemmen",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesRequired": "Er is een maximum aantal stemmen vereist",
@@ -2471,7 +2472,7 @@
   "app.modules.navbar.admin.containers.pageHeader": "Pagina's en menu",
   "app.modules.navbar.admin.containers.pageSubtitle": "Je navigatiebalk kan maximaal vijf pagina's weergeven naast de startpagina en de projectenpagina's. Je kunt menu-items hernoemen, opnieuw ordenen en nieuwe pagina's toevoegen met uw eigen inhoud.",
   "app.modules.project_management.admin.components.permissionsTab": "Toegangsrechten",
-  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dit is niet inbegrepen in je huidige plan. Neem contact op met je Government Success Manager of admin om het vrij te geven.",
+  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dit is niet in je huidige abonnement inbegrepen. Neem contact op met je Government Success Manager of platformbeheerder om deze functionaliteit te ontgrendelen.",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupBySurveyQuestion": "Groepeer per enquêtevraag",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupByUserField": "Groepeer per gebruikersveld",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupMode": "Groepeer modus",
diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index b7c3fcee1043..0c081b1ec5f9 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Titel",
   "app.components.admin.PostManager.topicsTab": "Tags",
   "app.components.admin.PostManager.topicsTabTooltipText": "Voeg tags toe aan een bijdrage door ze naar daar te verslepen.",
+  "app.components.admin.PostManager.view": "Bekijk",
   "app.components.admin.PostManager.votes": "Stemmen",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Minder dan een dag} one {Een dag} other {# dagen}} over",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "van",
@@ -234,7 +235,7 @@
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupport": "Geef hier de link naar je Konveio-document. Lees ons {supportArticleLink} voor meer informatie over het instellen van Konveio.",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportArticle": "support-artikel",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportPageURL": "https://support.citizenlab.co/en/articles/7946532-embedding-konveio-pdf-documents-for-collecting-feedback",
-  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dit is niet inbegrepen in je huidige plan. Neem contact op met je Government Success Manager of admin om het vrij te geven.",
+  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dit is niet in je huidige abonnement inbegrepen. Neem contact op met je Government Success Manager of platformbeheerder om deze functionaliteit te ontgrendelen.",
   "app.components.app.containers.AdminPage.ProjectEdit.maxBudgetRequired": "Er is een maximumbudget nodig",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesPerOptionError": "Maximum aantal stemmen per optie moet kleiner zijn dan of gelijk aan totaal aantal stemmen",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesRequired": "Er is een maximum aantal stemmen vereist",
@@ -2471,7 +2472,7 @@
   "app.modules.navbar.admin.containers.pageHeader": "Pagina's en menu",
   "app.modules.navbar.admin.containers.pageSubtitle": "Je navigatiebalk kan maximaal vijf pagina's weergeven naast de startpagina en de projectenpagina. Je kunt menu-items een andere naam geven, anders ordenen en nieuwe pagina's toevoegen met je eigen inhoud.",
   "app.modules.project_management.admin.components.permissionsTab": "Toegangsrechten",
-  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dit is niet inbegrepen in je huidige plan. Neem contact op met je Government Success Manager of admin om het vrij te geven.",
+  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dit is niet in je huidige abonnement inbegrepen. Neem contact op met je Government Success Manager of platformbeheerder om deze functionaliteit te ontgrendelen.",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupBySurveyQuestion": "Groepeer per enquêtevraag",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupByUserField": "Groepeer per gebruikersveld",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupMode": "Groepeer modus",
diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index 43073a389914..1a1e35ef8354 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Tytuł",
   "app.components.admin.PostManager.topicsTab": "Tematy",
   "app.components.admin.PostManager.topicsTabTooltipText": "Dodaj tematy do wkładu za pomocą metody \"przeciągnij i upuść\".",
+  "app.components.admin.PostManager.view": "Zobacz",
   "app.components.admin.PostManager.votes": "Głosy",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mniej niż jeden dzień} one {Jeden dzień} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "od",
diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index b0b2b42c6acd..9b0f5d7a7a28 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Assunto",
   "app.components.admin.PostManager.topicsTab": "Tópicos",
   "app.components.admin.PostManager.topicsTabTooltipText": "Adicione tópicos a uma entrada usando arrastar e soltar.",
+  "app.components.admin.PostManager.view": "Ver",
   "app.components.admin.PostManager.votes": "Votos",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Menos de um dia} one {Um dia} other {# dias}} restantes",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "De",
diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index 31a7669253b6..90bbc7edcec1 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Naziv",
   "app.components.admin.PostManager.topicsTab": "Teme",
   "app.components.admin.PostManager.topicsTabTooltipText": "Kliknite i prevucite kako biste dodali teme ovom unosu.",
+  "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Glasovi",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Мање од једног дана} one {Једног дана} other {# дана}} лево",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "od",
diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index f7bc6cfacb35..00ed42e14b66 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Наслов",
   "app.components.admin.PostManager.topicsTab": "Тема",
   "app.components.admin.PostManager.topicsTabTooltipText": "Додајте ознаке улазу помоћу превлачења и отпуштања.",
+  "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Гласови",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Мање од једног дана} one {Једног дана} other {# дана}} лево",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "из",
diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 4ea35858709e..9f53a12a0804 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Titel",
   "app.components.admin.PostManager.topicsTab": "Ämnen",
   "app.components.admin.PostManager.topicsTabTooltipText": "Lägg till ämnen till indata genom att dra och släppa.",
+  "app.components.admin.PostManager.view": "Utsikt",
   "app.components.admin.PostManager.votes": "Röster",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mindre än en dag} one {En dag} other {# dagar}} vänster",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "från",
diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index db28af7fda91..4e1ef701f2da 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -204,6 +204,7 @@
   "app.components.admin.PostManager.title": "Başlık",
   "app.components.admin.PostManager.topicsTab": "Etiketler",
   "app.components.admin.PostManager.topicsTabTooltipText": "Sürükle ve bırak yöntemini kullanarak bir girdiye etiket ekleyin.",
+  "app.components.admin.PostManager.view": "Görünüm",
   "app.components.admin.PostManager.votes": "Oylar",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Bir günden az} one {Bir gün} other {# gün}} sol",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "kimden",
diff --git a/front/app/utils/permissions/permissions.ts b/front/app/utils/permissions/permissions.ts
index 6e77a4b8dee6..0d2e77ccedee 100644
--- a/front/app/utils/permissions/permissions.ts
+++ b/front/app/utils/permissions/permissions.ts
@@ -25,7 +25,7 @@ interface IResourceData {
 interface IPermissionRule {
   (
     resource: TPermissionItem | null,
-    user: IUser | null,
+    user: IUser,
     tenant: IAppConfigurationData,
     context?: any
   ): boolean;
@@ -83,7 +83,7 @@ const hasPermission = ({
 }) => {
   return authUserStream.pipe(
     map((user) => {
-      if (!item) {
+      if (!item || !user) {
         return false;
       }
 
@@ -91,7 +91,7 @@ const hasPermission = ({
       const rule = getPermissionRule(resourceType, action);
 
       if (rule && appConfiguration) {
-        return rule(item, user || null, appConfiguration.data, context);
+        return rule(item, user, appConfiguration.data, context);
       } else {
         throw `No permission rule is specified on resource '${resourceType}' for action '${action}'`;
       }
diff --git a/front/app/utils/permissions/roles.test.ts b/front/app/utils/permissions/roles.test.ts
index 4a6e547daba9..36ae3aa0dde8 100644
--- a/front/app/utils/permissions/roles.test.ts
+++ b/front/app/utils/permissions/roles.test.ts
@@ -3,9 +3,22 @@ import {
   isRegularUser,
   isProjectModerator,
   isSuperAdmin,
+  userHasRole,
 } from './roles';
 import { makeUser } from 'api/users/__mocks__/useUsers';
 
+describe('userHasRole', () => {
+  it('returns true when a user has a role', () => {
+    const user = makeUser({ roles: [{ type: 'admin' }] });
+    expect(userHasRole(user, 'admin')).toBe(true);
+  });
+
+  it('returns false when a user has a different role', () => {
+    const user = makeUser({ roles: [{ type: 'project_moderator' }] });
+    expect(userHasRole(user, 'admin')).toBe(false);
+  });
+});
+
 describe('isAdmin', () => {
   it('returns true when a user is an admin', () => {
     const admin = makeUser({ roles: [{ type: 'admin' }] });
diff --git a/front/app/utils/permissions/roles.ts b/front/app/utils/permissions/roles.ts
index 8ae6f04a0a65..d200338127e9 100644
--- a/front/app/utils/permissions/roles.ts
+++ b/front/app/utils/permissions/roles.ts
@@ -1,7 +1,7 @@
 import { IUser } from 'api/users/types';
 import { isNilOrError } from 'utils/helperUtils';
 
-export interface IProjectModeratorRole {
+interface IProjectModeratorRole {
   type: 'project_moderator';
   project_id: string;
 }
@@ -15,7 +15,7 @@ interface IAdminRole {
   type: 'admin';
 }
 
-export interface IRoleRegisty {
+interface IRoleRegisty {
   IAdminRole: IAdminRole;
   IProjectModeratorRole: IProjectModeratorRole;
   IProjectFolderModeratorRole: IProjectFolderModeratorRole;
@@ -24,10 +24,9 @@ export interface IRoleRegisty {
 export type TRole = IRoleRegisty[keyof IRoleRegisty];
 
 export const userHasRole = (user: IUser, role: TRole['type']) => {
-  return !!(
-    user.data.attributes?.roles &&
-    user.data.attributes.roles?.find((r) => r.type === role)
-  );
+  const result = user.data.attributes.roles?.find((r) => r.type === role);
+
+  return result !== undefined;
 };
 
 export const isAdmin = (user?: IUser | null | undefined | Error) => {
@@ -71,7 +70,7 @@ export const isRegularUser = (user?: IUser | null) => {
   return false;
 };
 
-export const isProjectModerator = (user?: IUser | null, projectId?: string) => {
+export const isProjectModerator = (user: IUser, projectId?: string) => {
   return (
     isModerator(user) &&
     (!projectId ||
diff --git a/front/app/utils/permissions/rules/projectFolderPermissions.ts b/front/app/utils/permissions/rules/projectFolderPermissions.ts
index 268e9e27b83c..60bfdfc37e38 100644
--- a/front/app/utils/permissions/rules/projectFolderPermissions.ts
+++ b/front/app/utils/permissions/rules/projectFolderPermissions.ts
@@ -40,7 +40,7 @@ export function isProjectFolderModerator(user: IUserData) {
 // rules
 const canUserAccessAdminFolderRoute = (
   item: IRouteItem,
-  user: IUser | null,
+  user: IUser,
   tenant: IAppConfigurationData
 ) => {
   const hasAdminFolderRouteAccess =
diff --git a/front/app/utils/permissions/rules/routePermissions.ts b/front/app/utils/permissions/rules/routePermissions.ts
index 38b59b77bb4f..72d2e9ab0d1d 100644
--- a/front/app/utils/permissions/rules/routePermissions.ts
+++ b/front/app/utils/permissions/rules/routePermissions.ts
@@ -45,7 +45,7 @@ export const isAdminRoute = (path: string) => {
   return /^\/admin/.test(path);
 };
 
-const isModeratedProjectRoute = (item: IRouteItem, user: IUser | null) => {
+const isModeratedProjectRoute = (item: IRouteItem, user: IUser) => {
   const idRegexp = /^\/admin\/projects\/([a-z0-9-]+)\/?/;
   const matches = idRegexp.exec(item.path);
   const pathProjectId = matches && matches[1];
@@ -58,7 +58,7 @@ const tenantIsChurned = (tenant: IAppConfigurationData) => {
 
 export const canAccessRoute = (
   item: IRouteItem,
-  user: IUser | null,
+  user: IUser,
   tenant: IAppConfigurationData
 ) => {
   if (isAdminRoute(item.path)) {
diff --git a/front/cypress/e2e/admin/initiative_manager.cy.ts b/front/cypress/e2e/admin/initiative_manager.cy.ts
index 16537913be21..3b6f9e59984c 100644
--- a/front/cypress/e2e/admin/initiative_manager.cy.ts
+++ b/front/cypress/e2e/admin/initiative_manager.cy.ts
@@ -171,6 +171,7 @@ describe('Initiative manager', () => {
       cy.get('#e2e-feedback_needed_filter_toggle').click();
       cy.get('.e2e-initiative-row').should('have.length', 1);
     });
+
     after(() => {
       cy.apiRemoveInitiative(initiativeId1);
       cy.apiRemoveInitiative(initiativeId2);
@@ -204,6 +205,41 @@ describe('Initiative manager', () => {
       // check if the modal is no longer on the page
       cy.get('#e2e-modal-container').should('have.length', 0);
     });
+
+    // It closes when you delete the initiative
+    it('Closes when you delete the initiative', () => {
+      cy.getAuthUser().then((user) => {
+        const userId = user.body.data.id;
+
+        const initiativeTitle1 = randomString();
+        const initiativeContent1 = randomString();
+
+        // create initiative with signed-in admin/user as default assignee and give feedback
+        cy.apiCreateInitiative({
+          initiativeTitle: initiativeTitle1,
+          initiativeContent: initiativeContent1,
+          assigneeId: userId,
+        }).then((_initiative) => {
+          cy.visit('/admin/initiatives/');
+
+          cy.get('.e2e-initiative-manager-initiative-title')
+            .first()
+            .click()
+            .then(() => {
+              // check if the modal popped out and has the idea in it
+              cy.get('#e2e-modal-container').should('exist');
+              // delete the idea
+              cy.get(
+                '#e2e-initiative-manager-side-modal-delete-button'
+              ).click();
+              // click the browser's confirm button
+              cy.on('window:confirm', () => true);
+              // check if the modal is no longer on the page
+              cy.get('#e2e-modal-container').should('not.exist');
+            });
+        });
+      });
+    });
   });
 
   describe('Assignee select', () => {
diff --git a/front/cypress/e2e/admin/input_manager.cy.ts b/front/cypress/e2e/admin/input_manager.cy.ts
index 7647abfe8ddb..4208039c1a9d 100644
--- a/front/cypress/e2e/admin/input_manager.cy.ts
+++ b/front/cypress/e2e/admin/input_manager.cy.ts
@@ -172,6 +172,64 @@ describe('Input manager', () => {
           cy.get('#e2e-modal-container').should('have.length', 0);
         });
     });
+    it('Closes when you delete the idea', () => {
+      cy.getAuthUser().then((user) => {
+        const projectTitle = randomString();
+        const projectDescriptionPreview = randomString();
+        const projectDescription = randomString();
+        const userId = user.body.data.id;
+        let projectId: string;
+
+        // create project with signed-in admin/user as default assignee
+        cy.apiCreateProject({
+          title: projectTitle,
+          descriptionPreview: projectDescriptionPreview,
+          description: projectDescription,
+          publicationStatus: 'published',
+          assigneeId: userId,
+        })
+          .then((project) => {
+            projectId = project.body.data.id;
+            return cy.apiCreatePhase({
+              projectId,
+              title: 'phaseTitle',
+              startAt: moment().subtract(9, 'month').format('DD/MM/YYYY'),
+              participationMethod: 'ideation',
+              canPost: true,
+              canComment: true,
+              canReact: true,
+              allow_anonymous_participation: true,
+            });
+          })
+          .then((phase) => {
+            const ideaTitle = randomString();
+            const ideaContent = randomString();
+
+            cy.apiCreateIdea({
+              projectId,
+              ideaTitle,
+              ideaContent,
+              phaseIds: [phase.body.data.id],
+            }).then((_idea) => {
+              cy.visit('/admin/ideas/');
+              // click on title of first idea
+              cy.get('.e2e-idea-manager-idea-title')
+                .first()
+                .click()
+                .then(() => {
+                  // check if the modal popped out and has the idea in it
+                  cy.get('#e2e-modal-container').should('exist');
+                  // delete the idea
+                  cy.get('#e2e-input-manager-side-modal-delete-button').click();
+                  // click the browser's confirm button
+                  cy.on('window:confirm', () => true);
+                  // check if the modal is no longer on the page
+                  cy.get('#e2e-modal-container').should('not.exist');
+                });
+            });
+          });
+      });
+    });
   });
 
   describe('Assignee select', () => {

From 429d0664c7d8884f4915babe34df7ef2264707b8 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:35:31 +0100
Subject: [PATCH 081/282] New translations en.json (French)

---
 front/app/translations/admin/fr-FR.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index c081e7772c2e..e7b2e6cec00c 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Titre",
   "app.components.admin.PostManager.topicsTab": "Étiquettes",
   "app.components.admin.PostManager.topicsTabTooltipText": "Ajoutez des étiquettes à une contribution en les glissant vers l'étiquette de votre choix.",
-  "app.components.admin.PostManager.view": "Voir",
   "app.components.admin.PostManager.votes": "Votes",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Moins d'un jour restant} one {Un jour restant} other {# jours restants}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de ",

From aa4e4556b30ab13c782d12df229446a0f619aa80 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:35:36 +0100
Subject: [PATCH 082/282] New translations en.json (Spanish)

---
 front/app/translations/admin/es-ES.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index 5c7e4c76b3ec..fa8bc573b17d 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Título",
   "app.components.admin.PostManager.topicsTab": "Temas",
   "app.components.admin.PostManager.topicsTabTooltipText": "Agrega temas a una entrada usando arrastrar y soltar.",
-  "app.components.admin.PostManager.view": "Ver",
   "app.components.admin.PostManager.votes": "Votos",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural,=0 {Queda menos de un día} one {Queda un día} other {Quedan # días}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de",

From 6dfdee5233b25e59946ea17fbaca1136e1f1dde2 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:35:41 +0100
Subject: [PATCH 083/282] New translations en.json (Arabic)

---
 front/app/translations/admin/ar-SA.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index 2303c39a9776..7030b40b52dc 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "العنوان",
   "app.components.admin.PostManager.topicsTab": "الموضوعات",
   "app.components.admin.PostManager.topicsTabTooltipText": "قُم بإضافة مواضيع إلى مُدخل باستخدام السحب والإسقاط. ",
-  "app.components.admin.PostManager.view": "منظر",
   "app.components.admin.PostManager.votes": "الأصوات",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {اقل من يوم} one {يوم واحد} other {# أيام}} غادر",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "من",

From a88829a1bb589f46ae04001b9c16cf9004df6a8f Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:35:49 +0100
Subject: [PATCH 084/282] New translations en.json (Danish)

---
 front/app/translations/admin/da-DK.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 934798808878..061a6829218f 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Titel",
   "app.components.admin.PostManager.topicsTab": "Emner",
   "app.components.admin.PostManager.topicsTabTooltipText": "Føj emner til et input ved hjælp af træk og slip.",
-  "app.components.admin.PostManager.view": "Se",
   "app.components.admin.PostManager.votes": "Stemmer",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mindre end en dag} one {En dag} other {# dage}} tilbage",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "fra",

From e93bf8888ce7a5cde68c1d7fbc46dadf0e73521e Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:35:55 +0100
Subject: [PATCH 085/282] New translations en.json (German)

---
 front/app/translations/admin/de-DE.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index 44904268f59d..955012e96431 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Titel",
   "app.components.admin.PostManager.topicsTab": "Themen",
   "app.components.admin.PostManager.topicsTabTooltipText": "Fügen Sie Themen per Drag & Drop zu einem Eintrag hinzu.",
-  "app.components.admin.PostManager.view": "Vorschau",
   "app.components.admin.PostManager.votes": "Stimmen",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Weniger als ein Tag} one {Ein Tag} other {# Tage}} verbleibend",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "von",

From efbacfc4899036df288ed70c54cc47ef4df64a0f Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:36:14 +0100
Subject: [PATCH 086/282] New translations en.json (Finnish)

---
 front/app/translations/admin/fi-FI.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index 96bb78efda83..33a823ab443a 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Otsikko",
   "app.components.admin.PostManager.topicsTab": "Tunnisteet",
   "app.components.admin.PostManager.topicsTabTooltipText": "Lisää tunnisteita syötteeseen vetämällä ja pudottamalla.",
-  "app.components.admin.PostManager.view": "Näytä",
   "app.components.admin.PostManager.votes": "Äänet",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Alle päivä} one {Yksi päivä} other {# päivää}} jäljellä",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "alkaen",

From b0da363b2e0fb114017f03979917c90c7e3832cb Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:36:22 +0100
Subject: [PATCH 087/282] New translations en.json (Dutch)

---
 front/app/translations/admin/nl-NL.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index 0c081b1ec5f9..898ea432bab5 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Titel",
   "app.components.admin.PostManager.topicsTab": "Tags",
   "app.components.admin.PostManager.topicsTabTooltipText": "Voeg tags toe aan een bijdrage door ze naar daar te verslepen.",
-  "app.components.admin.PostManager.view": "Bekijk",
   "app.components.admin.PostManager.votes": "Stemmen",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Minder dan een dag} one {Een dag} other {# dagen}} over",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "van",

From 454895f78348c2a64159c1c86895961a42a0d719 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:36:26 +0100
Subject: [PATCH 088/282] New translations en.json (Norwegian)

---
 front/app/translations/admin/nb-NO.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index d954201dfa73..d23be4cd611f 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Tittel",
   "app.components.admin.PostManager.topicsTab": "Emner",
   "app.components.admin.PostManager.topicsTabTooltipText": "Legg til tagger i en oppføring ved å dra og slippe.",
-  "app.components.admin.PostManager.view": "Utsikt",
   "app.components.admin.PostManager.votes": "Stemmer",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mindre enn en dag} one {En dag} other {# dager}} venstre",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "fra",

From af7152517c093c2a2a7ddbbf10526379b7ad5b1d Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:36:32 +0100
Subject: [PATCH 089/282] New translations en.json (Polish)

---
 front/app/translations/admin/pl-PL.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index 1a1e35ef8354..43073a389914 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Tytuł",
   "app.components.admin.PostManager.topicsTab": "Tematy",
   "app.components.admin.PostManager.topicsTabTooltipText": "Dodaj tematy do wkładu za pomocą metody \"przeciągnij i upuść\".",
-  "app.components.admin.PostManager.view": "Zobacz",
   "app.components.admin.PostManager.votes": "Głosy",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mniej niż jeden dzień} one {Jeden dzień} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "od",

From 302936522111bf46e746a3a112fe316f48cb28b0 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:36:46 +0100
Subject: [PATCH 090/282] New translations en.json (Serbian (Cyrillic))

---
 front/app/translations/admin/sr-SP.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index 00ed42e14b66..f7bc6cfacb35 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Наслов",
   "app.components.admin.PostManager.topicsTab": "Тема",
   "app.components.admin.PostManager.topicsTabTooltipText": "Додајте ознаке улазу помоћу превлачења и отпуштања.",
-  "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Гласови",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Мање од једног дана} one {Једног дана} other {# дана}} лево",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "из",

From 4530f15f27f157b104163e72dd8a9da8463f1276 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:36:52 +0100
Subject: [PATCH 091/282] New translations en.json (Swedish)

---
 front/app/translations/admin/sv-SE.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 9f53a12a0804..4ea35858709e 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Titel",
   "app.components.admin.PostManager.topicsTab": "Ämnen",
   "app.components.admin.PostManager.topicsTabTooltipText": "Lägg till ämnen till indata genom att dra och släppa.",
-  "app.components.admin.PostManager.view": "Utsikt",
   "app.components.admin.PostManager.votes": "Röster",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mindre än en dag} one {En dag} other {# dagar}} vänster",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "från",

From 08db77d515acad229c62c090a460b597cb88b275 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:36:57 +0100
Subject: [PATCH 092/282] New translations en.json (Turkish)

---
 front/app/translations/admin/tr-TR.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index 4e1ef701f2da..db28af7fda91 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Başlık",
   "app.components.admin.PostManager.topicsTab": "Etiketler",
   "app.components.admin.PostManager.topicsTabTooltipText": "Sürükle ve bırak yöntemini kullanarak bir girdiye etiket ekleyin.",
-  "app.components.admin.PostManager.view": "Görünüm",
   "app.components.admin.PostManager.votes": "Oylar",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Bir günden az} one {Bir gün} other {# gün}} sol",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "kimden",

From 5d67751abc42c0477e19a93592f4dddfd99cdd7c Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:37:03 +0100
Subject: [PATCH 093/282] New translations en.json (Portuguese, Brazilian)

---
 front/app/translations/admin/pt-BR.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index 9b0f5d7a7a28..b0b2b42c6acd 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Assunto",
   "app.components.admin.PostManager.topicsTab": "Tópicos",
   "app.components.admin.PostManager.topicsTabTooltipText": "Adicione tópicos a uma entrada usando arrastar e soltar.",
-  "app.components.admin.PostManager.view": "Ver",
   "app.components.admin.PostManager.votes": "Votos",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Menos de um dia} one {Um dia} other {# dias}} restantes",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "De",

From 6cafc5abc3dca969a29dc6a05d9feee4ce34e17c Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:37:08 +0100
Subject: [PATCH 094/282] New translations en.json (Spanish, Chile)

---
 front/app/translations/admin/es-CL.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index 6a1ef59136f7..5bdbb02c339f 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Título",
   "app.components.admin.PostManager.topicsTab": "Temas",
   "app.components.admin.PostManager.topicsTabTooltipText": "Agrega temas/etiquetas a un aporte usando arrastrar y soltar.",
-  "app.components.admin.PostManager.view": "Ver",
   "app.components.admin.PostManager.votes": "Votos",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural,=0 {Queda menos de un día} one {Queda un día} other {Quedan # días}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de",

From a5e3940db0ccc69bd98f56e572941b013de0de13 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:37:13 +0100
Subject: [PATCH 095/282] New translations en.json (Croatian)

---
 front/app/translations/admin/hr-HR.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index b91cc131f59e..fc372b4ddab7 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Naslov",
   "app.components.admin.PostManager.topicsTab": "Oznake",
   "app.components.admin.PostManager.topicsTabTooltipText": "Povucite i ispustite kako biste dodali oznake ovom unosu.",
-  "app.components.admin.PostManager.view": "Pogled",
   "app.components.admin.PostManager.votes": "Glasovi",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Manje od jednog dana} one {Jednog dana} other {# dana}} lijevo",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "od",

From c53cfcd86affe6602697633cd3f9cf4a1a63ddb1 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:37:19 +0100
Subject: [PATCH 096/282] New translations en.json (Latvian)

---
 front/app/translations/admin/lv-LV.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 38c2cc14fa9d..0417ddcf431a 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Nosaukums",
   "app.components.admin.PostManager.topicsTab": "Tagi",
   "app.components.admin.PostManager.topicsTabTooltipText": "Pievienojiet ievadei tagus, izmantojot funkciju vilkt un nomest.",
-  "app.components.admin.PostManager.view": "Skatīt",
   "app.components.admin.PostManager.votes": "Balsis",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mazāk nekā diena} one {Viena diena} other {# dienas}} pa kreisi",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "no",

From 5a643a942f2e498f32d2ad4b65209c67b2619b05 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:37:33 +0100
Subject: [PATCH 097/282] New translations en.json (English, Canada)

---
 front/app/translations/admin/en-CA.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index c937a7a9f711..cdef37d1a44e 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Title",
   "app.components.admin.PostManager.topicsTab": "Tags",
   "app.components.admin.PostManager.topicsTabTooltipText": "Add tags to an input using drag and drop.",
-  "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Votes",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Less than a day} one {One day} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "from",

From b8243e69021988e4cb248f6cf83386866299c641 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:37:38 +0100
Subject: [PATCH 098/282] New translations en.json (English, United Kingdom)

---
 front/app/translations/admin/en-GB.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index c2b55980f320..fde872972d30 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Title",
   "app.components.admin.PostManager.topicsTab": "Tags",
   "app.components.admin.PostManager.topicsTabTooltipText": "Add tags to an input using drag and drop.",
-  "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Votes",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Less than a day} one {One day} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "from",

From 5f53aef416278d8b1d0513f4ed18c54f29da2276 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:37:46 +0100
Subject: [PATCH 099/282] New translations en.json (Serbian (Latin))

---
 front/app/translations/admin/sr-Latn.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index 90bbc7edcec1..31a7669253b6 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Naziv",
   "app.components.admin.PostManager.topicsTab": "Teme",
   "app.components.admin.PostManager.topicsTabTooltipText": "Kliknite i prevucite kako biste dodali teme ovom unosu.",
-  "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Glasovi",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Мање од једног дана} one {Једног дана} other {# дана}} лево",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "od",

From cd3904368d9e7185f16906b80260c1a1d8189320 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:37:52 +0100
Subject: [PATCH 100/282] New translations en.json (Dutch, Belgium)

---
 front/app/translations/admin/nl-BE.json | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index 5b56509bc62d..c14f499759b2 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Titel",
   "app.components.admin.PostManager.topicsTab": "Tags",
   "app.components.admin.PostManager.topicsTabTooltipText": "Voeg tags toe aan een bijdrage door ze naar daar te verslepen.",
-  "app.components.admin.PostManager.view": "Bekijk",
   "app.components.admin.PostManager.votes": "Stemmen",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Minder dan een dag} one {Een dag} other {# dagen}} over",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "van",
@@ -235,7 +234,7 @@
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupport": "Geef hier de link naar je Konveio-document. Lees ons {supportArticleLink} voor meer informatie over het instellen van Konveio.",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportArticle": "support-artikel",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportPageURL": "https://support.citizenlab.co/en/articles/7946532-embedding-konveio-pdf-documents-for-collecting-feedback",
-  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dit is niet in je huidige abonnement inbegrepen. Neem contact op met je Government Success Manager of platformbeheerder om deze functionaliteit te ontgrendelen.",
+  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dit is niet inbegrepen in je huidige plan. Neem contact op met je Government Success Manager of admin om het vrij te geven.",
   "app.components.app.containers.AdminPage.ProjectEdit.maxBudgetRequired": "Er is een maximumbudget nodig",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesPerOptionError": "Maximum aantal stemmen per optie moet kleiner zijn dan of gelijk aan totaal aantal stemmen",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesRequired": "Er is een maximum aantal stemmen vereist",
@@ -2472,7 +2471,7 @@
   "app.modules.navbar.admin.containers.pageHeader": "Pagina's en menu",
   "app.modules.navbar.admin.containers.pageSubtitle": "Je navigatiebalk kan maximaal vijf pagina's weergeven naast de startpagina en de projectenpagina's. Je kunt menu-items hernoemen, opnieuw ordenen en nieuwe pagina's toevoegen met uw eigen inhoud.",
   "app.modules.project_management.admin.components.permissionsTab": "Toegangsrechten",
-  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dit is niet in je huidige abonnement inbegrepen. Neem contact op met je Government Success Manager of platformbeheerder om deze functionaliteit te ontgrendelen.",
+  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dit is niet inbegrepen in je huidige plan. Neem contact op met je Government Success Manager of admin om het vrij te geven.",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupBySurveyQuestion": "Groepeer per enquêtevraag",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupByUserField": "Groepeer per gebruikersveld",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupMode": "Groepeer modus",

From 332943a6cfba5b1d0302064dd37e5f16cd5793b6 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:37:57 +0100
Subject: [PATCH 101/282] New translations en.json (French, Belgium)

---
 front/app/translations/admin/fr-BE.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index ef29b7b305f7..0081f3b521dd 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "Titre",
   "app.components.admin.PostManager.topicsTab": "Étiquettes",
   "app.components.admin.PostManager.topicsTabTooltipText": "Ajoutez des étiquettes à une contribution en les glissant vers l'étiquette de votre choix.",
-  "app.components.admin.PostManager.view": "Voir",
   "app.components.admin.PostManager.votes": "Votes",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Moins d'un jour restant} one {Un jour restant} other {# jours restants}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de ",

From 985b4e5ddc445a0f6da63b521819c06e6e81bbb8 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Tue, 5 Mar 2024 16:38:11 +0100
Subject: [PATCH 102/282] New translations en.json (Acholi)

---
 front/app/translations/admin/ach-UG.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/translations/admin/ach-UG.json b/front/app/translations/admin/ach-UG.json
index d7f83bc637e3..c0e3d584ad60 100644
--- a/front/app/translations/admin/ach-UG.json
+++ b/front/app/translations/admin/ach-UG.json
@@ -204,7 +204,6 @@
   "app.components.admin.PostManager.title": "crwdns209348:0crwdne209348:0",
   "app.components.admin.PostManager.topicsTab": "crwdns209350:0crwdne209350:0",
   "app.components.admin.PostManager.topicsTabTooltipText": "crwdns209352:0crwdne209352:0",
-  "app.components.admin.PostManager.view": "crwdns1877216:0crwdne1877216:0",
   "app.components.admin.PostManager.votes": "crwdns209356:0crwdne209356:0",
   "app.components.admin.PostManager.xDaysLeft": "crwdns353652:0x={x}crwdne353652:0",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "crwdns209358:0crwdne209358:0",

From f7314a77fbb57124b8ad8cdf6c70d6c8d3bf5883 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Tue, 5 Mar 2024 17:17:19 +0100
Subject: [PATCH 103/282] [TAN-1241] Fix failing specs

---
 .../admin/ContentBuilder/FullscreenContentBuilder/index.tsx | 6 +-----
 front/app/components/admin/ContentBuilder/constants.ts      | 5 +++++
 .../ReportRow/Buttons/PrintReportButton.tsx                 | 2 +-
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx b/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx
index 452db1a4dd59..249224ef930d 100644
--- a/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx
+++ b/front/app/components/admin/ContentBuilder/FullscreenContentBuilder/index.tsx
@@ -12,13 +12,9 @@ import {
   CONTENT_BUILDER_DELETE_ELEMENT_EVENT,
   CONTENT_BUILDER_ERROR_EVENT,
   IMAGE_UPLOADING_EVENT,
+  CONTENT_BUILDER_Z_INDEX,
 } from '../constants';
 
-export const CONTENT_BUILDER_Z_INDEX = {
-  main: 10000,
-  tooltip: 10010,
-};
-
 type ContentBuilderErrors = Record<
   string,
   { hasError: boolean; selectedLocale?: Locale }
diff --git a/front/app/components/admin/ContentBuilder/constants.ts b/front/app/components/admin/ContentBuilder/constants.ts
index 13b8f0ad0b4a..f461a0fc6c59 100644
--- a/front/app/components/admin/ContentBuilder/constants.ts
+++ b/front/app/components/admin/ContentBuilder/constants.ts
@@ -7,3 +7,8 @@ export const CONTENT_BUILDER_DELETE_ELEMENT_EVENT =
   'deleteContentBuilderElement';
 
 export const DEFAULT_PADDING = '20px';
+
+export const CONTENT_BUILDER_Z_INDEX = {
+  main: 10000,
+  tooltip: 10010,
+};
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx b/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
index ae31a414a1a4..35e3a4c3d06c 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
@@ -12,11 +12,11 @@ import {
   TooltipContentWrapper,
   colors,
 } from '@citizenlab/cl2-component-library';
+import { CONTENT_BUILDER_Z_INDEX } from 'components/admin/ContentBuilder/constants';
 
 // i18n
 import messages from '../messages';
 import { FormattedMessage } from 'utils/cl-intl';
-import { CONTENT_BUILDER_Z_INDEX } from 'components/admin/ContentBuilder/FullscreenContentBuilder';
 
 interface Props {
   reportId: string;

From e76ab479aae2c191e1c08f40c464a585e0abe48f Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Tue, 5 Mar 2024 17:27:04 +0100
Subject: [PATCH 104/282] [TAN-1245] Remove data source from survey widget

---
 .../Question/Source.tsx                       | 62 -------------------
 .../Question/index.tsx                        |  8 +--
 .../SurveyQuestionResultWidget/index.tsx      |  1 -
 .../SurveyQuestionResultWidget/messages.ts    |  4 --
 4 files changed, 2 insertions(+), 73 deletions(-)
 delete mode 100644 front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/Source.tsx

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/Source.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/Source.tsx
deleted file mode 100644
index 4b83664d6370..000000000000
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/Source.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import React from 'react';
-
-// api
-import usePhases from 'api/phases/usePhases';
-import useProjectById from 'api/projects/useProjectById';
-
-// components
-import { Text } from '@citizenlab/cl2-component-library';
-import Link from 'utils/cl-router/Link';
-
-// i18n
-import messages from '../messages';
-import { FormattedMessage, useIntl } from 'utils/cl-intl';
-import useLocalize from 'hooks/useLocalize';
-
-// utils
-import { generateDateRange, getPhaseIndex } from './utils';
-
-interface Props {
-  projectId: string;
-  phaseId: string;
-}
-
-const Source = ({ projectId, phaseId }: Props) => {
-  const { data: project } = useProjectById(projectId);
-  const { data: phases } = usePhases(projectId);
-  const localize = useLocalize();
-  const { formatMessage } = useIntl();
-
-  if (!project || !phases) return null;
-
-  const phaseIndex = getPhaseIndex(phases.data, phaseId);
-  if (phaseIndex === -1) return null;
-
-  const phase = phases.data[phaseIndex];
-  const phaseNumber = phaseIndex + 1;
-
-  return (
-    <Text color="textSecondary" variant="bodyS" mb="0" mt="20px">
-      <FormattedMessage
-        {...messages.sourceAndReference}
-        values={{
-          phase: (
-            <Link
-              to={`/projects/${project.data.attributes.slug}/${phaseNumber}`}
-              target="_blank"
-            >
-              {localize(phase.attributes.title_multiloc)}
-            </Link>
-          ),
-          period: generateDateRange(
-            formatMessage,
-            phase.attributes.start_at,
-            phase.attributes.end_at
-          ),
-        }}
-      />
-    </Text>
-  );
-};
-
-export default Source;
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/index.tsx
index 2a642960c753..10437a7c8c68 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/index.tsx
@@ -7,7 +7,6 @@ import { useSurveyQuestionResult } from 'api/graph_data_units';
 import { Title, Text, Box } from '@citizenlab/cl2-component-library';
 import GroupedBars from './GroupedBars';
 import UngroupedBars from './UngroupedBars';
-import Source from './Source';
 
 // i18n
 import { useIntl } from 'utils/cl-intl';
@@ -22,7 +21,6 @@ import { GroupMode } from 'api/graph_data_units/requestTypes';
 import Legend from 'components/admin/Graphs/Legend';
 
 interface Props {
-  projectId: string;
   phaseId: string;
   questionId: string;
   groupMode?: GroupMode;
@@ -30,7 +28,6 @@ interface Props {
 }
 
 const SurveyQuestionResult = ({
-  projectId,
   phaseId,
   questionId,
   groupMode,
@@ -55,7 +52,7 @@ const SurveyQuestionResult = ({
     : undefined;
 
   return (
-    <>
+    <Box mb="8px">
       <Title
         variant="h4"
         mt="0px"
@@ -82,8 +79,7 @@ const SurveyQuestionResult = ({
       )}
 
       {!attributes.grouped && <UngroupedBars attributes={attributes} />}
-      <Source projectId={projectId} phaseId={phaseId} />
-    </>
+    </Box>
   );
 };
 
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/index.tsx
index e7c4770a6282..e784f374996b 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/index.tsx
@@ -33,7 +33,6 @@ const SurveyQuestionResultWidget = ({
     <PageBreakBox px={px}>
       {hasEverything ? (
         <Question
-          projectId={projectId}
           phaseId={phaseId}
           questionId={questionId}
           groupMode={groupFieldId ? groupMode : undefined}
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/messages.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/messages.ts
index 67684ffe37dd..b4ae4bca50bf 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/messages.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/messages.ts
@@ -13,10 +13,6 @@ export default defineMessages({
     id: 'app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses',
     defaultMessage: '{count} responses',
   },
-  sourceAndReference: {
-    id: 'app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference',
-    defaultMessage: 'Data from {phase} during {period}',
-  },
   untilNow: {
     id: 'app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow',
     defaultMessage: '{date} until now',

From 083dda6484ec71651f2d1b0d3d728b8fed4c0081 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Tue, 5 Mar 2024 16:29:55 +0000
Subject: [PATCH 105/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/ar-SA.json   | 1 -
 front/app/translations/admin/da-DK.json   | 1 -
 front/app/translations/admin/de-DE.json   | 1 -
 front/app/translations/admin/en-CA.json   | 1 -
 front/app/translations/admin/en-GB.json   | 1 -
 front/app/translations/admin/en.json      | 1 -
 front/app/translations/admin/es-CL.json   | 1 -
 front/app/translations/admin/es-ES.json   | 1 -
 front/app/translations/admin/fi-FI.json   | 1 -
 front/app/translations/admin/fr-BE.json   | 1 -
 front/app/translations/admin/fr-FR.json   | 1 -
 front/app/translations/admin/hr-HR.json   | 1 -
 front/app/translations/admin/lv-LV.json   | 1 -
 front/app/translations/admin/nb-NO.json   | 1 -
 front/app/translations/admin/nl-BE.json   | 1 -
 front/app/translations/admin/nl-NL.json   | 1 -
 front/app/translations/admin/pl-PL.json   | 1 -
 front/app/translations/admin/pt-BR.json   | 1 -
 front/app/translations/admin/sr-Latn.json | 1 -
 front/app/translations/admin/sr-SP.json   | 1 -
 front/app/translations/admin/sv-SE.json   | 1 -
 front/app/translations/admin/tr-TR.json   | 1 -
 22 files changed, 22 deletions(-)

diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index 7030b40b52dc..6892ad78e54a 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "لم يتم تحديد أي سؤال. الرجاء تحديد سؤال أولاً.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "لا اجابة",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} الردود",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "البيانات من {phase} خلال {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "مسح السؤال",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} حتى الآن",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "العنوان",
diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 061a6829218f..a94d2346ba79 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Intet spørgsmål valgt. Vælg venligst et spørgsmål først.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Intet svar",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} svar",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data fra {phase} under {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Spørgsmål til undersøgelsen",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} indtil nu",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titel",
diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index 5e72070904e6..cfddc839773e 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Keine Frage ausgewählt. Bitte wählen Sie zuerst eine Frage aus.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Keine Antwort",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} Antworten",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Daten von {phase} während {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Frage",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} bis jetzt",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titel",
diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index cdef37d1a44e..053e828bfdef 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No question selected. Please select a question first.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "No answer",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} responses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data from {phase} during {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Survey question",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} until now",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Title",
diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index fde872972d30..ebfa44f75c36 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No question selected. Please select a question first.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "No answer",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} responses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data from {phase} during {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Survey question",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} until now",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Title",
diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index afc0a7acdbc2..95d7f3ac4836 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No question selected. Please select a question first.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "No answer",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} responses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data from {phase} during {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Survey question",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} until now",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Title",
diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index 5bdbb02c339f..c7aec9af750a 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No hay ninguna pregunta seleccionada. Por favor, selecciona primero una pregunta.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Sin respuesta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} respuestas",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Datos de {phase} durante {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Pregunta de la encuesta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} hasta ahora",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Título",
diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index fa8bc573b17d..e3adc70eff5c 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No hay ninguna pregunta seleccionada. Por favor, selecciona primero una pregunta.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Sin respuesta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} respuestas",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Datos de {phase} durante {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Pregunta de la encuesta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} hasta ahora",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Título",
diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index 33a823ab443a..647c030ccc2e 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Yhtään kysymystä ei valittu. Valitse ensin kysymys.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Ei vastausta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} vastauksia",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Tiedot kohteesta {phase} aikana {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Kysely kysymys",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} tähän asti",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Otsikko",
diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index 0081f3b521dd..463b27a7485c 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Veuillez d'abord sélectionner une question.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Pas de réponse",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} réponses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Données de la phase {phase} pendant {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Question d'enquête",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} jusqu'à maintenant",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titre",
diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index e7b2e6cec00c..7f89199df61a 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Veuillez d'abord sélectionner une question.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Pas de réponse",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} réponses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Données de la phase {phase} pendant {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Question d'enquête",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} jusqu'à maintenant",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titre",
diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index fc372b4ddab7..b2c92024405f 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Nije odabrano nijedno pitanje. Prvo odaberite pitanje.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Nema odgovora",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} odgovora",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Podaci od {phase} tijekom {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Anketno pitanje",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} do sada",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Naslov",
diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 0417ddcf431a..f3dc3cea4a1d 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Nav izvēlēts neviens jautājums. Lūdzu, vispirms izvēlieties jautājumu.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Nav atbildes",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} atbildes",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Dati no {phase} {period}laikā",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Aptaujas jautājums",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} līdz šim",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Nosaukums",
diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index d23be4cd611f..0bd0700a2bd5 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Ingen spørsmål er valgt. Vennligst velg et spørsmål først.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Ingen svar",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} svar",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data fra {phase} under {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Undersøkelsesspørsmål",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} til nå",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Tittel",
diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index c14f499759b2..ae3899a9fd07 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Geen vraag geselecteerd. Selecteer eerst een vraag.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Geen antwoord",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} reacties",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Gegevens van {phase} tijdens {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Enquêtevraag",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} tot nu toe",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titel",
diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index b7c3fcee1043..1e7a1c00043f 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Geen vraag geselecteerd. Selecteer eerst een vraag.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Geen antwoord",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} reacties",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Gegevens van {phase} tijdens {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Enquêtevraag",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} tot nu toe",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titel",
diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index 43073a389914..b6d52fee6526 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Nie wybrano żadnego pytania. Wybierz pytanie jako pierwsze.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Brak odpowiedzi",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} odpowiedzi",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Dane z {phase} podczas {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Pytanie ankietowe",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} aż do teraz",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Tytuł",
diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index b0b2b42c6acd..f0e440790757 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Nenhuma pergunta foi selecionada. Selecione uma pergunta primeiro.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Sem resposta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} respostas",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Dados de {phase} durante {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Pergunta da pesquisa",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} até o momento",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Assunto",
diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index 31a7669253b6..e903aaad3878 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No question selected. Please select a question first.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "No answer",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} responses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data from {phase} during {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Survey question",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} until now",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Naziv",
diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index f7bc6cfacb35..5a05daf581d2 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No question selected. Please select a question first.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "No answer",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} responses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data from {phase} during {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Survey question",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} until now",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Наслов",
diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 4ea35858709e..763a1ff2c2e2 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Ingen fråga vald. Vänligen välj en fråga först.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Inget svar",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} svar",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Uppgifter från {phase} under {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Enkätfråga",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} fram till nu",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titel",
diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index db28af7fda91..0992faa23323 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Seçili soru yok. Lütfen önce bir soru seçin.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Cevap yok",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} yanıtlar",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "{period}sırasında {phase} adresinden alınan veriler",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Anket sorusu",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} şimdiye kadar",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Başlık",

From ff6a8df5e32264bb0aa03f0cf9c013be78e632dc Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Tue, 5 Mar 2024 17:49:58 +0100
Subject: [PATCH 106/282] [TAN-1245] Remove unused code

---
 .../Question/utils.ts                         | 42 -------------------
 1 file changed, 42 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/utils.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/utils.ts
index 3bcdb7cb0917..d83b50ab5619 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/utils.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/utils.ts
@@ -1,5 +1,3 @@
-import moment from 'moment';
-
 // styling
 import { colors } from '@citizenlab/cl2-component-library';
 import { DEFAULT_CATEGORICAL_COLORS } from 'components/admin/Graphs/styling';
@@ -9,49 +7,9 @@ import messages from '../messages';
 
 // typings
 import { FormatMessage } from 'typings';
-import { IPhaseData } from 'api/phases/types';
 import { AttributesGrouped } from 'api/graph_data_units/responseTypes';
 import { Localize } from 'hooks/useLocalize';
 
-export const generateDateRange = (
-  formatMessage: FormatMessage,
-  startAt: string,
-  endAt: string | null
-) => {
-  const startAtMoment = moment(startAt);
-
-  if (!endAt) {
-    return formatMessage(messages.untilNow, {
-      date: startAtMoment.format('DD MMM YYYY'),
-    });
-  }
-
-  const endAtMoment = moment(endAt);
-
-  const sameYear = startAtMoment.year() === endAtMoment.year();
-  const sameMonth = sameYear && startAtMoment.month() === endAtMoment.month();
-
-  if (sameMonth) {
-    return `${startAtMoment.format('DD')} - ${endAtMoment.format(
-      'DD MMM YYYY'
-    )}`;
-  }
-
-  if (sameYear) {
-    return `${startAtMoment.format('DD MMM')} - ${endAtMoment.format(
-      'DD MMM YYYY'
-    )}`;
-  }
-
-  return `${startAtMoment.format('DD MMM YYYY')} - ${endAtMoment.format(
-    'DD MMM YYYY'
-  )}`;
-};
-
-export const getPhaseIndex = (phases: IPhaseData[], phaseId: string) => {
-  return phases.findIndex((phase) => phase.id === phaseId);
-};
-
 const EMPTY_COLOR = colors.coolGrey300;
 
 export const getColorScheme = (length: number) => {

From 494da8ce87426d941393bfaa11c27cb770021af4 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Tue, 5 Mar 2024 16:51:38 +0000
Subject: [PATCH 107/282] Move quit modal into separate component

---
 .../ReportBuilder/TopBar/QuitModal.tsx        | 59 +++++++++++++++++++
 .../components/ReportBuilder/TopBar/index.tsx | 52 +++++-----------
 .../ReportBuilder/ViewContainer/PDFButton.tsx | 29 ---------
 .../ViewContainer/ViewPicker.tsx              | 54 ++++++++++-------
 .../containers/ReportBuilder/index.tsx        |  4 +-
 5 files changed, 108 insertions(+), 90 deletions(-)
 create mode 100644 front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/QuitModal.tsx
 delete mode 100644 front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/PDFButton.tsx

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/QuitModal.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/QuitModal.tsx
new file mode 100644
index 000000000000..91363728336a
--- /dev/null
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/QuitModal.tsx
@@ -0,0 +1,59 @@
+import React from 'react';
+
+// components
+import { Box, Text, Title } from '@citizenlab/cl2-component-library';
+import Modal from 'components/UI/Modal';
+import Button from 'components/UI/Button';
+
+// i18n
+import { FormattedMessage } from 'utils/cl-intl';
+import messages from './messages';
+
+interface Props {
+  open: boolean;
+  onCloseModal: () => void;
+  onGoBack: () => void;
+}
+
+const QuitModal = ({ open, onCloseModal, onGoBack }: Props) => {
+  return (
+    <Modal opened={open} close={onCloseModal}>
+      <Box display="flex" flexDirection="column" width="100%" p="20px">
+        <Box mb="40px">
+          <Title variant="h3" color="primary">
+            <FormattedMessage {...messages.quitReportConfirmationQuestion} />
+          </Title>
+          <Text color="primary" fontSize="l">
+            <FormattedMessage {...messages.quitReportInfo} />
+          </Text>
+        </Box>
+        <Box
+          display="flex"
+          flexDirection="row"
+          width="100%"
+          alignItems="center"
+        >
+          <Button
+            buttonStyle="secondary"
+            width="auto"
+            mr="16px"
+            onClick={onCloseModal}
+          >
+            <FormattedMessage {...messages.cancelQuitButtonText} />
+          </Button>
+          <Button
+            icon="delete"
+            data-cy="e2e-confirm-delete-survey-results"
+            buttonStyle="delete"
+            width="auto"
+            onClick={onGoBack}
+          >
+            <FormattedMessage {...messages.confirmQuitButtonText} />
+          </Button>
+        </Box>
+      </Box>
+    </Modal>
+  );
+};
+
+export default QuitModal;
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index df3261158705..92c27e35b2bb 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -11,6 +11,7 @@ import { useReportContext } from 'containers/Admin/reporting/context/ReportConte
 
 // components
 import Container from 'components/admin/ContentBuilder/TopBar/Container';
+import QuitModal from './QuitModal';
 import LocaleSwitcher from 'components/admin/ContentBuilder/TopBar/LocaleSwitcher';
 import SaveButton from 'components/admin/ContentBuilder/TopBar/SaveButton';
 import {
@@ -20,7 +21,6 @@ import {
   Title,
   colors,
 } from '@citizenlab/cl2-component-library';
-import Modal from 'components/UI/Modal';
 import Button from 'components/UI/Button';
 
 // i18n
@@ -33,7 +33,9 @@ import clHistory from 'utils/cl-router/history';
 
 // types
 import { Locale } from 'typings';
+import { View } from '../ViewContainer/typings';
 import { removeSearchParams } from 'utils/cl-router/removeSearchParams';
+import ViewPicker from '../ViewContainer/ViewPicker';
 
 type ContentBuilderTopBarProps = {
   hasError: boolean;
@@ -42,6 +44,8 @@ type ContentBuilderTopBarProps = {
   reportId: string;
   isTemplate: boolean;
   saved: boolean;
+  view: View;
+  setView: (view: View) => void;
   setSaved: React.Dispatch<React.SetStateAction<boolean>>;
   setSelectedLocale: React.Dispatch<React.SetStateAction<Locale>>;
 };
@@ -53,6 +57,8 @@ const ContentBuilderTopBar = ({
   reportId,
   isTemplate,
   saved,
+  view,
+  setView,
   setSaved,
   setSelectedLocale,
 }: ContentBuilderTopBarProps) => {
@@ -173,42 +179,11 @@ const ContentBuilderTopBar = ({
 
   return (
     <Container id="e2e-report-builder-topbar">
-      <Modal opened={showQuitModal} close={closeModal}>
-        <Box display="flex" flexDirection="column" width="100%" p="20px">
-          <Box mb="40px">
-            <Title variant="h3" color="primary">
-              <FormattedMessage {...messages.quitReportConfirmationQuestion} />
-            </Title>
-            <Text color="primary" fontSize="l">
-              <FormattedMessage {...messages.quitReportInfo} />
-            </Text>
-          </Box>
-          <Box
-            display="flex"
-            flexDirection="row"
-            width="100%"
-            alignItems="center"
-          >
-            <Button
-              buttonStyle="secondary"
-              width="auto"
-              mr="16px"
-              onClick={closeModal}
-            >
-              <FormattedMessage {...messages.cancelQuitButtonText} />
-            </Button>
-            <Button
-              icon="delete"
-              data-cy="e2e-confirm-delete-survey-results"
-              buttonStyle="delete"
-              width="auto"
-              onClick={doGoBack}
-            >
-              <FormattedMessage {...messages.confirmQuitButtonText} />
-            </Button>
-          </Box>
-        </Box>
-      </Modal>
+      <QuitModal
+        open={showQuitModal}
+        onCloseModal={closeModal}
+        onGoBack={doGoBack}
+      />
       <IconButton
         iconName="arrow-left"
         onClick={goBack}
@@ -233,6 +208,9 @@ const ContentBuilderTopBar = ({
             </Text>
           )}
         </Box>
+        <Box mr="16px">
+          {!!phaseId && <ViewPicker view={view} setView={setView} />}
+        </Box>
         <LocaleSwitcher
           selectedLocale={selectedLocale}
           onSelectLocale={setSelectedLocale}
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/PDFButton.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/PDFButton.tsx
deleted file mode 100644
index 48e450b52bfe..000000000000
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/PDFButton.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import React from 'react';
-
-// components
-import ViewButton from 'components/admin/ContentBuilder/EditModePreview/ViewButtons/ViewButton';
-import { Icon, colors } from '@citizenlab/cl2-component-library';
-
-interface Props {
-  active: boolean;
-  onClick: () => void;
-}
-
-const PDFButton = ({ active, onClick }: Props) => {
-  return (
-    <ViewButton
-      id="e2e-pdf-preview"
-      active={active}
-      borderRadius="0px"
-      onClick={onClick}
-    >
-      <Icon
-        name="file"
-        width="20px"
-        fill={active ? colors.white : colors.primary}
-      />
-    </ViewButton>
-  );
-};
-
-export default PDFButton;
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/ViewPicker.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/ViewPicker.tsx
index 43fe1a7a2a0f..ead38086c0b0 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/ViewPicker.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/ViewPicker.tsx
@@ -1,12 +1,7 @@
 import React from 'react';
 
-// components
-import { Box } from '@citizenlab/cl2-component-library';
-import MobileButton from 'components/admin/ContentBuilder/EditModePreview/ViewButtons/MobileButton';
-import PDFButton from './PDFButton';
-import DesktopButton from 'components/admin/ContentBuilder/EditModePreview/ViewButtons/DesktopButton';
+import { Box, colors, Button } from '@citizenlab/cl2-component-library';
 
-// typings
 import { View } from './typings';
 
 interface Props {
@@ -16,24 +11,39 @@ interface Props {
 
 const ViewPicker = ({ view, setView }: Props) => {
   return (
-    <Box display="flex" mb="16px" mt="-16px">
-      <MobileButton
-        active={view === 'phone'}
-        onClick={() => {
-          setView('phone');
-        }}
+    <Box display="flex" p="4px" bgColor={colors.grey300} borderRadius="3px">
+      <Button
+        icon="tablet"
+        buttonStyle="text"
+        bgColor={view === 'phone' ? colors.white : colors.grey300}
+        bgHoverColor={colors.white}
+        iconColor={colors.textSecondary}
+        iconSize="16px"
+        onClick={() => setView('phone')}
+        p="4px 8px"
+        mx="2px"
       />
-      <PDFButton
-        active={view === 'pdf'}
-        onClick={() => {
-          setView('pdf');
-        }}
+      <Button
+        icon="file"
+        buttonStyle="text"
+        bgColor={view === 'pdf' ? colors.white : colors.grey300}
+        bgHoverColor={colors.white}
+        iconColor={colors.textSecondary}
+        iconSize="16px"
+        onClick={() => setView('pdf')}
+        p="4px 8px"
+        mx="2px"
       />
-      <DesktopButton
-        active={view === 'desktop'}
-        onClick={() => {
-          setView('desktop');
-        }}
+      <Button
+        icon="desktop"
+        buttonStyle="text"
+        bgColor={view === 'desktop' ? colors.white : colors.grey300}
+        bgHoverColor={colors.white}
+        iconColor={colors.textSecondary}
+        iconSize="16px"
+        onClick={() => setView('desktop')}
+        p="4px 8px"
+        mx="2px"
       />
     </Box>
   );
diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index 91d21d155980..5e83b92d5bdf 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -22,7 +22,6 @@ import Toolbox from '../../components/ReportBuilder/Toolbox';
 import { StyledRightColumn } from 'components/admin/ContentBuilder/Frame/FrameWrapper';
 import Frame from 'components/admin/ContentBuilder/Frame';
 import Settings from '../../components/ReportBuilder/Settings';
-import ViewPicker from '../../components/ReportBuilder/ViewContainer/ViewPicker';
 import ViewContainer from '../../components/ReportBuilder/ViewContainer';
 
 // templates
@@ -104,7 +103,9 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
             reportId={reportId}
             isTemplate={!!templateProjectId || !!templatePhaseId}
             saved={saved}
+            view={view}
             setSaved={setSaved}
+            setView={setView}
             setSelectedLocale={setSelectedLocale}
           />
           <Box mt={`${stylingConsts.menuHeight}px`}>
@@ -114,7 +115,6 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
               platformLocale={platformLocale}
             >
               <StyledRightColumn>
-                {!!phaseId && <ViewPicker view={view} setView={setView} />}
                 <ViewContainer view={view}>
                   <Frame editorData={initialData}>
                     {emptyReportOnInit && templateProjectId ? (

From b2638cec5a3ebf6bb6a529fa81c1413db5693882 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Tue, 5 Mar 2024 18:34:37 +0100
Subject: [PATCH 108/282] [TAN-1241] Dirty hack to avoid setting `saved` to
 false immediately after page load

---
 .../reporting/containers/ReportBuilder/index.tsx     | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index dee9c94a6764..f8860cab1683 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -68,6 +68,7 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
   const [selectedLocale, setSelectedLocale] = useState<Locale>(platformLocale);
 
   const [saved, setSaved] = useState(true);
+  const [initialDataLoadedCounter, setInitialDataLoadedCounter] = useState(0);
   const [contentBuilderErrors, setContentBuilderErrors] =
     useState<ContentBuilderErrors>({});
 
@@ -96,7 +97,16 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
         onDeleteElement={handleDeleteElement}
         onUploadImage={setImageUploading}
       >
-        <Editor isPreview={false} onNodesChange={() => setSaved(false)}>
+        <Editor
+          isPreview={false}
+          onNodesChange={() => {
+            // onNodesChange is called twice on initial load
+            if (initialDataLoadedCounter >= 2) {
+              setSaved(false);
+            }
+            setInitialDataLoadedCounter((counter) => counter + 1);
+          }}
+        >
           <TopBar
             hasError={hasError}
             hasPendingState={imageUploading}

From b300604fadf5bb45df2ff04a48381d19c7defe45 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Wed, 6 Mar 2024 10:25:38 +0100
Subject: [PATCH 109/282] [TAN-1247] Show only text in default locale in Text
 widget

---
 .../reporting/components/ReportBuilder/Toolbox/index.tsx | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
index 308e1ed10d2d..7ff713938d16 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
@@ -102,6 +102,7 @@ const ReportBuilderToolbox = ({ reportId }: ReportBuilderToolboxProps) => {
 
   // Default end date for charts (today)
   const chartEndDate = moment().format('YYYY-MM-DD');
+  const defaultLocale = appConfigurationLocales[0];
 
   const toMultiloc = (message: MessageDescriptor) => {
     return createMultiloc(appConfigurationLocales, (locale) => {
@@ -162,7 +163,13 @@ const ReportBuilderToolbox = ({ reportId }: ReportBuilderToolboxProps) => {
           <DraggableElement
             id="e2e-draggable-text"
             component={
-              <TextMultiloc text={toMultiloc(WIDGET_TITLES.TextMultiloc)} />
+              <TextMultiloc
+                text={{
+                  [defaultLocale]: toMultiloc(WIDGET_TITLES.TextMultiloc)[
+                    defaultLocale
+                  ],
+                }}
+              />
             }
             icon="text"
             label={formatMessage(WIDGET_TITLES.TextMultiloc)}

From 4b145d56baa66ba3c6e344e835b568c87767923e Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Wed, 6 Mar 2024 10:26:08 +0100
Subject: [PATCH 110/282] [TAN-1247] Don't show any text in Text widget
 similarly to Page and Project builders

---
 .../components/ReportBuilder/Toolbox/index.tsx        | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
index 7ff713938d16..2c28ba25fb09 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
@@ -102,7 +102,6 @@ const ReportBuilderToolbox = ({ reportId }: ReportBuilderToolboxProps) => {
 
   // Default end date for charts (today)
   const chartEndDate = moment().format('YYYY-MM-DD');
-  const defaultLocale = appConfigurationLocales[0];
 
   const toMultiloc = (message: MessageDescriptor) => {
     return createMultiloc(appConfigurationLocales, (locale) => {
@@ -162,15 +161,7 @@ const ReportBuilderToolbox = ({ reportId }: ReportBuilderToolboxProps) => {
           />
           <DraggableElement
             id="e2e-draggable-text"
-            component={
-              <TextMultiloc
-                text={{
-                  [defaultLocale]: toMultiloc(WIDGET_TITLES.TextMultiloc)[
-                    defaultLocale
-                  ],
-                }}
-              />
-            }
+            component={<TextMultiloc />}
             icon="text"
             label={formatMessage(WIDGET_TITLES.TextMultiloc)}
           />

From 345fb0232e26fb55d6be67fd5f6fe6222f637229 Mon Sep 17 00:00:00 2001
From: jamesspeake <james@speake.org>
Date: Wed, 6 Mar 2024 10:42:33 +0000
Subject: [PATCH 111/282] [TAN-1129] Block residents from seeing survey forms
 when phase not current & allow admins to submit surveys on non-active phases

---
 .../web_api/v1/ideas_controller.rb            | 10 +---
 .../IdeasNewPage/IdeasNewSurveyForm/index.tsx | 17 ++++--
 .../components/SurveyNotActiveNotice.tsx      | 56 +++++++++++++++++++
 .../IdeasNewPage/components/messages.ts       |  9 +++
 4 files changed, 79 insertions(+), 13 deletions(-)
 create mode 100644 front/app/containers/IdeasNewPage/components/SurveyNotActiveNotice.tsx

diff --git a/back/app/controllers/web_api/v1/ideas_controller.rb b/back/app/controllers/web_api/v1/ideas_controller.rb
index 569eed3f9652..98cab421c16d 100644
--- a/back/app/controllers/web_api/v1/ideas_controller.rb
+++ b/back/app/controllers/web_api/v1/ideas_controller.rb
@@ -119,19 +119,15 @@ def draft_by_phase
     render_show Idea.find_by!(creation_phase_id: params[:phase_id], author: current_user, publication_status: 'draft')
   end
 
-  #   Normal users always post in an active phase. They should never provide a phase id.
+  #   Normal users always post in an active phase. Provided phase id should be ignored.
   #   Users who can moderate projects post in an active phase if no phase id is given.
   #   Users who can moderate projects post in the given phase if a phase id is given.
   def create
     project = Project.find(params.dig(:idea, :project_id))
-    phase_ids = params.dig(:idea, :phase_ids) || []
     is_moderator = current_user && UserRoleService.new.can_moderate_project?(project, current_user)
+    phase_ids = is_moderator ? params.dig(:idea, :phase_ids) || [] : []
 
-    if phase_ids.any?
-      send_error and return unless is_moderator
-
-      send_error and return if phase_ids.size != 1
-    end
+    send_error and return if phase_ids.any? && phase_ids.size != 1
 
     phase = if is_moderator && phase_ids.any?
       Phase.find(phase_ids.first)
diff --git a/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx b/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
index 700d84d144e3..7c7cf26078d4 100644
--- a/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
+++ b/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
@@ -23,6 +23,7 @@ import { AjvErrorGetter, ApiErrorGetter } from 'components/Form/typings';
 import FullPageSpinner from 'components/UI/FullPageSpinner';
 import PageContainer from 'components/UI/PageContainer';
 import Warning from 'components/UI/Warning';
+import SurveyNotActiveNotice from '../components/SurveyNotActiveNotice';
 
 import { useIntl } from 'utils/cl-intl';
 import { getMethodConfig } from 'utils/configs/participationMethodConfig';
@@ -81,10 +82,16 @@ const IdeasNewSurveyForm = ({ project }: Props) => {
   const [ideaId, setIdeaId] = useState<string | undefined>();
 
   const [initialFormData, setInitialFormData] = useState({});
-  const participationContext = getCurrentPhase(phases?.data);
+  const currentPhase = getCurrentPhase(phases?.data);
   const participationMethodConfig = getConfig(phaseFromUrl?.data, phases);
   const allowAnonymousPosting =
-    participationContext?.attributes.allow_anonymous_participation;
+    phaseFromUrl?.data.attributes.allow_anonymous_participation;
+
+  const canUserEditProject =
+    !isNilOrError(authUser) &&
+    canModerateProject(project.data.id, { data: authUser.data });
+
+  const canUserViewForm = canUserEditProject || phaseId === currentPhase?.id;
 
   const getApiErrorMessage: ApiErrorGetter = useCallback(
     (error) => {
@@ -156,7 +163,7 @@ const IdeasNewSurveyForm = ({ project }: Props) => {
     const requestBody = {
       ...data,
       project_id: project.data.id,
-      // phase_ids: [phaseId], // TODO: JS - should only be added if moderator
+      phase_ids: [phaseId], // Note: Backend only uses if moderator
       publication_status: data.publication_status || 'published',
     };
 
@@ -207,9 +214,7 @@ const IdeasNewSurveyForm = ({ project }: Props) => {
     }
   };
 
-  const canUserEditProject =
-    !isNilOrError(authUser) &&
-    canModerateProject(project.data.id, { data: authUser.data });
+  if (!canUserViewForm) return <SurveyNotActiveNotice project={project.data} />;
 
   return (
     <PageContainer id="e2e-idea-new-page" overflow="hidden">
diff --git a/front/app/containers/IdeasNewPage/components/SurveyNotActiveNotice.tsx b/front/app/containers/IdeasNewPage/components/SurveyNotActiveNotice.tsx
new file mode 100644
index 000000000000..ef2026e1b6f5
--- /dev/null
+++ b/front/app/containers/IdeasNewPage/components/SurveyNotActiveNotice.tsx
@@ -0,0 +1,56 @@
+import React from 'react';
+
+// components
+import {
+  Box,
+  Button,
+  Text,
+  Title,
+  useBreakpoint,
+} from '@citizenlab/cl2-component-library';
+import PageContainer from 'components/UI/PageContainer';
+
+// intl
+import { useIntl } from 'utils/cl-intl';
+import messages from './messages';
+
+// util
+import clHistory from 'utils/cl-router/history';
+
+// types
+import { IProjectData } from 'api/projects/types';
+
+type Props = {
+  project: IProjectData;
+};
+
+const SurveyNotActiveNotice = ({ project }: Props) => {
+  const { formatMessage } = useIntl();
+  const isMobileOrSmaller = useBreakpoint('phone');
+
+  return (
+    <PageContainer>
+      <Box mx="auto">
+        <Title mt={isMobileOrSmaller ? '80px' : '160px'} textAlign="center">
+          {formatMessage(messages.surveyNotActiveTitle)}
+        </Title>
+        <Text mb="30px" textAlign="center">
+          {formatMessage(messages.surveyNotActiveDescription)}
+        </Text>
+        <Box display="flex" justifyContent="center">
+          <Button
+            icon="arrow-left"
+            pl="12px"
+            onClick={() => {
+              clHistory.push(`/projects/${project.attributes.slug}`);
+            }}
+          >
+            {formatMessage(messages.returnToProject)}
+          </Button>
+        </Box>
+      </Box>
+    </PageContainer>
+  );
+};
+
+export default SurveyNotActiveNotice;
diff --git a/front/app/containers/IdeasNewPage/components/messages.ts b/front/app/containers/IdeasNewPage/components/messages.ts
index 3c4711b33559..7c320604abb2 100644
--- a/front/app/containers/IdeasNewPage/components/messages.ts
+++ b/front/app/containers/IdeasNewPage/components/messages.ts
@@ -17,4 +17,13 @@ export default defineMessages({
     id: 'app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject',
     defaultMessage: 'Return to project',
   },
+  surveyNotActiveTitle: {
+    id: 'app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle',
+    defaultMessage: 'This survey is not currently active.',
+  },
+  surveyNotActiveDescription: {
+    id: 'app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription',
+    defaultMessage:
+      'This survey is not currently open for responses. Please return to the project for more information.',
+  },
 });

From 8d6eb227f2d92f89d95ddc163e593973fafd0bc9 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Wed, 6 Mar 2024 11:47:07 +0100
Subject: [PATCH 112/282] New translations en.json (French)

---
 front/app/translations/admin/fr-FR.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index e7b2e6cec00c..9fc2cd6b14a0 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -234,7 +234,7 @@
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupport": "Insérez le lien de votre document Konveio ici. Consultez notre {supportArticleLink} pour obtenir plus d'informations sur la configuration de Konveio.",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportArticle": "article d'assistance",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportPageURL": "https://support.citizenlab.co/en/articles/7946532-embedding-konveio-pdf-documents-for-collecting-feedback",
-  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Ce service n'est pas inclus dans votre plan actuel. Contactez votre Government Success Manager ou votre administrateur pour le débloquer.",
+  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Cette fonctionnalité n'est pas incluse dans votre plan actuel. Adressez-vous à votre GovSuccess Manager ou à votre administrateur pour la débloquer.",
   "app.components.app.containers.AdminPage.ProjectEdit.maxBudgetRequired": "Un budget maximum est requis",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesPerOptionError": "Le nombre maximum de votes par option doit être inférieur ou égal au nombre total de votes",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesRequired": "Un nombre maximum de votes est requis",
@@ -2471,7 +2471,7 @@
   "app.modules.navbar.admin.containers.pageHeader": "Pages et menu",
   "app.modules.navbar.admin.containers.pageSubtitle": "Votre barre de navigation peut afficher jusqu'à cinq pages en plus des pages d'accueil et des projets. Vous pouvez renommer les éléments du menu, les réorganiser et ajouter de nouvelles pages avec votre propre contenu.",
   "app.modules.project_management.admin.components.permissionsTab": "Droits d'accès",
-  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Ce service n'est pas inclus dans votre plan actuel. Contactez votre Government Success Manager ou votre administrateur pour le débloquer.",
+  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Cette fonctionnalité n'est pas incluse dans votre plan actuel. Adressez-vous à votre GovSuccess Manager ou à votre administrateur pour la débloquer.",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupBySurveyQuestion": "Question",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupByUserField": "Champ utilisateur",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupMode": "Agrégation",

From dfab42da61dc94ab01f61df409404d6d436f38dc Mon Sep 17 00:00:00 2001
From: jamesspeake <james@speake.org>
Date: Wed, 6 Mar 2024 10:50:00 +0000
Subject: [PATCH 113/282] [TAN-1249] Rolled back back-end changes to do in the
 front only

---
 back/app/controllers/web_api/v1/ideas_controller.rb    | 10 +++++++---
 .../IdeasNewPage/IdeasNewSurveyForm/index.tsx          |  8 ++++----
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/back/app/controllers/web_api/v1/ideas_controller.rb b/back/app/controllers/web_api/v1/ideas_controller.rb
index 98cab421c16d..569eed3f9652 100644
--- a/back/app/controllers/web_api/v1/ideas_controller.rb
+++ b/back/app/controllers/web_api/v1/ideas_controller.rb
@@ -119,15 +119,19 @@ def draft_by_phase
     render_show Idea.find_by!(creation_phase_id: params[:phase_id], author: current_user, publication_status: 'draft')
   end
 
-  #   Normal users always post in an active phase. Provided phase id should be ignored.
+  #   Normal users always post in an active phase. They should never provide a phase id.
   #   Users who can moderate projects post in an active phase if no phase id is given.
   #   Users who can moderate projects post in the given phase if a phase id is given.
   def create
     project = Project.find(params.dig(:idea, :project_id))
+    phase_ids = params.dig(:idea, :phase_ids) || []
     is_moderator = current_user && UserRoleService.new.can_moderate_project?(project, current_user)
-    phase_ids = is_moderator ? params.dig(:idea, :phase_ids) || [] : []
 
-    send_error and return if phase_ids.any? && phase_ids.size != 1
+    if phase_ids.any?
+      send_error and return unless is_moderator
+
+      send_error and return if phase_ids.size != 1
+    end
 
     phase = if is_moderator && phase_ids.any?
       Phase.find(phase_ids.first)
diff --git a/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx b/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
index 7c7cf26078d4..da27ae271250 100644
--- a/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
+++ b/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
@@ -87,11 +87,11 @@ const IdeasNewSurveyForm = ({ project }: Props) => {
   const allowAnonymousPosting =
     phaseFromUrl?.data.attributes.allow_anonymous_participation;
 
-  const canUserEditProject =
+  const userIsModerator =
     !isNilOrError(authUser) &&
     canModerateProject(project.data.id, { data: authUser.data });
 
-  const canUserViewForm = canUserEditProject || phaseId === currentPhase?.id;
+  const canUserViewForm = userIsModerator || phaseId === currentPhase?.id;
 
   const getApiErrorMessage: ApiErrorGetter = useCallback(
     (error) => {
@@ -163,7 +163,7 @@ const IdeasNewSurveyForm = ({ project }: Props) => {
     const requestBody = {
       ...data,
       project_id: project.data.id,
-      phase_ids: [phaseId], // Note: Backend only uses if moderator
+      phase_ids: userIsModerator ? [phaseId] : [],
       publication_status: data.publication_status || 'published',
     };
 
@@ -245,7 +245,7 @@ const IdeasNewSurveyForm = ({ project }: Props) => {
                     )
                   }
                   isSurvey={true}
-                  canUserEditProject={canUserEditProject}
+                  canUserEditProject={userIsModerator}
                   loggedIn={!isNilOrError(authUser)}
                 />
                 {allowAnonymousPosting && (

From 3bb6a07f4b200f8f922ea23e1312a8a2d77633c4 Mon Sep 17 00:00:00 2001
From: brentguf <brentguf@users.noreply.github.com>
Date: Wed, 6 Mar 2024 11:51:09 +0100
Subject: [PATCH 114/282] Take out permissions changes

---
 front/app/utils/permissions/permissions.ts                | 6 +++---
 .../utils/permissions/rules/projectFolderPermissions.ts   | 2 +-
 front/app/utils/permissions/rules/routePermissions.ts     | 8 +++++---
 3 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/front/app/utils/permissions/permissions.ts b/front/app/utils/permissions/permissions.ts
index 3310318c51e7..f682c15443c0 100644
--- a/front/app/utils/permissions/permissions.ts
+++ b/front/app/utils/permissions/permissions.ts
@@ -26,7 +26,7 @@ interface IResourceData {
 interface IPermissionRule {
   (
     resource: TPermissionItem | null,
-    user: IUser,
+    user: IUser | null,
     tenant: IAppConfigurationData,
     context?: any
   ): boolean;
@@ -84,7 +84,7 @@ const hasPermission = ({
 }) => {
   return authUserStream.pipe(
     map((user) => {
-      if (!item || !user) {
+      if (!item) {
         return false;
       }
 
@@ -92,7 +92,7 @@ const hasPermission = ({
       const rule = getPermissionRule(resourceType, action);
 
       if (rule && appConfiguration) {
-        return rule(item, user, appConfiguration.data, context);
+        return rule(item, user || null, appConfiguration.data, context);
       } else {
         throw `No permission rule is specified on resource '${resourceType}' for action '${action}'`;
       }
diff --git a/front/app/utils/permissions/rules/projectFolderPermissions.ts b/front/app/utils/permissions/rules/projectFolderPermissions.ts
index db96000d8305..3c38e8cce99c 100644
--- a/front/app/utils/permissions/rules/projectFolderPermissions.ts
+++ b/front/app/utils/permissions/rules/projectFolderPermissions.ts
@@ -41,7 +41,7 @@ export function isProjectFolderModerator(user: IUserData) {
 // rules
 const canUserAccessAdminFolderRoute = (
   item: IRouteItem,
-  user: IUser,
+  user: IUser | null,
   tenant: IAppConfigurationData
 ) => {
   const hasAdminFolderRouteAccess =
diff --git a/front/app/utils/permissions/rules/routePermissions.ts b/front/app/utils/permissions/rules/routePermissions.ts
index d0ab388052ce..f01347e4d11f 100644
--- a/front/app/utils/permissions/rules/routePermissions.ts
+++ b/front/app/utils/permissions/rules/routePermissions.ts
@@ -47,11 +47,13 @@ export const isAdminRoute = (path: string) => {
   return /^\/admin/.test(path);
 };
 
-const isModeratedProjectRoute = (item: IRouteItem, user: IUser) => {
+const isModeratedProjectRoute = (item: IRouteItem, user: IUser | null) => {
   const idRegexp = /^\/admin\/projects\/([a-z0-9-]+)\/?/;
   const matches = idRegexp.exec(item.path);
   const pathProjectId = matches && matches[1];
-  return (pathProjectId && isProjectModerator(user, pathProjectId)) || false;
+  return typeof pathProjectId === 'string' && user !== null
+    ? isProjectModerator(user, pathProjectId)
+    : false;
 };
 
 const tenantIsChurned = (tenant: IAppConfigurationData) => {
@@ -60,7 +62,7 @@ const tenantIsChurned = (tenant: IAppConfigurationData) => {
 
 export const canAccessRoute = (
   item: IRouteItem,
-  user: IUser,
+  user: IUser | null,
   tenant: IAppConfigurationData
 ) => {
   if (isAdminRoute(item.path)) {

From 0c134c0ec92328be6dfd75fa5e92c62a8311ac27 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Wed, 6 Mar 2024 10:53:16 +0000
Subject: [PATCH 115/282] Translations updated by CI (extract-intl)

---
 front/app/translations/en.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/en.json b/front/app/translations/en.json
index 5df8270a2570..d02e34396fdd 100644
--- a/front/app/translations/en.json
+++ b/front/app/translations/en.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "By default your submissions will be associated with your profile, unless you select this option.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Post anonymously",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Profile visibility",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "This survey is not currently open for responses. Please return to the project for more information.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "This survey is not currently active.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Return to project",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "You have already completed this survey.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Survey submitted",

From ef5ed19f2a57f89567fa1306fb5fe928f0c495ba Mon Sep 17 00:00:00 2001
From: Adrien Dessy <adrien@citizenlab.co>
Date: Wed, 6 Mar 2024 12:05:22 +0100
Subject: [PATCH 116/282] [TAN-966] Add a single-use rake task to migrate v1
 que jobs to v2

---
 .../20240306_convert_que_jobs_v1_to_v2.rake   | 35 +++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake

diff --git a/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake b/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake
new file mode 100644
index 000000000000..94cc035148e6
--- /dev/null
+++ b/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+namespace :single_use do
+  task convert_que_jobs_v1_to_v2: :environment do
+    Tenant.switch_each do |tenant|
+      tenant_name = Tenant.host_to_schema_name(tenant.host)
+      jobs_v1 = QueJob.by_args({ tenant_schema_name: tenant_name }, {}).not_expired.not_finished.where(job_schema_version: 1)
+
+      Rails.logger.info('Converting Que jobs from v1 to v2', tenant: tenant.host, count: jobs_v1.count)
+
+      jobs_v1.each do |job|
+        begin
+          job_class = job.args['job_class'].constantize
+        rescue NameError
+          job.destroy!
+          next
+        end
+
+        begin
+          arguments = ActiveJob::Arguments.deserialize(job.args['arguments'])
+        rescue ActiveRecord::RecordNotFound, ActiveJob::DeserializationError
+          job.destroy!
+          next
+        end
+
+        QueJob.transaction do
+          job_class.set(priority: job.priority, wait_until: job.run_at, queue: job.queue).perform_later(*arguments)
+          job.destroy!
+        end
+      rescue StandardError => e
+        Rails.logger.error('Failed to convert Que job from v1 to v2', job_id: job.id, exception: e)
+      end
+    end
+  end
+end

From b5c5b4364109e63ee86c4922f12f1483f6ef829c Mon Sep 17 00:00:00 2001
From: jamesspeake <james@speake.org>
Date: Wed, 6 Mar 2024 11:12:09 +0000
Subject: [PATCH 117/282] [TAN-1249] Moved notice up a layer

---
 .../IdeasNewPage/IdeasNewSurveyForm/index.tsx |  6 ------
 front/app/containers/IdeasNewPage/index.tsx   | 20 ++++++++++++++++---
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx b/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
index da27ae271250..19d9b4beca20 100644
--- a/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
+++ b/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
@@ -23,7 +23,6 @@ import { AjvErrorGetter, ApiErrorGetter } from 'components/Form/typings';
 import FullPageSpinner from 'components/UI/FullPageSpinner';
 import PageContainer from 'components/UI/PageContainer';
 import Warning from 'components/UI/Warning';
-import SurveyNotActiveNotice from '../components/SurveyNotActiveNotice';
 
 import { useIntl } from 'utils/cl-intl';
 import { getMethodConfig } from 'utils/configs/participationMethodConfig';
@@ -82,7 +81,6 @@ const IdeasNewSurveyForm = ({ project }: Props) => {
   const [ideaId, setIdeaId] = useState<string | undefined>();
 
   const [initialFormData, setInitialFormData] = useState({});
-  const currentPhase = getCurrentPhase(phases?.data);
   const participationMethodConfig = getConfig(phaseFromUrl?.data, phases);
   const allowAnonymousPosting =
     phaseFromUrl?.data.attributes.allow_anonymous_participation;
@@ -91,8 +89,6 @@ const IdeasNewSurveyForm = ({ project }: Props) => {
     !isNilOrError(authUser) &&
     canModerateProject(project.data.id, { data: authUser.data });
 
-  const canUserViewForm = userIsModerator || phaseId === currentPhase?.id;
-
   const getApiErrorMessage: ApiErrorGetter = useCallback(
     (error) => {
       return (
@@ -214,8 +210,6 @@ const IdeasNewSurveyForm = ({ project }: Props) => {
     }
   };
 
-  if (!canUserViewForm) return <SurveyNotActiveNotice project={project.data} />;
-
   return (
     <PageContainer id="e2e-idea-new-page" overflow="hidden">
       {!loadingDraftIdea && schema && uiSchema && participationMethodConfig ? (
diff --git a/front/app/containers/IdeasNewPage/index.tsx b/front/app/containers/IdeasNewPage/index.tsx
index d7e6dcf8dbb4..600cca756d29 100644
--- a/front/app/containers/IdeasNewPage/index.tsx
+++ b/front/app/containers/IdeasNewPage/index.tsx
@@ -22,8 +22,10 @@ import { isUnauthorizedRQ } from 'utils/errorUtils';
 import { isNilOrError } from 'utils/helperUtils';
 
 import SurveySubmittedNotice from './components/SurveySubmittedNotice';
+import SurveyNotActiveNotice from './components/SurveyNotActiveNotice';
 import IdeasNewIdeationForm from './IdeasNewIdeationForm';
 import IdeasNewSurveyForm from './IdeasNewSurveyForm';
+import { canModerateProject } from 'utils/permissions/rules/projectPermissions';
 
 const NewIdeaPage = () => {
   const { slug } = useParams();
@@ -58,6 +60,7 @@ const NewIdeaPage = () => {
     return null;
   }
 
+  const currentPhase = getCurrentPhase(phases?.data);
   const participationMethod = getParticipationMethod(
     project.data,
     phases?.data,
@@ -68,12 +71,23 @@ const NewIdeaPage = () => {
   const { enabled, disabledReason, authenticationRequirements } =
     getIdeaPostingRules({
       project: project.data,
-      phase: getCurrentPhase(phases?.data),
+      phase: currentPhase,
       authUser: authUser?.data,
     });
 
-  if (isSurvey && disabledReason === 'postingLimitedMaxReached') {
-    return <SurveySubmittedNotice project={project.data} />;
+  const userIsModerator =
+    !isNilOrError(authUser) &&
+    canModerateProject(project.data.id, { data: authUser.data });
+
+  const userCannotViewSurvey =
+    !userIsModerator && phase_id !== currentPhase?.id;
+
+  if (isSurvey) {
+    if (disabledReason === 'postingLimitedMaxReached') {
+      return <SurveySubmittedNotice project={project.data} />;
+    } else if (userCannotViewSurvey) {
+      return <SurveyNotActiveNotice project={project.data} />;
+    }
   }
 
   if ((enabled === 'maybe' && authenticationRequirements) || disabledReason) {

From c32e5a90d5d48c460ce252aad5372674ad42528e Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Wed, 6 Mar 2024 11:18:50 +0000
Subject: [PATCH 118/282] Make all buttons same height

---
 .../ContentBuilder/TopBar/SaveButton.tsx      | 11 +----
 .../ReportBuilder/TopBar/LocaleSelect.tsx     | 41 +++++++++++++++++++
 .../components/ReportBuilder/TopBar/index.tsx | 27 +++++++-----
 .../ViewContainer/ViewPicker.tsx              | 14 +++----
 4 files changed, 65 insertions(+), 28 deletions(-)
 create mode 100644 front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/LocaleSelect.tsx

diff --git a/front/app/components/admin/ContentBuilder/TopBar/SaveButton.tsx b/front/app/components/admin/ContentBuilder/TopBar/SaveButton.tsx
index 896f7a707676..edd7e884f0a2 100644
--- a/front/app/components/admin/ContentBuilder/TopBar/SaveButton.tsx
+++ b/front/app/components/admin/ContentBuilder/TopBar/SaveButton.tsx
@@ -10,21 +10,12 @@ import { colors } from '@citizenlab/cl2-component-library';
 import messages from './messages';
 import { FormattedMessage } from 'utils/cl-intl';
 
-interface Props {
-  disabled: boolean;
-  processing: boolean;
-  bgColor?: string;
-  icon?: ButtonProps['icon'];
-  onClick: () => void;
-}
-
-const SaveButton = ({ bgColor = colors.primary, icon, ...props }: Props) => (
+const SaveButton = ({ bgColor = colors.primary, ...props }: ButtonProps) => (
   <Button
     {...props}
     id="e2e-content-builder-topbar-save"
     buttonStyle="primary"
     bgColor={bgColor}
-    icon={icon}
     data-testid="contentBuilderTopBarSaveButton"
   >
     <FormattedMessage {...messages.contentBuilderSave} />
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/LocaleSelect.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/LocaleSelect.tsx
new file mode 100644
index 000000000000..2ddc9dd36f77
--- /dev/null
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/LocaleSelect.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+import { Box, colors } from '@citizenlab/cl2-component-library';
+import styled from 'styled-components';
+import useAppConfigurationLocales from 'hooks/useAppConfigurationLocales';
+import { Locale } from 'typings';
+
+const StyledSelect = styled.select`
+  background: ${colors.background};
+  padding: 4px 0px 4px 0px;
+  color: ${colors.textPrimary};
+  cursor: pointer;
+`;
+
+interface Props {
+  locale: Locale;
+  setLocale: (locale: Locale) => void;
+}
+
+const LocaleSelect = ({ locale, setLocale }: Props) => {
+  const locales = useAppConfigurationLocales();
+  if (!locales) return null;
+
+  return (
+    <Box bgColor={colors.background} p="4px 8px 4px 8px" borderRadius="3px">
+      <StyledSelect
+        value={locale}
+        onChange={(e) => {
+          setLocale(e.target.value as Locale);
+        }}
+      >
+        {locales.map((locale) => (
+          <option key={locale} value={locale}>
+            {locale.toUpperCase()}
+          </option>
+        ))}
+      </StyledSelect>
+    </Box>
+  );
+};
+
+export default LocaleSelect;
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index 92c27e35b2bb..e457ebbf9170 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -12,7 +12,6 @@ import { useReportContext } from 'containers/Admin/reporting/context/ReportConte
 // components
 import Container from 'components/admin/ContentBuilder/TopBar/Container';
 import QuitModal from './QuitModal';
-import LocaleSwitcher from 'components/admin/ContentBuilder/TopBar/LocaleSwitcher';
 import SaveButton from 'components/admin/ContentBuilder/TopBar/SaveButton';
 import {
   Box,
@@ -21,6 +20,7 @@ import {
   Title,
   colors,
 } from '@citizenlab/cl2-component-library';
+import LocaleSelect from './LocaleSelect';
 import Button from 'components/UI/Button';
 
 // i18n
@@ -208,22 +208,22 @@ const ContentBuilderTopBar = ({
             </Text>
           )}
         </Box>
-        <Box mr="16px">
+        <Box>
+          <LocaleSelect locale={selectedLocale} setLocale={setSelectedLocale} />
+        </Box>
+        <Box ml="32px">
           {!!phaseId && <ViewPicker view={view} setView={setView} />}
         </Box>
-        <LocaleSwitcher
-          selectedLocale={selectedLocale}
-          onSelectLocale={setSelectedLocale}
-        />
-        <Box mx="20px">
+        <Box ml="32px">
           <Button
             icon="print"
-            onClick={goBack}
             buttonStyle="secondary"
-            iconColor={colors.textSecondary}
-            iconSize="20px"
+            iconColor={colors.textPrimary}
+            iconSize="16px"
             px="12px"
-            py="12px"
+            py="8px"
+            linkTo={`/admin/reporting/report-builder/${reportId}/print`}
+            openLinkInNewTab
           />
         </Box>
         <SaveButton
@@ -232,6 +232,11 @@ const ContentBuilderTopBar = ({
           bgColor={saved ? colors.success : undefined}
           icon={saved ? 'check' : undefined}
           onClick={handleSave}
+          fontSize="14px"
+          ml="8px"
+          px="12px"
+          pb="3px"
+          pt="4px"
         />
       </Box>
     </Container>
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/ViewPicker.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/ViewPicker.tsx
index ead38086c0b0..a7e538355e9b 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/ViewPicker.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/ViewContainer/ViewPicker.tsx
@@ -11,13 +11,13 @@ interface Props {
 
 const ViewPicker = ({ view, setView }: Props) => {
   return (
-    <Box display="flex" p="4px" bgColor={colors.grey300} borderRadius="3px">
+    <Box display="flex" p="4px" bgColor={colors.background} borderRadius="3px">
       <Button
         icon="tablet"
         buttonStyle="text"
-        bgColor={view === 'phone' ? colors.white : colors.grey300}
+        bgColor={view === 'phone' ? colors.white : colors.background}
         bgHoverColor={colors.white}
-        iconColor={colors.textSecondary}
+        iconColor={colors.textPrimary}
         iconSize="16px"
         onClick={() => setView('phone')}
         p="4px 8px"
@@ -26,9 +26,9 @@ const ViewPicker = ({ view, setView }: Props) => {
       <Button
         icon="file"
         buttonStyle="text"
-        bgColor={view === 'pdf' ? colors.white : colors.grey300}
+        bgColor={view === 'pdf' ? colors.white : colors.background}
         bgHoverColor={colors.white}
-        iconColor={colors.textSecondary}
+        iconColor={colors.textPrimary}
         iconSize="16px"
         onClick={() => setView('pdf')}
         p="4px 8px"
@@ -37,9 +37,9 @@ const ViewPicker = ({ view, setView }: Props) => {
       <Button
         icon="desktop"
         buttonStyle="text"
-        bgColor={view === 'desktop' ? colors.white : colors.grey300}
+        bgColor={view === 'desktop' ? colors.white : colors.background}
         bgHoverColor={colors.white}
-        iconColor={colors.textSecondary}
+        iconColor={colors.textPrimary}
         iconSize="16px"
         onClick={() => setView('desktop')}
         p="4px 8px"

From eb730180dc59fc518c4554b6fd17278e74480eb8 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Wed, 6 Mar 2024 11:39:15 +0000
Subject: [PATCH 119/282] Fix e2e tests

---
 .../components/ReportBuilder/TopBar/LocaleSelect.tsx      | 1 +
 .../reporting/components/ReportBuilder/TopBar/index.tsx   | 8 +++++---
 front/cypress/e2e/report_builder/global_report.cy.ts      | 4 ++--
 front/cypress/e2e/report_builder/idea_template.cy.ts      | 4 ++--
 4 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/LocaleSelect.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/LocaleSelect.tsx
index 2ddc9dd36f77..e74e9067160b 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/LocaleSelect.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/LocaleSelect.tsx
@@ -23,6 +23,7 @@ const LocaleSelect = ({ locale, setLocale }: Props) => {
   return (
     <Box bgColor={colors.background} p="4px 8px 4px 8px" borderRadius="3px">
       <StyledSelect
+        id="e2e-locale-select"
         value={locale}
         onChange={(e) => {
           setLocale(e.target.value as Locale);
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index e457ebbf9170..8ad897304923 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -211,9 +211,11 @@ const ContentBuilderTopBar = ({
         <Box>
           <LocaleSelect locale={selectedLocale} setLocale={setSelectedLocale} />
         </Box>
-        <Box ml="32px">
-          {!!phaseId && <ViewPicker view={view} setView={setView} />}
-        </Box>
+        {!!phaseId && (
+          <Box ml="32px">
+            <ViewPicker view={view} setView={setView} />
+          </Box>
+        )}
         <Box ml="32px">
           <Button
             icon="print"
diff --git a/front/cypress/e2e/report_builder/global_report.cy.ts b/front/cypress/e2e/report_builder/global_report.cy.ts
index 9bd908c65aec..aaa387bcf424 100644
--- a/front/cypress/e2e/report_builder/global_report.cy.ts
+++ b/front/cypress/e2e/report_builder/global_report.cy.ts
@@ -32,13 +32,13 @@ describe('Global report', () => {
     cy.get('.e2e-text-box').should('contain.text', 'Edited');
 
     // Switch locale
-    cy.get('#e2e-report-builder-topbar .e2e-localeswitcher.nl-BE').click();
+    cy.get('#e2e-locale-select').select('nl-BE');
 
     // Validate that text for other locale is present
     cy.get('.e2e-text-box').should('contain.text', 'Tekst');
 
     // Switch back
-    cy.get('#e2e-report-builder-topbar .e2e-localeswitcher.en').click();
+    cy.get('#e2e-locale-select').select('en');
 
     // Previous edited text should still be there
     cy.get('.e2e-text-box').should('contain.text', 'Edited');
diff --git a/front/cypress/e2e/report_builder/idea_template.cy.ts b/front/cypress/e2e/report_builder/idea_template.cy.ts
index 366f49ffb4d7..70f4ecd05382 100644
--- a/front/cypress/e2e/report_builder/idea_template.cy.ts
+++ b/front/cypress/e2e/report_builder/idea_template.cy.ts
@@ -133,7 +133,7 @@ describe('Idea template', () => {
         cy.wait(1000);
 
         // Switch locale
-        cy.get('#e2e-report-builder-topbar .e2e-localeswitcher.nl-BE').click();
+        cy.get('#e2e-locale-select').select('nl-BE');
 
         // Validate that text for other locale is present
         cy.get('.e2e-text-box')
@@ -141,7 +141,7 @@ describe('Idea template', () => {
           .should('contain.text', 'Samenvatting van het verslag');
 
         // Switch back
-        cy.get('#e2e-report-builder-topbar .e2e-localeswitcher.en').click();
+        cy.get('#e2e-locale-select').select('en');
 
         // Previous edited text should still be there
         cy.get('.e2e-text-box').eq(2).should('contain.text', text);

From 7ff4a045641a5a230e0f2dbe50c431f0aecb250f Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Wed, 6 Mar 2024 11:52:40 +0000
Subject: [PATCH 120/282] Increment component library version

---
 cl2-component-library/package-lock.json | 4 ++--
 cl2-component-library/package.json      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/cl2-component-library/package-lock.json b/cl2-component-library/package-lock.json
index aedd7b625499..ee7c855f5d34 100644
--- a/cl2-component-library/package-lock.json
+++ b/cl2-component-library/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "@citizenlab/cl2-component-library",
-  "version": "0.11.33",
+  "version": "0.11.34",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "@citizenlab/cl2-component-library",
-      "version": "0.11.33",
+      "version": "0.11.34",
       "license": "MIT",
       "dependencies": {
         "@tippyjs/react": "4.2.6",
diff --git a/cl2-component-library/package.json b/cl2-component-library/package.json
index 67c2eb5717a0..eb940c45797f 100644
--- a/cl2-component-library/package.json
+++ b/cl2-component-library/package.json
@@ -1,5 +1,5 @@
 {
-  "version": "0.11.33",
+  "version": "0.11.34",
   "license": "MIT",
   "main": "dist/index.js",
   "typings": "dist/index.d.ts",

From 8f220529b5f6882cd8ba8ebf9be25c8f4aed6679 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Wed, 6 Mar 2024 11:56:54 +0000
Subject: [PATCH 121/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/en.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 9f280ada3653..2f9f75c3b80a 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -1507,6 +1507,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Edit survey content",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Submissions to this survey have started to come in. Changes to the survey may result in data loss and incomplete data in the exported files.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "File upload",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Go back",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Responses to short and long answer questions are currently only available in the survey download",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Linear scale",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Long answer",

From ea02f51ca2bee3cb093f33eed238b2f4dfcd4ae9 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 6 Mar 2024 13:03:28 +0100
Subject: [PATCH 122/282] Small fix

---
 front/app/components/EsriMap/index.tsx | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/front/app/components/EsriMap/index.tsx b/front/app/components/EsriMap/index.tsx
index 0ba0d6a4ebee..c0eead092102 100644
--- a/front/app/components/EsriMap/index.tsx
+++ b/front/app/components/EsriMap/index.tsx
@@ -166,13 +166,12 @@ const EsriMap = ({
     // Add any map layers which were passed in
     if (!layers || !mapView) return;
 
-    const isRegularMap = map instanceof Map;
     const isWebMap = map instanceof WebMap;
+    const isRegularMap = map instanceof Map && !isWebMap;
 
     // If we're not using a Web Map, add the layers to the default Map object
     if (isRegularMap) {
       map.removeAll();
-
       layers.forEach((layer) => {
         map.add(layer);
       });
@@ -186,8 +185,16 @@ const EsriMap = ({
           handleWebMapReferenceLayers(map, referenceLayers);
         }
 
+        // Remove any internal layers that were passed in as props to the Web Map
+        map.layers?.forEach((layer) => {
+          if (layer.id?.includes('_internal')) {
+            map.remove(layer);
+          }
+        });
+
         // Now, add any additional layers that passed in as props to the Web Map
         layers.forEach((layer) => {
+          layer.id = `${layer.id}_internal`;
           map.add(layer);
         });
 

From b9e61bbae6a419293e2810a8c6af9ca23285f774 Mon Sep 17 00:00:00 2001
From: brentguf <brentguf@users.noreply.github.com>
Date: Wed, 6 Mar 2024 13:31:36 +0100
Subject: [PATCH 123/282] Build error

---
 .../project/general/components/ProjectFolderSelect/index.tsx    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/index.tsx b/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/index.tsx
index c6cfc30a105e..78b0695fae8f 100644
--- a/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/index.tsx
+++ b/front/app/containers/Admin/projects/project/general/components/ProjectFolderSelect/index.tsx
@@ -19,7 +19,7 @@ import { TOnProjectAttributesDiffChangeFunction } from 'containers/Admin/project
 
 import { SectionField, SubSectionTitle } from 'components/admin/Section';
 
-import { FormattedMessage } from 'utils/cl-intl';
+import { FormattedMessage, useIntl } from 'utils/cl-intl';
 import { isNilOrError, isNil } from 'utils/helperUtils';
 import { usePermission } from 'utils/permissions';
 import { userModeratesFolder } from 'utils/permissions/rules/projectFolderPermissions';

From 7c816e07a8a08669eba09377bf735a6ff15995c7 Mon Sep 17 00:00:00 2001
From: brentguf <brentguf@users.noreply.github.com>
Date: Wed, 6 Mar 2024 13:35:31 +0100
Subject: [PATCH 124/282] Remove unnecessary margin

---
 .../components/PostPreview/Initiative/AdminInitiativeContent.tsx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/components/admin/PostManager/components/PostPreview/Initiative/AdminInitiativeContent.tsx b/front/app/components/admin/PostManager/components/PostPreview/Initiative/AdminInitiativeContent.tsx
index 271790b83c24..bcd7f441dece 100644
--- a/front/app/components/admin/PostManager/components/PostPreview/Initiative/AdminInitiativeContent.tsx
+++ b/front/app/components/admin/PostManager/components/PostPreview/Initiative/AdminInitiativeContent.tsx
@@ -36,7 +36,6 @@ import FeedbackSettings from './FeedbackSettings';
 
 const StyledTitle = styled(Title)`
   margin-bottom: 30px;
-  margin-right: 8px;
 `;
 
 const Row = styled.div`

From 7173ccb71402bc514a0a3160938ffa3319db5614 Mon Sep 17 00:00:00 2001
From: brentguf <brentguf@users.noreply.github.com>
Date: Wed, 6 Mar 2024 13:39:34 +0100
Subject: [PATCH 125/282] Undo isProjectModerator changes

---
 front/app/utils/permissions/roles.ts                  | 2 +-
 front/app/utils/permissions/rules/routePermissions.ts | 4 +---
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/front/app/utils/permissions/roles.ts b/front/app/utils/permissions/roles.ts
index a5f413c9fcd7..ef11719b4507 100644
--- a/front/app/utils/permissions/roles.ts
+++ b/front/app/utils/permissions/roles.ts
@@ -71,7 +71,7 @@ export const isRegularUser = (user?: IUser | null) => {
   return false;
 };
 
-export const isProjectModerator = (user: IUser, projectId?: string) => {
+export const isProjectModerator = (user?: IUser | null, projectId?: string) => {
   return (
     isModerator(user) &&
     (!projectId ||
diff --git a/front/app/utils/permissions/rules/routePermissions.ts b/front/app/utils/permissions/rules/routePermissions.ts
index f01347e4d11f..57a9245ef11a 100644
--- a/front/app/utils/permissions/rules/routePermissions.ts
+++ b/front/app/utils/permissions/rules/routePermissions.ts
@@ -51,9 +51,7 @@ const isModeratedProjectRoute = (item: IRouteItem, user: IUser | null) => {
   const idRegexp = /^\/admin\/projects\/([a-z0-9-]+)\/?/;
   const matches = idRegexp.exec(item.path);
   const pathProjectId = matches && matches[1];
-  return typeof pathProjectId === 'string' && user !== null
-    ? isProjectModerator(user, pathProjectId)
-    : false;
+  return (pathProjectId && isProjectModerator(user, pathProjectId)) || false;
 };
 
 const tenantIsChurned = (tenant: IAppConfigurationData) => {

From cc442cd5d6154abea45ada7f18e1989f572563c3 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 6 Mar 2024 14:11:38 +0100
Subject: [PATCH 126/282] Small tweak

---
 front/app/components/IdeasMap/index.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/components/IdeasMap/index.tsx b/front/app/components/IdeasMap/index.tsx
index 4fba50b9cdf9..959d3fc42bea 100644
--- a/front/app/components/IdeasMap/index.tsx
+++ b/front/app/components/IdeasMap/index.tsx
@@ -496,7 +496,7 @@ const IdeasMap = memo<Props>(
                 zoomWidgetLocation: 'right',
                 onInit: onMapInit,
               }}
-              webMapId={mapConfig?.data.attributes.esri_web_map_id}
+              webMapId={mapConfig?.data?.attributes?.esri_web_map_id}
               height={isMobileOrSmaller ? '68vh' : '80vh'}
               layers={layers}
               onHover={onMapHover}

From ea0051c715043f53852b332637800b9c9f1df4b1 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Wed, 6 Mar 2024 14:13:42 +0100
Subject: [PATCH 127/282] New translations en.json (Dutch)

---
 front/app/translations/admin/nl-NL.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index 898ea432bab5..9540c68f6983 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -2165,7 +2165,7 @@
   "app.containers.ContentBuilder.homepage.bannerSubtext": "Banner ondertitel",
   "app.containers.ContentBuilder.homepage.bannerText": "Bannertitel",
   "app.containers.ContentBuilder.homepage.button": "Knop",
-  "app.containers.ContentBuilder.homepage.chooseLayout": "Indeling",
+  "app.containers.ContentBuilder.homepage.chooseLayout": "Opmaak",
   "app.containers.ContentBuilder.homepage.customized_button": "Aangepast",
   "app.containers.ContentBuilder.homepage.customized_button_text_label": "Tekst op de knop",
   "app.containers.ContentBuilder.homepage.customized_button_url_label": "Link voor de knop",
@@ -2239,7 +2239,7 @@
   "app.containers.admin.ContentBuilder.imageMultilocAltTooltip": "Het toevoegen van \"alt-tekst\" voor afbeeldingen is belangrijk om jullie platform toegankelijk te maken voor gebruikers die schermlezers gebruiken.",
   "app.containers.admin.ContentBuilder.imageTextCards": "Afbeelding- & tekstkaarten",
   "app.containers.admin.ContentBuilder.infoWithAccordions": "Info & accordions",
-  "app.containers.admin.ContentBuilder.layout": "INDELING",
+  "app.containers.admin.ContentBuilder.layout": "OPMAAK",
   "app.containers.admin.ContentBuilder.noSettings": "Er zijn geen instellingen voor deze widget.",
   "app.containers.admin.ContentBuilder.oneColumnLayout": "1 kolom",
   "app.containers.admin.ContentBuilder.projectDescription": "Projectbeschrijving",

From 6112beac7b8dff0fb5761b09a81d6afe6bcfbe07 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 6 Mar 2024 14:41:28 +0100
Subject: [PATCH 128/282] Fix ideaID memo issue

---
 front/app/components/IdeasMap/index.tsx | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/front/app/components/IdeasMap/index.tsx b/front/app/components/IdeasMap/index.tsx
index 959d3fc42bea..36c8a3678bf2 100644
--- a/front/app/components/IdeasMap/index.tsx
+++ b/front/app/components/IdeasMap/index.tsx
@@ -223,6 +223,7 @@ const IdeasMap = memo<Props>(
           source: graphics, // Array of idea graphics
           title: formatMessage(messages.userInputs),
           id: 'ideasLayer',
+          outFields: ['*'],
           objectIdField: 'ID',
           fields: [
             {
@@ -319,10 +320,7 @@ const IdeasMap = memo<Props>(
                 );
               } else if (graphicId) {
                 // User clicked an idea pin or layer.
-                const ideaId =
-                  topElement.layer.id === 'ideasLayer'
-                    ? graphics?.at(graphicId - 1)?.attributes.ideaId
-                    : undefined;
+                const ideaId = topElement?.graphic?.attributes?.ideaId;
 
                 const ideasAtClickCount = elements.filter(
                   (element) =>
@@ -339,10 +337,8 @@ const IdeasMap = memo<Props>(
                     const ideaIds = elements.map((element) => {
                       // Get list of idea ids at this location
                       if (element.type === 'graphic') {
-                        const graphicId = element?.graphic?.attributes?.ID;
                         const layerId = element?.graphic?.layer?.id;
-                        const ideaId = graphics?.at(graphicId - 1)?.attributes
-                          .ideaId;
+                        const ideaId = element?.graphic?.attributes?.ideaId;
                         if (ideaId && layerId === 'ideasLayer') {
                           return ideaId;
                         }

From 172b1445b4fbe9063e8b9aaf310f628f6b482c8a Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 6 Mar 2024 14:49:52 +0100
Subject: [PATCH 129/282] Style tweak

---
 front/app/components/IdeasMap/IdeasAtLocationPopup.tsx | 1 +
 1 file changed, 1 insertion(+)

diff --git a/front/app/components/IdeasMap/IdeasAtLocationPopup.tsx b/front/app/components/IdeasMap/IdeasAtLocationPopup.tsx
index 3db72d7b6c47..db75c036091e 100644
--- a/front/app/components/IdeasMap/IdeasAtLocationPopup.tsx
+++ b/front/app/components/IdeasMap/IdeasAtLocationPopup.tsx
@@ -32,6 +32,7 @@ const IdeasAtLocationPopup = ({
     <Box maxHeight="100px">
       {ideas?.map((idea) => (
         <Button
+          fontSize="s"
           key={idea.id}
           width="fit-content"
           mb="12px"

From d2b5d34cd33d3dad1c4a6c844ab6b5d898a0f471 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 6 Mar 2024 14:54:03 +0100
Subject: [PATCH 130/282] Revert new message for now

---
 .../app/containers/Admin/ProjectCustomMapConfigPage/messages.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
index a4a916e4bea4..132d9dd84ed5 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/messages.ts
@@ -62,7 +62,7 @@ export default defineMessages({
       'https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view',
   },
   layersTooltip: {
-    id: 'app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip2',
+    id: 'app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip',
     defaultMessage:
       'We currently support GeoJSON files and importing Feature Layers and Web Maps from ArcGIS Online. Read the {supportArticle} for tips on how to add, convert and style map layers.',
   },

From f53f7b3ca690c4d2f56bc7d258616e96f31b8642 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Wed, 6 Mar 2024 13:57:12 +0000
Subject: [PATCH 131/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/en.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 11aed56e6464..a3a9d9e1bd62 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -1257,7 +1257,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "This text is displayed as a tooltip when hovering over the layer features on the map",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Map layers",
-  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip2": "We currently support GeoJSON files and importing Feature Layers and Web Maps from ArcGIS Online. Read the {supportArticle} for tips on how to add, convert and style map layers.",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We currently support GeoJSON files and importing Feature Layers and Web Maps from ArcGIS Online. Read the {supportArticle} for tips on how to add, convert and style map layers.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Map default center and zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "The default center point and zoom level of the map. Manually adjust the values below, or click on the {button} button in the top right corner of the map to save the current center point and zoom level of the map as the default values.",

From c196588dae04fe7c0187436e3fda563377af2aec Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Wed, 6 Mar 2024 14:59:00 +0100
Subject: [PATCH 132/282] [TAN-1241] Manage current and saved state to reliably
 know if report is saved

---
 .../components/ReportBuilder/Editor/index.tsx |  9 ++--
 .../components/ReportBuilder/TopBar/index.tsx |  6 +--
 .../containers/ReportBuilder/index.tsx        | 49 ++++++++++++++++---
 3 files changed, 50 insertions(+), 14 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/index.tsx
index 70b466cc7ce0..296ea289fb0a 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/index.tsx
@@ -4,8 +4,9 @@ import React from 'react';
 import { Box } from '@citizenlab/cl2-component-library';
 
 // craft
-import { Editor as CraftEditor } from '@craftjs/core';
+import { Editor as CraftEditor, QueryMethods } from '@craftjs/core';
 import RenderNode from './RenderNode';
+import { QueryCallbacksFor } from '@craftjs/utils';
 
 // widgets
 import Container from 'components/admin/ContentBuilder/Widgets/Container';
@@ -18,7 +19,7 @@ import PhaseTemplate from '../Templates/PhaseTemplate';
 type EditorProps = {
   children: React.ReactNode;
   isPreview: boolean;
-  onNodesChange?: () => void;
+  onNodesChange?: (query: QueryCallbacksFor<typeof QueryMethods>) => void;
 };
 
 const resolver = {
@@ -50,8 +51,8 @@ const Editor: React.FC<EditorProps> = ({
       }}
       onRender={isPreview ? PlainDiv : RenderNode}
       enabled={isPreview ? false : true}
-      onNodesChange={() => {
-        onNodesChange?.();
+      onNodesChange={(query) => {
+        onNodesChange?.(query);
       }}
     >
       {children}
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index 0f1af16461c1..af7388cba4b3 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -38,7 +38,7 @@ type ContentBuilderTopBarProps = {
   reportId: string;
   isTemplate: boolean;
   saved: boolean;
-  setSaved: React.Dispatch<React.SetStateAction<boolean>>;
+  setSaved: () => void;
   setSelectedLocale: React.Dispatch<React.SetStateAction<Locale>>;
 };
 
@@ -96,7 +96,7 @@ const ContentBuilderTopBar = ({
       },
       {
         onSuccess: () => {
-          setSaved(true);
+          setSaved();
 
           removeSearchParams(['templateProjectId', 'templatePhaseId']);
         },
@@ -145,7 +145,7 @@ const ContentBuilderTopBar = ({
           },
           {
             onSuccess: () => {
-              setSaved(true);
+              setSaved();
 
               removeSearchParams(['templateProjectId', 'templatePhaseId']);
             },
diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index f8860cab1683..5bd57888fa44 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -33,7 +33,7 @@ import PhaseTemplate from '../../components/ReportBuilder/Templates/PhaseTemplat
 import { ContentBuilderErrors } from 'components/admin/ContentBuilder/typings';
 import { Locale } from 'typings';
 import { ReportLayout } from 'api/report_layout/types';
-import { isEmpty } from 'lodash-es';
+import { isEmpty, isEqual } from 'lodash-es';
 import { ReportResponse } from 'api/reports/types';
 import { View } from '../../components/ReportBuilder/ViewContainer/typings';
 
@@ -42,6 +42,23 @@ interface Props {
   reportLayout: ReportLayout;
 }
 
+const areEqual = (
+  prevData: Record<string, object>,
+  nextData: Record<string, object>
+) => {
+  // when we save the data, `undefined` field values are not saved
+  // (e.g., `parent` in { ROOT: { parent: undefined, ...}, ...}).
+  // So, they are never present in reportLayout.attributes.craftjs_json,
+  // but they are present in the editor state `query.getSerializedNodes()`.
+  // JSON.stringify emulates sending the data to the server and getting it back
+  // (it removes undefined values).
+  // JSON.parse makes sure that the comparison is not affected by the order of keys.
+  return isEqual(
+    JSON.parse(JSON.stringify(prevData)),
+    JSON.parse(JSON.stringify(nextData))
+  );
+};
+
 const ReportBuilder = ({ report, reportLayout }: Props) => {
   const reportId = report.data.id;
   const phaseId = report.data.relationships.phase?.data?.id;
@@ -61,6 +78,12 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
 
     return craftjs_json;
   });
+  const [currentData, setCurrentData] = useState<
+    Record<string, object> | undefined
+  >(initialData);
+  const [savedData, setSavedData] = useState<
+    Record<string, object> | undefined
+  >(initialData);
 
   const emptyReportOnInit = initialData === undefined;
 
@@ -68,7 +91,6 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
   const [selectedLocale, setSelectedLocale] = useState<Locale>(platformLocale);
 
   const [saved, setSaved] = useState(true);
-  const [initialDataLoadedCounter, setInitialDataLoadedCounter] = useState(0);
   const [contentBuilderErrors, setContentBuilderErrors] =
     useState<ContentBuilderErrors>({});
 
@@ -90,6 +112,11 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
     Object.values(contentBuilderErrors).filter((node) => node.hasError).length >
     0;
 
+  const handleSetSaved = () => {
+    setSaved(true);
+    setSavedData(currentData);
+  };
+
   return (
     <ReportContextProvider width="pdf" reportId={reportId} phaseId={phaseId}>
       <FullscreenContentBuilder
@@ -99,12 +126,20 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
       >
         <Editor
           isPreview={false}
-          onNodesChange={() => {
-            // onNodesChange is called twice on initial load
-            if (initialDataLoadedCounter >= 2) {
+          onNodesChange={(query) => {
+            // onNodesChange is called twice on initial load.
+            if (savedData) {
+              // This comparison is still not perfect.
+              // E.g., if you add a node with rich text editor, save the report,
+              // and then modify the default text and revert the change,
+              // areEqual may still return false, because the default text may not have
+              // a wrapping <p> tag, which is added as soon as you start typing.
+              // But it's good enough for now.
+              setSaved(areEqual(query.getSerializedNodes(), savedData));
+            } else {
               setSaved(false);
             }
-            setInitialDataLoadedCounter((counter) => counter + 1);
+            setCurrentData(query.getSerializedNodes());
           }}
         >
           <TopBar
@@ -114,7 +149,7 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
             reportId={reportId}
             isTemplate={!!templateProjectId || !!templatePhaseId}
             saved={saved}
-            setSaved={setSaved}
+            setSaved={handleSetSaved}
             setSelectedLocale={setSelectedLocale}
           />
           <Box mt={`${stylingConsts.menuHeight}px`}>

From 682ccaac55107e2f686d02bf0c3fa195d7a783fb Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Wed, 6 Mar 2024 15:06:08 +0100
Subject: [PATCH 133/282] Small tweak

---
 front/app/components/EsriMap/config.ts  | 2 +-
 front/app/components/IdeasMap/index.tsx | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/front/app/components/EsriMap/config.ts b/front/app/components/EsriMap/config.ts
index 150493ab67d0..09005d6e4225 100644
--- a/front/app/components/EsriMap/config.ts
+++ b/front/app/components/EsriMap/config.ts
@@ -106,6 +106,6 @@ export const showLayerVisibilityControls = (mapView: MapView) => {
     mode: 'floating',
   });
   mapView.ui.add(layerList, {
-    position: 'bottom-right',
+    position: 'top-right',
   });
 };
diff --git a/front/app/components/IdeasMap/index.tsx b/front/app/components/IdeasMap/index.tsx
index 36c8a3678bf2..70c68f43a3e8 100644
--- a/front/app/components/IdeasMap/index.tsx
+++ b/front/app/components/IdeasMap/index.tsx
@@ -408,7 +408,6 @@ const IdeasMap = memo<Props>(
         });
       },
       [
-        graphics,
         setSelectedIdea,
         theme.colors.tenantSecondary,
         authUser,

From 83bbaa8c9d8172c86cdcf31f3d45a4e56e8b57dd Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Wed, 6 Mar 2024 16:40:48 +0100
Subject: [PATCH 134/282] [TAN-1241] Treat craftJS data as empty if it does not
 have nodes

---
 .../containers/ReportBuilder/index.tsx          | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index 5bd57888fa44..5c4b773a1d7b 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -36,6 +36,7 @@ import { ReportLayout } from 'api/report_layout/types';
 import { isEmpty, isEqual } from 'lodash-es';
 import { ReportResponse } from 'api/reports/types';
 import { View } from '../../components/ReportBuilder/ViewContainer/typings';
+import { SerializedNodes } from '@craftjs/core';
 
 interface Props {
   report: ReportResponse;
@@ -43,8 +44,8 @@ interface Props {
 }
 
 const areEqual = (
-  prevData: Record<string, object>,
-  nextData: Record<string, object>
+  craftjsCurrentData: SerializedNodes,
+  persistedData: Record<string, any>
 ) => {
   // when we save the data, `undefined` field values are not saved
   // (e.g., `parent` in { ROOT: { parent: undefined, ...}, ...}).
@@ -53,9 +54,17 @@ const areEqual = (
   // JSON.stringify emulates sending the data to the server and getting it back
   // (it removes undefined values).
   // JSON.parse makes sure that the comparison is not affected by the order of keys.
+  if (
+    isEmpty(persistedData) &&
+    (isEmpty(craftjsCurrentData) ||
+      craftjsCurrentData['ROOT']?.nodes.length === 0)
+  ) {
+    return true;
+  }
+
   return isEqual(
-    JSON.parse(JSON.stringify(prevData)),
-    JSON.parse(JSON.stringify(nextData))
+    JSON.parse(JSON.stringify(craftjsCurrentData)),
+    JSON.parse(JSON.stringify(persistedData))
   );
 };
 

From d7a9a8501b9f155f752f6beef378516905a61e59 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Wed, 6 Mar 2024 16:41:03 +0100
Subject: [PATCH 135/282] [TAN-1241] Get rid of unnecessary state

---
 .../containers/ReportBuilder/index.tsx        | 33 ++++++++-----------
 1 file changed, 13 insertions(+), 20 deletions(-)

diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index 5c4b773a1d7b..e5d2c352819f 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -87,12 +87,6 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
 
     return craftjs_json;
   });
-  const [currentData, setCurrentData] = useState<
-    Record<string, object> | undefined
-  >(initialData);
-  const [savedData, setSavedData] = useState<
-    Record<string, object> | undefined
-  >(initialData);
 
   const emptyReportOnInit = initialData === undefined;
 
@@ -123,7 +117,6 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
 
   const handleSetSaved = () => {
     setSaved(true);
-    setSavedData(currentData);
   };
 
   return (
@@ -135,20 +128,20 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
       >
         <Editor
           isPreview={false}
+          // onNodesChange is called twice on initial load.
           onNodesChange={(query) => {
-            // onNodesChange is called twice on initial load.
-            if (savedData) {
-              // This comparison is still not perfect.
-              // E.g., if you add a node with rich text editor, save the report,
-              // and then modify the default text and revert the change,
-              // areEqual may still return false, because the default text may not have
-              // a wrapping <p> tag, which is added as soon as you start typing.
-              // But it's good enough for now.
-              setSaved(areEqual(query.getSerializedNodes(), savedData));
-            } else {
-              setSaved(false);
-            }
-            setCurrentData(query.getSerializedNodes());
+            // This comparison is still not perfect.
+            // E.g., if you add a node with rich text editor, save the report,
+            // and then modify the default text and revert the change,
+            // areEqual may still return false, because the default text may not have
+            // a wrapping <p> tag, which is added as soon as you start typing.
+            // But it's good enough for now.
+            setSaved(
+              areEqual(
+                query.getSerializedNodes(),
+                reportLayout.attributes.craftjs_json
+              )
+            );
           }}
         >
           <TopBar

From 856674cbced4fd0f1c66d817d89e942cf815ced4 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Wed, 6 Mar 2024 15:51:29 +0000
Subject: [PATCH 136/282] Add banner to report tab

---
 .../project/information/ReportTab/index.tsx   | 37 +++++++++++++++++--
 .../project/information/ReportTab/messages.ts | 20 ++++++++++
 .../timeline/PhaseReport/index.tsx            |  2 +-
 3 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/front/app/containers/Admin/projects/project/information/ReportTab/index.tsx b/front/app/containers/Admin/projects/project/information/ReportTab/index.tsx
index 9661d08bc612..eda53cb5b2b7 100644
--- a/front/app/containers/Admin/projects/project/information/ReportTab/index.tsx
+++ b/front/app/containers/Admin/projects/project/information/ReportTab/index.tsx
@@ -12,11 +12,15 @@ import useFeatureFlag from 'hooks/useFeatureFlag';
 
 import Buttons from 'containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons';
 
+import Warning from 'components/UI/Warning';
+
 import { useIntl } from 'utils/cl-intl';
+import { pastPresentOrFuture } from 'utils/dateUtils';
 
 import EmptyState from './EmptyState';
 import messages from './messages';
 import ReportPreview from './ReportPreview';
+import { MAX_REPORT_WIDTH } from 'containers/Admin/reporting/constants';
 
 const ReportTab = () => {
   const { phaseId } = useParams();
@@ -43,6 +47,28 @@ const ReportTab = () => {
   const reportId = phase.data.relationships.report?.data?.id;
   const hasReport = !!reportId;
 
+  const getWarningMessage = () => {
+    if (!report) return '';
+
+    const reportVisible = report.data.attributes.visible;
+    const phaseStarted =
+      pastPresentOrFuture(phase.data.attributes.start_at) !== 'future';
+
+    if (!reportVisible && !phaseStarted) {
+      return formatMessage(messages.notVisibleNotStarted);
+    }
+
+    if (reportVisible && !phaseStarted) {
+      return formatMessage(messages.visibleNotStarted);
+    }
+
+    if (!reportVisible && phaseStarted) {
+      return formatMessage(messages.notVisibleStarted);
+    }
+
+    return formatMessage(messages.visibleStarted);
+  };
+
   return (
     <Box w="100%">
       <Box
@@ -77,9 +103,14 @@ const ReportTab = () => {
         )}
       </Box>
       {hasReport ? (
-        <Box mt="32px">
-          <ReportPreview reportId={reportId} phaseId={phase.data.id} />
-        </Box>
+        <>
+          <Box maxWidth={MAX_REPORT_WIDTH}>
+            <Warning>{getWarningMessage()}</Warning>
+          </Box>
+          <Box mt="32px">
+            <ReportPreview reportId={reportId} phaseId={phase.data.id} />
+          </Box>
+        </>
       ) : (
         <EmptyState
           projectId={phase.data.relationships.project.data.id}
diff --git a/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts b/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts
index 84b4c3fa2ee4..6e300ec9e762 100644
--- a/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts
+++ b/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts
@@ -43,4 +43,24 @@ export default defineMessages({
     id: 'app.containers.Admin.projects.project.information.ReportTab.reportVisible',
     defaultMessage: 'Report visible to public',
   },
+  notVisibleNotStarted: {
+    id: 'app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted',
+    defaultMessage:
+      'This report is not visible to the public. To make it publicly visible once the phase starts, enable the "Report visible to public" toggle.',
+  },
+  visibleNotStarted: {
+    id: 'app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted',
+    defaultMessage:
+      'This report will be publicly available as soon as the phase starts. To make it not publicly visible, disable the "Report visible to public" toggle.',
+  },
+  notVisibleStarted: {
+    id: 'app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted',
+    defaultMessage:
+      'This phase has started, but the report is not visible yet to the public. To make it publicly visible, enable the "Report visible to public" toggle.',
+  },
+  visibleStarted: {
+    id: 'app.containers.Admin.projects.project.information.ReportTab.visibleStarted',
+    defaultMessage:
+      'This report is currently publicly visible. To make it not publicly visible, disable the "Report visible to public" toggle.',
+  },
 });
diff --git a/front/app/containers/ProjectsShowPage/timeline/PhaseReport/index.tsx b/front/app/containers/ProjectsShowPage/timeline/PhaseReport/index.tsx
index 3452a422699a..78073b1c8a51 100644
--- a/front/app/containers/ProjectsShowPage/timeline/PhaseReport/index.tsx
+++ b/front/app/containers/ProjectsShowPage/timeline/PhaseReport/index.tsx
@@ -57,7 +57,7 @@ const PhaseReport = ({ reportId, phaseId }: Props) => {
           <Box
             w="100%"
             display="flex"
-            alignItems="center"
+            alignItems="flex-start"
             flexDirection="column"
           >
             <Box maxWidth={MAX_REPORT_WIDTH} w="100%">

From 075164f06d79ccdf1e9ae047a7cca24fa26ba57a Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Wed, 6 Mar 2024 17:36:22 +0100
Subject: [PATCH 137/282] [TAN-1241] Replace JSON.stringify implementation with
 a loop

---
 .../containers/ReportBuilder/index.tsx        | 43 +++++++++++++------
 1 file changed, 29 insertions(+), 14 deletions(-)

diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index e5d2c352819f..348aa6710739 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -33,7 +33,7 @@ import PhaseTemplate from '../../components/ReportBuilder/Templates/PhaseTemplat
 import { ContentBuilderErrors } from 'components/admin/ContentBuilder/typings';
 import { Locale } from 'typings';
 import { ReportLayout } from 'api/report_layout/types';
-import { isEmpty, isEqual } from 'lodash-es';
+import { isEmpty, isEqual, isUndefined, omitBy } from 'lodash-es';
 import { ReportResponse } from 'api/reports/types';
 import { View } from '../../components/ReportBuilder/ViewContainer/typings';
 import { SerializedNodes } from '@craftjs/core';
@@ -45,27 +45,42 @@ interface Props {
 
 const areEqual = (
   craftjsCurrentData: SerializedNodes,
-  persistedData: Record<string, any>
+  persistedData: SerializedNodes
 ) => {
-  // when we save the data, `undefined` field values are not saved
-  // (e.g., `parent` in { ROOT: { parent: undefined, ...}, ...}).
-  // So, they are never present in reportLayout.attributes.craftjs_json,
-  // but they are present in the editor state `query.getSerializedNodes()`.
-  // JSON.stringify emulates sending the data to the server and getting it back
-  // (it removes undefined values).
-  // JSON.parse makes sure that the comparison is not affected by the order of keys.
   if (
     isEmpty(persistedData) &&
     (isEmpty(craftjsCurrentData) ||
-      craftjsCurrentData['ROOT']?.nodes.length === 0)
+      craftjsCurrentData['ROOT'].nodes.length === 0)
   ) {
     return true;
   }
 
-  return isEqual(
-    JSON.parse(JSON.stringify(craftjsCurrentData)),
-    JSON.parse(JSON.stringify(persistedData))
-  );
+  // When the layout is saved, `undefined` fields are not saved
+  // (e.g., `parent` in { ROOT: { parent: undefined, ...}, ...} will be omitted).
+  // So, they are never present in reportLayout.attributes.craftjs_json,
+  // but they are present in the editor state `query.getSerializedNodes()`.
+  //
+  // The "for" loop does the same thing as this alternative version with JSON.stringify,
+  // but it's more performant.
+  //
+  // JSON.stringify emulates sending the data to the server and getting it back
+  // (it removes undefined values).
+  // JSON.parse makes sure that the comparison is not affected by the order of keys.
+  // return isEqual(
+  //   JSON.parse(JSON.stringify(craftjsCurrentData)),
+  //   JSON.parse(JSON.stringify(persistedData))
+  // );
+  for (const key in craftjsCurrentData) {
+    if (
+      !isEqual(
+        omitBy(craftjsCurrentData[key], isUndefined),
+        omitBy(persistedData[key], isUndefined)
+      )
+    ) {
+      return false;
+    }
+  }
+  return true;
 };
 
 const ReportBuilder = ({ report, reportLayout }: Props) => {

From 40e637aa3b718e2f6f36df8debc0eae7e019a121 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Wed, 6 Mar 2024 17:55:27 +0100
Subject: [PATCH 138/282] [TAN-1241] Autocorrect imports

---
 .../Admin/reporting/components/ReportBuilder/Editor/index.tsx | 2 +-
 .../ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx | 4 ++--
 .../Admin/reporting/containers/ReportBuilder/index.tsx        | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/index.tsx
index 582fb992f33d..a8ad2b5e224a 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/index.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
 import { Box } from '@citizenlab/cl2-component-library';
-import { QueryCallbacksFor } from '@craftjs/utils';
 import { Editor as CraftEditor, QueryMethods } from '@craftjs/core';
+import { QueryCallbacksFor } from '@craftjs/utils';
 
 import Container from 'components/admin/ContentBuilder/Widgets/Container';
 
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx b/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
index a1c4c5de7e19..91399fe46631 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons/PrintReportButton.tsx
@@ -4,12 +4,12 @@ import {
   TooltipContentWrapper,
   colors,
 } from '@citizenlab/cl2-component-library';
-import { CONTENT_BUILDER_Z_INDEX } from 'components/admin/ContentBuilder/constants';
+import Tippy from '@tippyjs/react';
 
 import useReport from 'api/reports/useReport';
 
+import { CONTENT_BUILDER_Z_INDEX } from 'components/admin/ContentBuilder/constants';
 import Button from 'components/UI/Button';
-import Tippy from '@tippyjs/react';
 
 import { FormattedMessage } from 'utils/cl-intl';
 
diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index c66f21908b07..6cc32c3b3bcc 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -1,6 +1,7 @@
 import React, { useState } from 'react';
 
 import { Box, stylingConsts } from '@citizenlab/cl2-component-library';
+import { SerializedNodes } from '@craftjs/core';
 import { isEmpty, isEqual, isUndefined, omitBy } from 'lodash-es';
 import { useLocation, useParams, useSearchParams } from 'react-router-dom';
 import { Locale } from 'typings';
@@ -18,7 +19,6 @@ import { StyledRightColumn } from 'components/admin/ContentBuilder/Frame/FrameWr
 import FullscreenContentBuilder from 'components/admin/ContentBuilder/FullscreenContentBuilder';
 import LanguageProvider from 'components/admin/ContentBuilder/LanguageProvider';
 import { ContentBuilderErrors } from 'components/admin/ContentBuilder/typings';
-import { SerializedNodes } from '@craftjs/core';
 
 import Editor from '../../components/ReportBuilder/Editor';
 import Settings from '../../components/ReportBuilder/Settings';

From df7ba156db51ae423208fda9e3f1173070106792 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Wed, 6 Mar 2024 17:58:07 +0100
Subject: [PATCH 139/282] [TAN-1241] Include craftjs/utils to package.json to
 fix dependency-cruiser error

---
 front/package-lock.json | 1 +
 front/package.json      | 1 +
 2 files changed, 2 insertions(+)

diff --git a/front/package-lock.json b/front/package-lock.json
index 9aeebd04e5ec..527e953dc935 100644
--- a/front/package-lock.json
+++ b/front/package-lock.json
@@ -13,6 +13,7 @@
         "@babel/runtime": "7.x",
         "@citizenlab/cl2-component-library": "file:../cl2-component-library/dist",
         "@craftjs/core": "^0.2.0-beta.5",
+        "@craftjs/utils": "^0.2.0-beta.5",
         "@hookform/resolvers": "^3.1.0",
         "@jsonforms/core": "3.0.0-beta.0",
         "@jsonforms/react": "3.0.0-beta.1",
diff --git a/front/package.json b/front/package.json
index d4d91ebbc01e..2a3b61c6200c 100644
--- a/front/package.json
+++ b/front/package.json
@@ -54,6 +54,7 @@
     "@babel/runtime": "7.x",
     "@citizenlab/cl2-component-library": "file:../cl2-component-library/dist",
     "@craftjs/core": "^0.2.0-beta.5",
+    "@craftjs/utils": "^0.2.0-beta.5",
     "@hookform/resolvers": "^3.1.0",
     "@jsonforms/core": "3.0.0-beta.0",
     "@jsonforms/react": "3.0.0-beta.1",

From 5aa6f362697d83cffe7b9184202ecfebd5ec167a Mon Sep 17 00:00:00 2001
From: Adrien Dessy <adrien@citizenlab.co>
Date: Wed, 6 Mar 2024 18:40:50 +0100
Subject: [PATCH 140/282] [TAN-966] Include public schema when converting Que
 jobs to v2

---
 .../20240306_convert_que_jobs_v1_to_v2.rake   | 50 +++++++++++--------
 1 file changed, 28 insertions(+), 22 deletions(-)

diff --git a/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake b/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake
index 94cc035148e6..18e08e86c18c 100644
--- a/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake
+++ b/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake
@@ -2,33 +2,39 @@
 
 namespace :single_use do
   task convert_que_jobs_v1_to_v2: :environment do
-    Tenant.switch_each do |tenant|
-      tenant_name = Tenant.host_to_schema_name(tenant.host)
-      jobs_v1 = QueJob.by_args({ tenant_schema_name: tenant_name }, {}).not_expired.not_finished.where(job_schema_version: 1)
+    tenant_names = Apartment.tenant_names << 'public'
 
-      Rails.logger.info('Converting Que jobs from v1 to v2', tenant: tenant.host, count: jobs_v1.count)
+    tenant_names.each do |tenant_name|
+      Apartment::Tenant.switch(tenant_name) do
+        jobs_v1 = QueJob
+          .by_args({ tenant_schema_name: tenant_name }, {})
+          .not_expired.not_finished
+          .where(job_schema_version: 1)
 
-      jobs_v1.each do |job|
-        begin
-          job_class = job.args['job_class'].constantize
-        rescue NameError
-          job.destroy!
-          next
-        end
+        Rails.logger.info('Converting Que jobs from v1 to v2', tenant_name: tenant_name, count: jobs_v1.count)
 
-        begin
-          arguments = ActiveJob::Arguments.deserialize(job.args['arguments'])
-        rescue ActiveRecord::RecordNotFound, ActiveJob::DeserializationError
-          job.destroy!
-          next
-        end
+        jobs_v1.each do |job|
+          begin
+            job_class = job.args['job_class'].constantize
+          rescue NameError
+            job.destroy!
+            next
+          end
+
+          begin
+            arguments = ActiveJob::Arguments.deserialize(job.args['arguments'])
+          rescue ActiveRecord::RecordNotFound, ActiveJob::DeserializationError
+            job.destroy!
+            next
+          end
 
-        QueJob.transaction do
-          job_class.set(priority: job.priority, wait_until: job.run_at, queue: job.queue).perform_later(*arguments)
-          job.destroy!
+          QueJob.transaction do
+            job_class.set(priority: job.priority, wait_until: job.run_at, queue: job.queue).perform_later(*arguments)
+            job.destroy!
+          end
+        rescue StandardError => e
+          Rails.logger.error('Failed to convert Que job from v1 to v2', job_id: job.id, exception: e)
         end
-      rescue StandardError => e
-        Rails.logger.error('Failed to convert Que job from v1 to v2', job_id: job.id, exception: e)
       end
     end
   end

From 36de56527d055846cc42f57c7c5c0f7c182d7abf Mon Sep 17 00:00:00 2001
From: Adrien Dessy <adrien@citizenlab.co>
Date: Wed, 6 Mar 2024 19:13:34 +0100
Subject: [PATCH 141/282] [TAN-966] Do not delete v1 Que jobs after conversion
 to v2

If there is a problem with the conversion, it's going to be easier to recover if the original job is still there. We will delete v1 jobs once we are sure that the conversion ran successfully. In the meantime, they will ignored by the v2 worker.
---
 .../tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake   | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake b/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake
index 18e08e86c18c..d0085986bf00 100644
--- a/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake
+++ b/back/lib/tasks/single_use/20240306_convert_que_jobs_v1_to_v2.rake
@@ -17,20 +17,17 @@ namespace :single_use do
           begin
             job_class = job.args['job_class'].constantize
           rescue NameError
-            job.destroy!
             next
           end
 
           begin
             arguments = ActiveJob::Arguments.deserialize(job.args['arguments'])
           rescue ActiveRecord::RecordNotFound, ActiveJob::DeserializationError
-            job.destroy!
             next
           end
 
           QueJob.transaction do
             job_class.set(priority: job.priority, wait_until: job.run_at, queue: job.queue).perform_later(*arguments)
-            job.destroy!
           end
         rescue StandardError => e
           Rails.logger.error('Failed to convert Que job from v1 to v2', job_id: job.id, exception: e)

From af5d80943f3c27900055d95e439ffd6fc292fb9c Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Wed, 6 Mar 2024 19:32:00 +0000
Subject: [PATCH 142/282] Update report empty state disclaimer

---
 .../projects/project/information/ReportTab/EmptyState.tsx   | 2 +-
 .../projects/project/information/ReportTab/messages.ts      | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/front/app/containers/Admin/projects/project/information/ReportTab/EmptyState.tsx b/front/app/containers/Admin/projects/project/information/ReportTab/EmptyState.tsx
index 35c465aa5b1b..7ccc21969f91 100644
--- a/front/app/containers/Admin/projects/project/information/ReportTab/EmptyState.tsx
+++ b/front/app/containers/Admin/projects/project/information/ReportTab/EmptyState.tsx
@@ -33,7 +33,7 @@ const EmptyState = ({ projectId, phaseId }: Props) => {
           </Text>
         </li>
       </ul>
-      <Text color="textSecondary">{formatMessage(messages.thisWillBe)}</Text>
+      <Text color="textSecondary">{formatMessage(messages.afterCreating)}</Text>
       <Box w="100%" mt="32px" display="flex">
         <Button
           id="e2e-create-report-button"
diff --git a/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts b/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts
index 6e300ec9e762..d8f8f51853a6 100644
--- a/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts
+++ b/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts
@@ -17,10 +17,10 @@ export default defineMessages({
     id: 'app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex',
     defaultMessage: 'Create a more complex page for information sharing',
   },
-  thisWillBe: {
-    id: 'app.containers.Admin.projects.project.information.ReportTab.thisWillBe',
+  afterCreating: {
+    id: 'app.containers.Admin.projects.project.information.ReportTab.afterCreating',
     defaultMessage:
-      'This will be publicly available to users as soon as this phase starts.',
+      'After creating a report, you can choose to share it with the public once the phase starts.',
   },
   createReport: {
     id: 'app.containers.Admin.projects.project.information.ReportTab.createReport',

From 8d1441ba0a7275151c4f563911e85ff1b2dd2e80 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Wed, 6 Mar 2024 19:43:40 +0000
Subject: [PATCH 143/282] Use outline instead of border

---
 .../ReportBuilder/Editor/RenderNode/index.tsx | 22 ++++++++++++++-----
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/RenderNode/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/RenderNode/index.tsx
index aaeb3b60a24f..8a57d240d428 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/RenderNode/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/RenderNode/index.tsx
@@ -14,8 +14,8 @@ import messages from 'components/admin/ContentBuilder/Editor/RenderNode/messages
 
 import { FormattedMessage } from 'utils/cl-intl';
 
-const StyledBox = styled(Box)`
-  ${({ isRoot }: { isRoot: boolean }) =>
+const StyledBox = styled(Box)<{ isRoot: boolean; outlineColor?: string }>`
+  ${({ isRoot }) =>
     isRoot
       ? `
         cursor: auto;
@@ -26,6 +26,15 @@ const StyledBox = styled(Box)`
         box-sizing: content-box;
       `
       : 'cursor: move;'}
+
+  ${({ outlineColor }) =>
+    outlineColor
+      ? `
+      outline: 1px solid ${outlineColor};
+    `
+      : 'outline: none;'}
+
+  margin-bottom: 1px;
 `;
 
 const CONTAINER = 'Container';
@@ -128,11 +137,10 @@ const RenderNode = ({ render }) => {
       ref={(ref) => ref && connect(drag(ref))}
       id={id}
       position="relative"
-      borderStyle="solid"
       minHeight={id === ROOT_NODE ? '160px' : '0px'}
       background="#fff"
       borderWidth={invisible ? '0px' : '1px'}
-      borderColor={
+      outlineColor={
         hasError
           ? colors.red600
           : solidBorderIsVisible
@@ -142,10 +150,12 @@ const RenderNode = ({ render }) => {
           : 'transparent'
       }
       isRoot={id === ROOT_NODE}
-      onMouseOver={() => {
+      onMouseOver={(e) => {
+        e.stopPropagation();
         setIsHover(true);
       }}
-      onMouseOut={() => {
+      onMouseOut={(e) => {
+        e.stopPropagation();
         setIsHover(false);
       }}
     >

From 28aa9ea4165b38bb955b114ee049ac6c35d71671 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Wed, 6 Mar 2024 19:45:52 +0000
Subject: [PATCH 144/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/ar-SA.json   | 1 -
 front/app/translations/admin/da-DK.json   | 1 -
 front/app/translations/admin/de-DE.json   | 1 -
 front/app/translations/admin/en-CA.json   | 1 -
 front/app/translations/admin/en-GB.json   | 1 -
 front/app/translations/admin/en.json      | 6 +++++-
 front/app/translations/admin/es-CL.json   | 1 -
 front/app/translations/admin/es-ES.json   | 1 -
 front/app/translations/admin/fi-FI.json   | 1 -
 front/app/translations/admin/fr-BE.json   | 1 -
 front/app/translations/admin/fr-FR.json   | 1 -
 front/app/translations/admin/hr-HR.json   | 1 -
 front/app/translations/admin/lv-LV.json   | 1 -
 front/app/translations/admin/nb-NO.json   | 1 -
 front/app/translations/admin/nl-BE.json   | 1 -
 front/app/translations/admin/nl-NL.json   | 1 -
 front/app/translations/admin/pl-PL.json   | 1 -
 front/app/translations/admin/pt-BR.json   | 1 -
 front/app/translations/admin/sr-Latn.json | 1 -
 front/app/translations/admin/sr-SP.json   | 1 -
 front/app/translations/admin/sv-SE.json   | 1 -
 front/app/translations/admin/tr-TR.json   | 1 -
 22 files changed, 5 insertions(+), 22 deletions(-)

diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index 7030b40b52dc..ce8b1e432efd 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "تقرير",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "التقرير مرئي للعامة",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "مشاركة نتائج الاستطلاع أو مرحلة التفكير السابقة",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "سيكون هذا متاحًا للجمهور بمجرد بدء هذه المرحلة.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "هل أنت متأكد أنك تريد حذف هذا التقرير؟ لا يمكن التراجع عن هذا الإجراء.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "أضف إلى المرحلة",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "تحتاج إلى الموافقة على هذا قبل أن تتمكن من المتابعة",
diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 061a6829218f..f1e6c9df459a 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport synlig for offentligheden",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Del resultaterne af en tidligere survey eller idéfase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Dette vil være offentligt tilgængeligt for brugerne, så snart denne fase starter.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Er du sikker på, at du vil slette denne rapport? Handligen kan ikke fortrydes.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Tilføj til fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Du skal give dit samtykke, før du kan fortsætte.",
diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index 5e72070904e6..cf2c9bdefc56 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Bericht",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Bericht öffentlich sichtbar",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Teilen Sie die Ergebnisse einer vergangenen Umfrage oder Ideenfindung",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Sobald diese Phase beginnt, wird der Bericht für Nutzer*innen öffentlich zugänglich sein.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Sind Sie sicher, dass Sie diesen Beitrag löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Zur Phase hinzufügen",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Sie müssen zustimmen, bevor Sie fortfahren können",
diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index cdef37d1a44e..8fe33b3e690a 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "This will be publicly available to users as soon as this phase starts.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "You need to consent to this before you can continue",
diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index fde872972d30..56396c2b2145 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "This will be publicly available to users as soon as this phase starts.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "You need to consent to this before you can continue",
diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 2f9f75c3b80a..c12f8c33d9ce 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -778,15 +778,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "here",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Before you continue",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "After creating a report, you can choose to share it with the public once the phase starts.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Create a more complex page for information sharing",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Create a report to:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Create a report",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted": "This report is not visible to the public. To make it publicly visible once the phase starts, enable the \"Report visible to public\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted": "This phase has started, but the report is not visible yet to the public. To make it publicly visible, enable the \"Report visible to public\" toggle.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "This will be publicly available to users as soon as this phase starts.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted": "This report will be publicly available as soon as the phase starts. To make it not publicly visible, disable the \"Report visible to public\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted": "This report is currently publicly visible. To make it not publicly visible, disable the \"Report visible to public\" toggle.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "You need to consent to this before you can continue",
diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index 5bdbb02c339f..1254bc8eecff 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Reporte",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Informe visible para el público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Comparte los resultados de una encuesta pasada o de una fase de ideación",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Estará a disposición pública de los usuarios en cuanto comience esta fase.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "¿Estás seguro de que deseas eliminar esta entrada? Esta acción no se puede deshacer.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Añadir a la fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Tienes que dar tu consentimiento antes de continuar",
diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index fa8bc573b17d..53cc04d2684d 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Reporte",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Informe visible para el público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Comparte los resultados de una encuesta pasada o de una fase de ideación",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Estará a disposición pública de los usuarios en cuanto comience esta fase.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "¿Estás seguro de que deseas eliminar esta entrada? Esta acción no se puede deshacer.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Añadir a la fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Tienes que dar tu consentimiento antes de continuar",
diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index 33a823ab443a..551660c9dce8 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Raportoi",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Raportti näkyy julkisesti",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Jaa aiemman kyselyn tai ideointivaiheen tulokset",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Tämä on julkisesti käyttäjien saatavilla heti tämän vaiheen alkaessa.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Haluatko varmasti poistaa tämän raportin? Tätä toimintoa ei voi kumota.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Lisää vaiheeseen",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Sinun on hyväksyttävä tämä ennen kuin voit jatkaa",
diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index 0081f3b521dd..7c65022897ec 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport visible publiquement",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "partager les résultats d'une enquête ou d'une phase de vote passée ;",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Celui-ci sera visible par tous les utilisateurs dès le début de cette phase.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer ce rapport ? Cette action ne peut pas être annulée.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Ajouter à la phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Vous devez donner votre accord avant de pouvoir continuer",
diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index e7b2e6cec00c..2d0142462eba 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport visible publiquement",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "partager les résultats d'une enquête ou d'une phase de vote passée ;",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Celui-ci sera visible par tous les utilisateurs dès le début de cette phase.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer ce rapport ? Cette action ne peut pas être annulée.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Ajouter à la phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Vous devez donner votre accord avant de pouvoir continuer",
diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index fc372b4ddab7..9d0433f82c7f 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "izvješće",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Izvještaj vidljiv javnosti",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Podijelite rezultate prošlog istraživanja ili faze razmišljanja",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Ovo će biti javno dostupno korisnicima čim ova faza započne.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Jeste li sigurni da želite izbrisati ovo izvješće? Ova se radnja ne može poništiti.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Dodaj u fazu",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Morate pristati na ovo prije nego što možete nastaviti",
diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 0417ddcf431a..ffde7ceca130 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Ziņojums",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Publiski redzams ziņojums",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Kopīgojiet iepriekš veiktas aptaujas vai ideju izstrādes posma rezultātus.",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Tas būs publiski pieejams lietotājiem, tiklīdz sāksies šis posms.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Vai esat pārliecināts, ka vēlaties dzēst šo ziņojumu? Šo darbību nevar atcelt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Pievienot fāzei",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Pirms turpināt darbu, jums tam ir jāpiekrīt.",
diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index d23be4cd611f..dd9c7707622c 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapportere",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapporten er synlig for publikum",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Del resultater fra en tidligere undersøkelse eller idéfase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Dette vil være offentlig tilgjengelig for brukere så snart denne fasen starter.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Er du sikker på at du vil slette denne rapporten? Denne handlingen kan ikke angres.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Legg til fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Du må samtykke til dette før du kan fortsette",
diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index c14f499759b2..73b96249293c 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport zichtbaar voor publiek",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "De resultaten van een eerdere vragenlijst of fase waarin ideeën zijn verzameld te delen",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Dit zal publiekelijk zichtbaar zijn voor gebruikers zodra deze fase van start gaat.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Weet je zeker dat je dit rapport wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Toevoegen aan fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Je moet hiermee instemmen voordat je verder kunt gaan",
diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index b7c3fcee1043..2334a223f65e 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport zichtbaar voor publiek",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "De resultaten van een eerdere vragenlijst of fase waarin ideeën zijn verzameld te delen",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Dit zal publiekelijk zichtbaar zijn voor gebruikers zodra deze fase van start gaat.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Weet je zeker dat je dit rapport wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Toevoegen aan fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Je moet hiermee instemmen voordat je verder kunt gaan",
diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index 43073a389914..2cc66fc4a71c 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Raport",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Raport widoczny publicznie",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Podziel się wynikami wcześniejszej ankiety lub fazy tworzenia pomysłów.",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Będą one publicznie dostępne dla użytkowników zaraz po rozpoczęciu tej fazy.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Czy na pewno chcesz usunąć ten raport? Tej czynności nie można cofnąć.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Dodaj do fazy",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Musisz wyrazić na to zgodę, zanim będziesz mógł kontynuować",
diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index b0b2b42c6acd..6f1f039c864f 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Relatório",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Relatório visível para o público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Compartilhe os resultados de uma pesquisa anterior ou da fase de ideação",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Isso estará disponível publicamente para os usuários assim que essa fase for iniciada.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Você tem certeza de que deseja excluir este relatório? Essa ação não pode ser desfeita.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Adicionar à fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Você precisa consentir com isso antes de continuar",
diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index 31a7669253b6..6be6fbde7984 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "This will be publicly available to users as soon as this phase starts.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "You need to consent to this before you can continue",
diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index f7bc6cfacb35..56cc0cd4de5e 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "This will be publicly available to users as soon as this phase starts.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Да ли сте сигурни да желите да избришете овај извештај? Ова радња се не може опозвати.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Додајте у фазу",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Морате да пристанете на ово пре него што наставите",
diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 4ea35858709e..944c97410fe4 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport synlig för allmänheten",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Dela med dig av resultaten från en tidigare undersökning eller idéfas",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Detta kommer att vara offentligt tillgängligt för användarna så snart denna fas startar.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Är du säker på att du vill ta bort denna rapport? Denna åtgärd kan inte ångras.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Lägg till fas",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Du måste godkänna detta innan du kan fortsätta",
diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index db28af7fda91..377e96c350c9 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -786,7 +786,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapor",
   "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Kamuoyu tarafından görülebilen rapor",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Geçmiş bir anketin veya fikir aşamasının sonuçlarını paylaşın",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Bu aşama başlar başlamaz kullanıcılara açık olacaktır.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Bu raporu silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Faza ekle",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Devam edebilmeniz için buna onay vermeniz gerekir",

From 2fa14a8012ba05647f1f54ab5766e2d7cc507bf8 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 7 Mar 2024 08:37:04 +0000
Subject: [PATCH 145/282] Remove unnecessary condition from border color logic

---
 .../components/ReportBuilder/Editor/RenderNode/index.tsx        | 2 --
 1 file changed, 2 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/RenderNode/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/RenderNode/index.tsx
index 8a57d240d428..2eaf5a022954 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/RenderNode/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Editor/RenderNode/index.tsx
@@ -145,8 +145,6 @@ const RenderNode = ({ render }) => {
           ? colors.red600
           : solidBorderIsVisible
           ? colors.primary
-          : isSelectable
-          ? 'transparent'
           : 'transparent'
       }
       isRoot={id === ROOT_NODE}

From 9e04a93e8128ad57ac47ec47232a37588d1b0660 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 7 Mar 2024 08:55:40 +0000
Subject: [PATCH 146/282] Don't allow grouping a survey question by itself

---
 .../Settings/QuestionSelect.tsx               | 32 +++++++------------
 .../Settings/index.tsx                        |  8 +++--
 2 files changed, 18 insertions(+), 22 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Settings/QuestionSelect.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Settings/QuestionSelect.tsx
index b9dbebba8232..5da7a972d726 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Settings/QuestionSelect.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Settings/QuestionSelect.tsx
@@ -1,9 +1,9 @@
-import React, { useMemo } from 'react';
+import React from 'react';
 
 import { Box, Select } from '@citizenlab/cl2-component-library';
 import { IOption } from 'typings';
 
-import { ICustomFields, ICustomFieldInputType } from 'api/custom_fields/types';
+import { ICustomFields, ICustomFieldResponse } from 'api/custom_fields/types';
 import useRawCustomFields from 'api/custom_fields/useRawCustomFields';
 
 import useLocalize, { Localize } from 'hooks/useLocalize';
@@ -11,24 +11,20 @@ import useLocalize, { Localize } from 'hooks/useLocalize';
 interface Props {
   phaseId: string;
   questionId?: string;
-  inputTypes: ICustomFieldInputType[];
+  filterQuestion: (question: ICustomFieldResponse) => boolean;
   label: string;
   onChange: (questionId?: string) => void;
 }
 
 const generateOptions = (
   questions: ICustomFields,
-  inputTypes: ICustomFieldInputType[],
+  filterQuestion: Props['filterQuestion'],
   localize: Localize
 ) => {
-  const inputTypesSet = new Set(inputTypes);
-
-  const options = questions.data
-    .filter((question) => inputTypesSet.has(question.attributes.input_type))
-    .map((question) => ({
-      value: question.id,
-      label: localize(question.attributes.title_multiloc),
-    }));
+  const options = questions.data.filter(filterQuestion).map((question) => ({
+    value: question.id,
+    label: localize(question.attributes.title_multiloc),
+  }));
 
   return [{ value: '', label: '' }, ...options];
 };
@@ -36,7 +32,7 @@ const generateOptions = (
 const QuestionSelect = ({
   phaseId,
   questionId,
-  inputTypes,
+  filterQuestion,
   label,
   onChange,
 }: Props) => {
@@ -47,13 +43,9 @@ const QuestionSelect = ({
     onChange(value === '' ? undefined : value);
   };
 
-  const inputTypesStr = JSON.stringify(inputTypes);
-  const questionOptions = useMemo(() => {
-    if (!questions) return [];
-
-    const inputTypes: ICustomFieldInputType[] = JSON.parse(inputTypesStr);
-    return generateOptions(questions, inputTypes, localize);
-  }, [questions, inputTypesStr, localize]);
+  const questionOptions = questions
+    ? generateOptions(questions, filterQuestion, localize)
+    : [];
 
   return (
     <Box width="100%" mb="20px">
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Settings/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Settings/index.tsx
index df031c82c96f..f95c9314e7c3 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Settings/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Settings/index.tsx
@@ -142,7 +142,9 @@ const Settings = () => {
         <QuestionSelect
           phaseId={phaseId}
           questionId={questionId}
-          inputTypes={['select', 'multiselect']}
+          filterQuestion={({ attributes }) => {
+            return ['select', 'multiselect'].includes(attributes.input_type);
+          }}
           label={formatMessage(messages.question)}
           onChange={handleQuestion}
         />
@@ -163,7 +165,9 @@ const Settings = () => {
         <QuestionSelect
           phaseId={phaseId}
           questionId={groupFieldId}
-          inputTypes={['select']}
+          filterQuestion={({ attributes, id }) => {
+            return attributes.input_type === 'select' && id !== questionId;
+          }}
           label={formatMessage(messages.groupBySurveyQuestion)}
           onChange={handleGroupField}
         />

From 3addcea6fc727cb59564be3745bc379c79ec4db7 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Thu, 7 Mar 2024 11:27:27 +0100
Subject: [PATCH 147/282] [TAN-1241] Move areCraftjsObjectsEqual to separate
 file

---
 .../containers/ReportBuilder/index.tsx        | 48 ++-----------------
 .../reporting/utils/areCraftjsObjectsEqual.ts | 48 +++++++++++++++++++
 2 files changed, 52 insertions(+), 44 deletions(-)
 create mode 100644 front/app/containers/Admin/reporting/utils/areCraftjsObjectsEqual.ts

diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index 6cc32c3b3bcc..1e84caba77b2 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -1,8 +1,7 @@
 import React, { useState } from 'react';
 
 import { Box, stylingConsts } from '@citizenlab/cl2-component-library';
-import { SerializedNodes } from '@craftjs/core';
-import { isEmpty, isEqual, isUndefined, omitBy } from 'lodash-es';
+import { isEmpty } from 'lodash-es';
 import { useLocation, useParams, useSearchParams } from 'react-router-dom';
 import { Locale } from 'typings';
 
@@ -30,52 +29,13 @@ import ViewContainer from '../../components/ReportBuilder/ViewContainer';
 import { View } from '../../components/ReportBuilder/ViewContainer/typings';
 import ViewPicker from '../../components/ReportBuilder/ViewContainer/ViewPicker';
 import { ReportContextProvider } from '../../context/ReportContext';
+import areCraftjsObjectsEqual from '../../utils/areCraftjsObjectsEqual';
 
 interface Props {
   report: ReportResponse;
   reportLayout: ReportLayout;
 }
 
-const areEqual = (
-  craftjsCurrentData: SerializedNodes,
-  persistedData: SerializedNodes
-) => {
-  if (
-    isEmpty(persistedData) &&
-    (isEmpty(craftjsCurrentData) ||
-      craftjsCurrentData['ROOT'].nodes.length === 0)
-  ) {
-    return true;
-  }
-
-  // When the layout is saved, `undefined` fields are not saved
-  // (e.g., `parent` in { ROOT: { parent: undefined, ...}, ...} will be omitted).
-  // So, they are never present in reportLayout.attributes.craftjs_json,
-  // but they are present in the editor state `query.getSerializedNodes()`.
-  //
-  // The "for" loop does the same thing as this alternative version with JSON.stringify,
-  // but it's more performant.
-  //
-  // JSON.stringify emulates sending the data to the server and getting it back
-  // (it removes undefined values).
-  // JSON.parse makes sure that the comparison is not affected by the order of keys.
-  // return isEqual(
-  //   JSON.parse(JSON.stringify(craftjsCurrentData)),
-  //   JSON.parse(JSON.stringify(persistedData))
-  // );
-  for (const key in craftjsCurrentData) {
-    if (
-      !isEqual(
-        omitBy(craftjsCurrentData[key], isUndefined),
-        omitBy(persistedData[key], isUndefined)
-      )
-    ) {
-      return false;
-    }
-  }
-  return true;
-};
-
 const ReportBuilder = ({ report, reportLayout }: Props) => {
   const reportId = report.data.id;
   const phaseId = report.data.relationships.phase?.data?.id;
@@ -141,11 +101,11 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
             // This comparison is still not perfect.
             // E.g., if you add a node with rich text editor, save the report,
             // and then modify the default text and revert the change,
-            // areEqual may still return false, because the default text may not have
+            // areCraftjsObjectsEqual may still return false, because the default text may not have
             // a wrapping <p> tag, which is added as soon as you start typing.
             // But it's good enough for now.
             setSaved(
-              areEqual(
+              areCraftjsObjectsEqual(
                 query.getSerializedNodes(),
                 reportLayout.attributes.craftjs_json
               )
diff --git a/front/app/containers/Admin/reporting/utils/areCraftjsObjectsEqual.ts b/front/app/containers/Admin/reporting/utils/areCraftjsObjectsEqual.ts
new file mode 100644
index 000000000000..a9e0d115ab58
--- /dev/null
+++ b/front/app/containers/Admin/reporting/utils/areCraftjsObjectsEqual.ts
@@ -0,0 +1,48 @@
+import { SerializedNodes } from '@craftjs/core';
+import { isEmpty, isEqual, isUndefined, omitBy } from 'lodash-es';
+
+const areCraftjsObjectsEqual = (
+  craftjsCurrentData: SerializedNodes,
+  persistedData: SerializedNodes
+) => {
+  if (
+    isEmpty(persistedData) &&
+    (isEmpty(craftjsCurrentData) ||
+      craftjsCurrentData['ROOT'].nodes.length === 0)
+  ) {
+    return true;
+  }
+
+  // When the layout is saved, `undefined` fields are not saved
+  // (e.g., `parent` in { ROOT: { parent: undefined, ...}, ...} will be omitted).
+  // So, they are never present in reportLayout.attributes.craftjs_json,
+  // but they are present in the editor state `query.getSerializedNodes()`.
+  //
+  // The "for" loop does the same thing as this alternative version with JSON.stringify,
+  // but it's more performant.
+  //
+  // JSON.stringify emulates sending the data to the server and getting it back
+  // (it removes undefined values).
+  // JSON.parse makes sure that the comparison is not affected by the order of keys.
+  // return isEqual(
+  //   JSON.parse(JSON.stringify(craftjsCurrentData)),
+  //   JSON.parse(JSON.stringify(persistedData))
+  // );
+  //
+  // If persistedData has a key (a node) that craftjsCurrentData doesn't have,
+  // it will still work correctly because
+  // persistedData['ROOT'].nodes will have it, and craftjsCurrentData['ROOT'].nodes won't.
+  for (const key in craftjsCurrentData) {
+    if (
+      !isEqual(
+        omitBy(craftjsCurrentData[key], isUndefined),
+        omitBy(persistedData[key], isUndefined)
+      )
+    ) {
+      return false;
+    }
+  }
+  return true;
+};
+
+export default areCraftjsObjectsEqual;

From b347df3b90b318cac022a64518e8df19c5e3883f Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 7 Mar 2024 10:38:21 +0000
Subject: [PATCH 148/282] Fix autosave

---
 .../components/ReportBuilder/TopBar/index.tsx | 54 +++++++++----------
 .../containers/ReportBuilder/index.tsx        | 33 +++++++++---
 2 files changed, 54 insertions(+), 33 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
index 820f338f68b8..9b5c2032a87c 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx
@@ -24,7 +24,6 @@ import Button from 'components/UI/Button';
 
 import { FormattedMessage, useIntl } from 'utils/cl-intl';
 import clHistory from 'utils/cl-router/history';
-import { removeSearchParams } from 'utils/cl-router/removeSearchParams';
 
 import { View } from '../ViewContainer/typings';
 import ViewPicker from '../ViewContainer/ViewPicker';
@@ -103,8 +102,6 @@ const ContentBuilderTopBar = ({
       {
         onSuccess: () => {
           setSaved(true);
-
-          removeSearchParams(['templateProjectId', 'templatePhaseId']);
         },
       }
     );
@@ -130,39 +127,42 @@ const ContentBuilderTopBar = ({
       return;
     }
 
-    const nodes = query.getSerializedNodes();
-    const firstNode = nodes.ROOT?.nodes[0];
+    const interval = setInterval(() => {
+      const nodes = query.getSerializedNodes();
+      const firstNode = nodes.ROOT?.nodes[0];
+      if (!firstNode) return;
 
-    if (!firstNode) return;
+      const displayName = nodes?.[firstNode].displayName;
 
-    const displayName = nodes?.[firstNode].displayName;
+      if (!['ProjectTemplate', 'PhaseTemplate'].includes(displayName)) {
+        // In theory this should not be possible, but handling
+        // it gracefully just in case
+        setInitialized(true);
+        clearInterval(interval);
+        return;
+      }
 
-    if (['ProjectTemplate', 'PhaseTemplate'].includes(displayName)) {
       const numberOfNodes = Object.keys(nodes).length;
-
       if (displayName === 'ProjectTemplate' && numberOfNodes < 5) return;
 
-      setTimeout(() => {
-        updateReportLayout(
-          {
-            id: reportId,
-            craftjs_json: query.getSerializedNodes(),
-            projectId,
+      updateReportLayout(
+        {
+          id: reportId,
+          craftjs_json: nodes,
+          projectId,
+        },
+        {
+          onSuccess: () => {
+            setSaved(true);
           },
-          {
-            onSuccess: () => {
-              setSaved(true);
-
-              removeSearchParams(['templateProjectId', 'templatePhaseId']);
-            },
-          }
-        );
-      }, 5000);
+        }
+      );
 
       setInitialized(true);
-    } else {
-      setInitialized(true);
-    }
+      clearInterval(interval);
+    }, 3000);
+
+    return () => clearInterval(interval);
   }, [
     isTemplate,
     query,
diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index 2fa1f6abc322..332959926a54 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import React, { useState, useEffect } from 'react';
 
 import { Box, stylingConsts } from '@citizenlab/cl2-component-library';
 import { isEmpty } from 'lodash-es';
@@ -19,6 +19,8 @@ import FullscreenContentBuilder from 'components/admin/ContentBuilder/Fullscreen
 import LanguageProvider from 'components/admin/ContentBuilder/LanguageProvider';
 import { ContentBuilderErrors } from 'components/admin/ContentBuilder/typings';
 
+import { removeSearchParams } from 'utils/cl-router/removeSearchParams';
+
 import Editor from '../../components/ReportBuilder/Editor';
 import Settings from '../../components/ReportBuilder/Settings';
 import PhaseTemplate from '../../components/ReportBuilder/Templates/PhaseTemplate';
@@ -32,16 +34,20 @@ import { ReportContextProvider } from '../../context/ReportContext';
 interface Props {
   report: ReportResponse;
   reportLayout: ReportLayout;
+  templateProjectId: string | null;
+  templatePhaseId: string | null;
 }
 
-const ReportBuilder = ({ report, reportLayout }: Props) => {
+const ReportBuilder = ({
+  report,
+  reportLayout,
+  templateProjectId,
+  templatePhaseId,
+}: Props) => {
   const reportId = report.data.id;
   const phaseId = report.data.relationships.phase?.data?.id;
 
   const platformLocale = useLocale();
-  const [search] = useSearchParams();
-  const templateProjectId = search.get('templateProjectId');
-  const templatePhaseId = search.get('templatePhaseId');
   const [view, setView] = useState<View>('pdf');
 
   const [initialData] = useState(() => {
@@ -137,6 +143,14 @@ const ReportBuilderWrapper = () => {
   const { data: report } = useReport(reportId);
   const { data: reportLayout } = useReportLayout(reportId);
 
+  const [search] = useSearchParams();
+  const [templateProjectId] = useState(search.get('templateProjectId'));
+  const [templatePhaseId] = useState(search.get('templatePhaseId'));
+
+  useEffect(() => {
+    removeSearchParams(['templateProjectId', 'templatePhaseId']);
+  }, []);
+
   const renderReportBuilder =
     reportBuilderEnabled &&
     pathname.includes('admin/reporting/report-builder') &&
@@ -146,7 +160,14 @@ const ReportBuilderWrapper = () => {
 
   if (!renderReportBuilder) return null;
 
-  return <ReportBuilder report={report} reportLayout={reportLayout.data} />;
+  return (
+    <ReportBuilder
+      report={report}
+      reportLayout={reportLayout.data}
+      templateProjectId={templateProjectId}
+      templatePhaseId={templatePhaseId}
+    />
+  );
 };
 
 export default ReportBuilderWrapper;

From 3de72df571407c6836d10eb28bdb1b16c38c86b9 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 7 Mar 2024 10:57:17 +0000
Subject: [PATCH 149/282] Add e2e tests for autosaving

---
 .../e2e/report_builder/idea_template.cy.ts    | 66 +++++++++++++++++--
 1 file changed, 61 insertions(+), 5 deletions(-)

diff --git a/front/cypress/e2e/report_builder/idea_template.cy.ts b/front/cypress/e2e/report_builder/idea_template.cy.ts
index 70f4ecd05382..a2a9c8d08bd0 100644
--- a/front/cypress/e2e/report_builder/idea_template.cy.ts
+++ b/front/cypress/e2e/report_builder/idea_template.cy.ts
@@ -72,10 +72,12 @@ describe('Idea template', () => {
     cy.apiRemoveUser(userId);
   });
 
+  beforeEach(() => {
+    cy.setAdminLoginCookie();
+  });
+
   describe('Global report builder', () => {
     it('should create an idea template', () => {
-      cy.setAdminLoginCookie();
-
       // Create report from template
       cy.visit(`/admin/reporting/report-builder`);
       cy.get('#e2e-create-report-button').click();
@@ -107,7 +109,6 @@ describe('Idea template', () => {
     });
 
     it('creates a report from a template and allows editing it', () => {
-      cy.setAdminLoginCookie();
       cy.apiCreateReportBuilder().then((report) => {
         const reportId = report.body.data.id;
         cy.visit(
@@ -159,12 +160,39 @@ describe('Idea template', () => {
         cy.apiRemoveReportBuilder(reportId);
       });
     });
+
+    it('autosaves report created from template', () => {
+      cy.apiCreateReportBuilder().then((report) => {
+        const reportId = report.body.data.id;
+
+        cy.intercept('PATCH', `/web_api/v1/reports/${reportId}`).as(
+          'saveReportLayout'
+        );
+
+        cy.visit(
+          `/admin/reporting/report-builder/${reportId}/editor?templateProjectId=${projectId}`
+        );
+
+        // This tests that initially, the save button indicates that the report is unsaved (does not have svg icon)
+        cy.get('#e2e-content-builder-topbar-save > button').should('exist');
+        cy.get('#e2e-content-builder-topbar-save > button > svg').should(
+          'not.exist'
+        );
+
+        // Then, when we intercept the autosave...
+        cy.wait(2000);
+        cy.wait('@saveReportLayout');
+
+        // We expect the save button to indicate that the report is saved (has svg icon)
+        cy.get('#e2e-content-builder-topbar-save > button > svg').should(
+          'exist'
+        );
+      });
+    });
   });
 
   describe('Phase report builder', () => {
     it('should create an idea template', () => {
-      cy.setAdminLoginCookie();
-
       // Create report inside of phase
       cy.visit(`/en/admin/projects/${projectId}/phases/${phaseId}/report`);
       cy.get('#e2e-create-report-button').click();
@@ -194,5 +222,33 @@ describe('Idea template', () => {
       // Ensure we're back to the empty state
       cy.get('#e2e-create-report-button').should('exist');
     });
+
+    it('autosaves report created from template', () => {
+      cy.apiCreateReportBuilder(phaseId).then((report) => {
+        const reportId = report.body.data.id;
+
+        cy.intercept('PATCH', `/web_api/v1/reports/${reportId}`).as(
+          'saveReportLayout'
+        );
+        cy.visit(
+          `/admin/reporting/report-builder/${reportId}/editor?templatePhaseId=${phaseId}`
+        );
+
+        // This tests that initially, the save button indicates that the report is unsaved (does not have svg icon)
+        cy.get('#e2e-content-builder-topbar-save > button').should('exist');
+        cy.get('#e2e-content-builder-topbar-save > button > svg').should(
+          'not.exist'
+        );
+
+        // Then, when we intercept the autosave...
+        cy.wait(2000);
+        cy.wait('@saveReportLayout');
+
+        // We expect the save button to indicate that the report is saved (has svg icon)
+        cy.get('#e2e-content-builder-topbar-save > button > svg').should(
+          'exist'
+        );
+      });
+    });
   });
 });

From ac261b68eb225ad3c4dcc438cd80b73f8854f102 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:00:54 +0100
Subject: [PATCH 150/282] New translations en.json (French)

---
 front/app/translations/admin/fr-FR.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index 9fc2cd6b14a0..a983f54fea45 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Veuillez d'abord sélectionner une question.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Pas de réponse",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} réponses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Données de la phase {phase} pendant {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Question d'enquête",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} jusqu'à maintenant",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titre",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Résumé du rapport",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Ajoutez le but du projet, les méthodes de participation utilisées et le résultat",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Visiteurs",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Ce rapport contient des modifications non enregistrées. Veuillez le sauvegarder avant de l'imprimer.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Aucune phase appropriée n'a été trouvée dans ce projet",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Aucune phase n'a été sélectionnée. Veuillez d'abord sélectionner une phase.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Aucun projet",

From e75e7e9dea3c417b979f9ad0e6d86db1307f2852 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:01:01 +0100
Subject: [PATCH 151/282] New translations en.json (Spanish)

---
 front/app/translations/admin/es-ES.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index fa8bc573b17d..952648127c16 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No hay ninguna pregunta seleccionada. Por favor, selecciona primero una pregunta.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Sin respuesta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} respuestas",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Datos de {phase} durante {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Pregunta de la encuesta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} hasta ahora",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Título",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Resumen del informe",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Añada el objetivo del proyecto, los métodos de participación utilizados y el resultado",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Visitantes",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Este informe contiene cambios no guardados. Por favor, guárdalos antes de imprimirlos.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "No se han encontrado fases adecuadas en este proyecto",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "No se ha seleccionado ninguna fase. Por favor, selecciona primero una fase.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Ningún proyecto",

From 37c96724d9b6b579b3efd5f2f75da2d0aa71d053 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:01:08 +0100
Subject: [PATCH 152/282] New translations en.json (Arabic)

---
 front/app/translations/admin/ar-SA.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index 7030b40b52dc..fb7b73fe015f 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "لم يتم تحديد أي سؤال. الرجاء تحديد سؤال أولاً.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "لا اجابة",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} الردود",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "البيانات من {phase} خلال {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "مسح السؤال",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} حتى الآن",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "العنوان",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "ملخص التقرير",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "أضف هدف المشروع وطرق المشاركة المتبعة والنتيجة",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "زوار",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "يحتوي هذا التقرير على تغييرات غير محفوظة. يرجى الحفظ قبل الطباعة.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "لم يتم العثور على مراحل مناسبة في هذا المشروع",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "لم يتم تحديد أي مرحلة. الرجاء تحديد المرحلة أولا.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "لا يوجد مشروع",

From 0ac115aecbb5d72b8933d44d7db90f9e291a82dc Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:01:20 +0100
Subject: [PATCH 153/282] New translations en.json (Danish)

---
 front/app/translations/admin/da-DK.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 061a6829218f..0f96c4448c95 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Intet spørgsmål valgt. Vælg venligst et spørgsmål først.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Intet svar",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} svar",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data fra {phase} under {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Spørgsmål til undersøgelsen",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} indtil nu",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titel",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Resumé af rapporten",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Tilføj projektets mål, de anvendte deltagelsesmetoder og resultatet",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Besøgende",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Denne rapport indeholder ændringer, der ikke er gemt. Gem venligst før udskrivning.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Ingen passende faser fundet i dette projekt",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Ingen fase valgt. Vælg venligst en fase først.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Intet projekt",

From c9378a2e426a011180a2df4c3364a3b9c0441bf2 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:01:28 +0100
Subject: [PATCH 154/282] New translations en.json (German)

---
 front/app/translations/admin/de-DE.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index 955012e96431..f3cc556c95ec 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Keine Frage ausgewählt. Bitte wählen Sie zuerst eine Frage aus.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Keine Antwort",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} Antworten",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Daten von {phase} während {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Frage",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} bis jetzt",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titel",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Zusammenfassung des Berichts",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Fügen Sie das Projektziel, die verwendeten Beteiligungsmethoden und das Ergebnis hinzu",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Besucher*innen",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Dieser Bericht enthält ungesicherte Änderungen. Bitte speichern Sie ihn vor dem Drucken.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Keine geeigneten Phasen in diesem Projekt gefunden",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Keine Phase ausgewählt. Bitte wählen Sie zuerst eine Phase.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Kein Projekt",

From 3c37b5bd1cd864939cea94b25a7e22be13a9e624 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:01:40 +0100
Subject: [PATCH 155/282] New translations en.json (Finnish)

---
 front/app/translations/admin/fi-FI.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index 33a823ab443a..5823f2d868c5 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Yhtään kysymystä ei valittu. Valitse ensin kysymys.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Ei vastausta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} vastauksia",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Tiedot kohteesta {phase} aikana {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Kysely kysymys",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} tähän asti",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Otsikko",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Raportin yhteenveto",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Lisää projektin tavoite, käytetyt osallistumismenetelmät ja tulos",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Vierailijat",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Tämä raportti sisältää tallentamattomia muutoksia. Tallenna ennen tulostusta.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Tästä projektista ei löytynyt sopivia vaiheita",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Vaihetta ei ole valittu. Valitse ensin vaihe.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Ei projektia",

From d2378726bd32c06394c534d37ea2dcda427fb624 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:01:54 +0100
Subject: [PATCH 156/282] New translations en.json (Dutch)

---
 front/app/translations/admin/nl-NL.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index 9540c68f6983..3e1db7089fa3 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Geen vraag geselecteerd. Selecteer eerst een vraag.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Geen antwoord",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} reacties",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Gegevens van {phase} tijdens {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Enquêtevraag",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} tot nu toe",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titel",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Samenvatting van het verslag",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Voeg het doel van het project, de gebruikte participatiemethoden en het resultaat toe",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Bezoekers",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Dit rapport bevat niet-opgeslagen wijzigingen. Sla het op voordat je het afdrukt.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Geen geschikte fasen gevonden in dit project",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Geen fase geselecteerd. Selecteer eerst een fase.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Geen project",

From 2141e80351b5718aaac054bdb78512edb782d628 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:02:03 +0100
Subject: [PATCH 157/282] New translations en.json (Norwegian)

---
 front/app/translations/admin/nb-NO.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index d23be4cd611f..70ac501248af 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Ingen spørsmål er valgt. Vennligst velg et spørsmål først.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Ingen svar",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} svar",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data fra {phase} under {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Undersøkelsesspørsmål",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} til nå",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Tittel",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Rapportsammendrag",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Legg til målet med prosjektet, deltakermetoder som brukes og utfallet",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Besøkende",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Denne rapporten inneholder ulagrede endringer. Vennligst lagre før utskrift.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Ingen passende faser funnet i dette prosjektet",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Ingen fase valgt. Velg en fase først.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Ingen prosjekter",

From d9866276fe577a67871afcde6673438a08f58b7e Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:02:11 +0100
Subject: [PATCH 158/282] New translations en.json (Polish)

---
 front/app/translations/admin/pl-PL.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index 43073a389914..bf5dadd7bb6a 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Nie wybrano żadnego pytania. Wybierz pytanie jako pierwsze.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Brak odpowiedzi",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} odpowiedzi",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Dane z {phase} podczas {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Pytanie ankietowe",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} aż do teraz",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Tytuł",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Streszczenie sprawozdania",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Dodaj cel projektu, zastosowane metody uczestnictwa oraz wynik.",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Odwiedzający",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Ten raport zawiera niezapisane zmiany. Zapisz go przed wydrukowaniem.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "W tym projekcie nie znaleziono odpowiednich faz",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Nie wybrano żadnej fazy. Najpierw wybierz fazę.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Brak projektu",

From 49def5f01696716ae12695185886925eef767265 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:02:20 +0100
Subject: [PATCH 159/282] New translations en.json (Serbian (Cyrillic))

---
 front/app/translations/admin/sr-SP.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index f7bc6cfacb35..a538f5c94740 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No question selected. Please select a question first.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "No answer",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} responses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data from {phase} during {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Survey question",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} until now",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Наслов",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Резиме извештаја",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Додајте циљ пројекта, коришћене методе учешћа и исход",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Посетиоци",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "This report contains unsaved changes. Please save before printing.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "No appropriate phases found in this project",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "No phase selected. Please select a phase first.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Нема пројекта",

From c64617a5ddd0d382caf245db6573ad9353f09eef Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:02:28 +0100
Subject: [PATCH 160/282] New translations en.json (Swedish)

---
 front/app/translations/admin/sv-SE.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 4ea35858709e..8f64cbad0465 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Ingen fråga vald. Vänligen välj en fråga först.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Inget svar",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} svar",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Uppgifter från {phase} under {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Enkätfråga",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} fram till nu",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titel",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Sammanfattning av rapport",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Lägg till projektets mål, metoder som använts för deltagande och resultatet",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Besökare",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Denna rapport innehåller osparade ändringar. Spara innan du skriver ut.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Inga lämpliga faser hittades i detta projekt",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Ingen fas vald. Vänligen välj en fas först.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Inget projekt",

From fded22e50e829ce37c4d6f5a31582a24885e2f79 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:02:39 +0100
Subject: [PATCH 161/282] New translations en.json (Turkish)

---
 front/app/translations/admin/tr-TR.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index db28af7fda91..0ebd60d2ac48 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Seçili soru yok. Lütfen önce bir soru seçin.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Cevap yok",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} yanıtlar",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "{period}sırasında {phase} adresinden alınan veriler",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Anket sorusu",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} şimdiye kadar",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Başlık",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Rapor özeti",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Projenin amacını, kullanılan katılım yöntemlerini ve sonucu ekleyin",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Ziyaretçiler",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Bu rapor kaydedilmemiş değişiklikler içermektedir. Lütfen yazdırmadan önce kaydedin.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Bu projede uygun bir aşama bulunamamıştır",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Seçili faz yok. Lütfen önce bir faz seçin.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Proje yok",

From 47f6de8a9b0459b5aae5194f17212d480c9f7304 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:02:48 +0100
Subject: [PATCH 162/282] New translations en.json (Portuguese, Brazilian)

---
 front/app/translations/admin/pt-BR.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index b0b2b42c6acd..cc29c408476e 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Nenhuma pergunta foi selecionada. Selecione uma pergunta primeiro.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Sem resposta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} respostas",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Dados de {phase} durante {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Pergunta da pesquisa",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} até o momento",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Assunto",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Resumo do relatório",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Acrescentar o objectivo do projeto, os métodos de participação utilizados, e o resultado",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Visitantes",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Este relatório contém alterações não salvas. Por favor, salve-o antes de imprimir.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Não foram encontradas fases apropriadas neste projeto",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Nenhuma fase foi selecionada. Selecione uma fase primeiro.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Nenhum projeto",

From c7f1f5cc81f1976104b4d2583c840f2789b1196f Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:02:58 +0100
Subject: [PATCH 163/282] New translations en.json (Spanish, Chile)

---
 front/app/translations/admin/es-CL.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index 5bdbb02c339f..d5695c4c8d9f 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No hay ninguna pregunta seleccionada. Por favor, selecciona primero una pregunta.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Sin respuesta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} respuestas",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Datos de {phase} durante {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Pregunta de la encuesta",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} hasta ahora",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Título",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Resumen del informe",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Añada el objetivo del proyecto, los métodos de participación utilizados y el resultado",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Visitantes",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Este informe contiene cambios no guardados. Por favor, guárdalos antes de imprimirlos.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "No se han encontrado fases adecuadas en este proyecto",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "No se ha seleccionado ninguna fase. Por favor, selecciona primero una fase.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Ningún proyecto",

From 7453f28a8ddd56232385b4cb9de5cb1cf5d428ff Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:03:08 +0100
Subject: [PATCH 164/282] New translations en.json (Croatian)

---
 front/app/translations/admin/hr-HR.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index fc372b4ddab7..da024a657975 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Nije odabrano nijedno pitanje. Prvo odaberite pitanje.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Nema odgovora",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} odgovora",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Podaci od {phase} tijekom {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Anketno pitanje",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} do sada",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Naslov",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Sažetak izvješća",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Dodajte cilj projekta, upotrijebljene načine sudjelovanja i ishod",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Posjetitelji",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Ovo izvješće sadrži nespremljene promjene. Molimo spremite prije ispisa.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "U ovom projektu nisu pronađene odgovarajuće faze",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Nije odabrana faza. Prvo odaberite fazu.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Nema projekta",

From a9a1f23fb627fab0bb4b3d4845d92be8ef681cdd Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:03:19 +0100
Subject: [PATCH 165/282] New translations en.json (Latvian)

---
 front/app/translations/admin/lv-LV.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 0417ddcf431a..3949a6fabeca 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Nav izvēlēts neviens jautājums. Lūdzu, vispirms izvēlieties jautājumu.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Nav atbildes",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} atbildes",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Dati no {phase} {period}laikā",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Aptaujas jautājums",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} līdz šim",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Nosaukums",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Ziņojuma kopsavilkums",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Pievienojiet projekta mērķi, izmantotās līdzdalības metodes un rezultātu",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Apmeklētāji",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Šajā ziņojumā ir iekļautas nesaglabātas izmaiņas. Pirms drukāšanas lūdzu, saglabājiet to.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Šajā projektā nav atrasti atbilstoši posmi",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Nav izvēlēta neviena fāze. Lūdzu, vispirms izvēlieties fāzi.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Nav projekta",

From 4744603eecb38ca0cfed05b5ed4393c994cff38d Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:03:31 +0100
Subject: [PATCH 166/282] New translations en.json (English, Canada)

---
 front/app/translations/admin/en-CA.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index cdef37d1a44e..71bfca0ba54d 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No question selected. Please select a question first.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "No answer",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} responses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data from {phase} during {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Survey question",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} until now",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Title",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Report summary",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Add the goal of the project, participation methods used, and the outcome",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Visitors",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "This report contains unsaved changes. Please save before printing.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "No appropriate phases found in this project",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "No phase selected. Please select a phase first.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "No project",

From 8f048e26f9759fe7d669861391f46998d34a7356 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:03:38 +0100
Subject: [PATCH 167/282] New translations en.json (English, United Kingdom)

---
 front/app/translations/admin/en-GB.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index fde872972d30..7aea31291c17 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No question selected. Please select a question first.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "No answer",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} responses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data from {phase} during {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Survey question",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} until now",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Title",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Report summary",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Add the goal of the project, participation methods used, and the outcome",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Visitors",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "This report contains unsaved changes. Please save before printing.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "No appropriate phases found in this project",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "No phase selected. Please select a phase first.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "No project",

From cdcb1157c916538fa846c202e21c16aaaf44ab89 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:03:51 +0100
Subject: [PATCH 168/282] New translations en.json (Serbian (Latin))

---
 front/app/translations/admin/sr-Latn.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index 31a7669253b6..528d6ed844c7 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "No question selected. Please select a question first.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "No answer",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} responses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Data from {phase} during {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Survey question",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} until now",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Naziv",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Rezime izveštaja",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Dodaj cilj projekta, korišćene metode učešća i ishod",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Posetioci",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "This report contains unsaved changes. Please save before printing.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "No appropriate phases found in this project",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "No phase selected. Please select a phase first.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Nema projekta",

From 4301033833269cdfe1ffd1053dff002545d3f50f Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:03:59 +0100
Subject: [PATCH 169/282] New translations en.json (Dutch, Belgium)

---
 front/app/translations/admin/nl-BE.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index c14f499759b2..343c84fa40c5 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Geen vraag geselecteerd. Selecteer eerst een vraag.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Geen antwoord",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} reacties",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Gegevens van {phase} tijdens {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Enquêtevraag",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} tot nu toe",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titel",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Samenvatting van het verslag",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Voeg het doel van het project, de gebruikte participatiemethoden en het resultaat toe",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Bezoekers",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Dit rapport bevat niet-opgeslagen wijzigingen. Sla het op voordat je het afdrukt.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Geen geschikte fasen gevonden in dit project",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Geen fase geselecteerd. Selecteer eerst een fase.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Geen project",

From d2e8d59f8d97fd0d0798e9ee074436983694d128 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:04:09 +0100
Subject: [PATCH 170/282] New translations en.json (French, Belgium)

---
 front/app/translations/admin/fr-BE.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index 0081f3b521dd..fb4bc732a88b 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "Veuillez d'abord sélectionner une question.",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "Pas de réponse",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "{count} réponses",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "Données de la phase {phase} pendant {period}",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "Question d'enquête",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "{date} jusqu'à maintenant",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "Titre",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "Résumé du rapport",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "Ajoutez le but du projet, les méthodes de participation utilisées et le résultat",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "Visiteurs",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "Ce rapport contient des modifications non enregistrées. Veuillez le sauvegarder avant de l'imprimer.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "Aucune phase appropriée n'a été trouvée dans ce projet",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "Aucune phase n'a été sélectionnée. Veuillez d'abord sélectionner une phase.",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "Aucun projet",

From 6936d21d1fd1d45414b43567fe9efbc6e2abe8dc Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 13:04:21 +0100
Subject: [PATCH 171/282] New translations en.json (Acholi)

---
 front/app/translations/admin/ach-UG.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/ach-UG.json b/front/app/translations/admin/ach-UG.json
index c0e3d584ad60..c3bb4711fd0d 100644
--- a/front/app/translations/admin/ach-UG.json
+++ b/front/app/translations/admin/ach-UG.json
@@ -72,7 +72,6 @@
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.emptyField": "crwdns1667668:0crwdne1667668:0",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.noAnswer": "crwdns1761140:0crwdne1761140:0",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.numberOfResponses": "crwdns1667670:0{count}crwdne1667670:0",
-  "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.sourceAndReference": "crwdns1667672:0{phase}crwdnd1667672:0{period}crwdne1667672:0",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.surveyQuestion": "crwdns1667674:0crwdne1667674:0",
   "app.components.admin.ContentBuilder.Widgets.SurveyQuestionResultWidget.untilNow": "crwdns1667676:0{date}crwdne1667676:0",
   "app.components.admin.ContentBuilder.Widgets.Title.title": "crwdns209142:0crwdne209142:0",
@@ -855,6 +854,7 @@
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummary": "crwdns210388:0crwdne210388:0",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.reportSummaryDescription": "crwdns210390:0crwdne210390:0",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.visitors": "crwdns210392:0crwdne210392:0",
+  "app.containers.Admin.reporting.components.ReportBuilder.TopBar.cannotPrint": "crwdns1919494:0crwdne1919494:0",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noAppropriatePhases": "crwdns1603844:0crwdne1603844:0",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noPhaseSelected": "crwdns1603846:0crwdne1603846:0",
   "app.containers.Admin.reporting.components.ReportBuilder.Widgets.noProject": "crwdns210394:0crwdne210394:0",

From d15181ea7a9642a658f87124d46ff342e4181b27 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 7 Mar 2024 12:39:02 +0000
Subject: [PATCH 172/282] Replace all params by snake_case (except dates)

---
 front/app/api/graph_data_units/index.ts       | 36 ++++++------
 .../app/api/graph_data_units/requestTypes.ts  | 56 +++++++++----------
 .../graph_data_units/useGraphDataUnitsLive.ts | 20 ++-----
 .../useCommentsByTime/index.ts                |  2 +-
 .../PostsByTimeCard/usePostsByTime/index.ts   |  2 +-
 .../useReactionsByTime/index.ts               |  2 +-
 .../useVisitorReferrerTypes/index.ts          |  2 +-
 .../dashboard/users/Charts/AgeChart/index.tsx |  2 +-
 .../users/Charts/GenderChart/index.tsx        |  2 +-
 .../ActiveUsersWidget/useActiveUsers/index.ts |  2 +-
 .../ChartWidgets/AgeWidget/AgeCard.tsx        |  2 +-
 .../useCommentsByTime/index.ts                |  2 +-
 .../ChartWidgets/GenderWidget/GenderCard.tsx  |  2 +-
 .../PostsByTimeWidget/usePostsByTime/index.ts |  2 +-
 .../useReactionsByTime/index.tsx              |  2 +-
 .../useVisitorReferrerTypes/index.ts          |  2 +-
 .../VisitorsWidget/useVisitors/index.ts       |  2 +-
 .../Widgets/MostReactedIdeasWidget/index.tsx  |  4 +-
 .../Widgets/SingleIdeaWidget/index.tsx        |  4 +-
 .../Question/index.tsx                        |  8 +--
 .../SurveyResultsWidget/SurveyResults.tsx     |  2 +-
 21 files changed, 74 insertions(+), 84 deletions(-)

diff --git a/front/app/api/graph_data_units/index.ts b/front/app/api/graph_data_units/index.ts
index 76ee058c5185..48ede281211b 100644
--- a/front/app/api/graph_data_units/index.ts
+++ b/front/app/api/graph_data_units/index.ts
@@ -27,14 +27,14 @@ import useGraphDataUnitsLive from './useGraphDataUnitsLive';
 
 export const useSurveyResults = (props: SurveyResultsProps) => {
   return useGraphDataUnits<SurveyResultsResponse>({
-    resolvedName: 'SurveyResultsWidget',
+    resolved_name: 'SurveyResultsWidget',
     props,
   });
 };
 
 export const useSurveyQuestionResult = (props: SurveyQuestionResultProps) => {
   return useGraphDataUnits<SurveyQuestionResultResponse>({
-    resolvedName: 'SurveyQuestionResultWidget',
+    resolved_name: 'SurveyQuestionResultWidget',
     props,
   });
 };
@@ -45,7 +45,7 @@ export const useMostReactedIdeas = (
 ) => {
   return useGraphDataUnits<MostReactedIdeasResponse>(
     {
-      resolvedName: 'MostReactedIdeasWidget',
+      resolved_name: 'MostReactedIdeasWidget',
       props,
     },
     { enabled }
@@ -58,7 +58,7 @@ export const useSingleIdea = (
 ) => {
   return useGraphDataUnits<SingleIdeaResponse>(
     {
-      resolvedName: 'SingleIdeaWidget',
+      resolved_name: 'SingleIdeaWidget',
       props,
     },
     { enabled }
@@ -71,7 +71,7 @@ export const useVisitors = (
 ) => {
   return useGraphDataUnits<VisitorsResponse>(
     {
-      resolvedName: 'VisitorsWidget',
+      resolved_name: 'VisitorsWidget',
       props,
     },
     { onSuccess }
@@ -82,7 +82,7 @@ export const useVisitorsTrafficSources = (
   props: VisitorsTrafficSourcesProps
 ) => {
   return useGraphDataUnits<VisitorsTrafficSourcesResponse>({
-    resolvedName: 'VisitorsTrafficSourcesWidget',
+    resolved_name: 'VisitorsTrafficSourcesWidget',
     props,
   });
 };
@@ -91,35 +91,35 @@ export const useVisitorsTrafficSourcesLive = (
   props: VisitorsTrafficSourcesProps
 ) => {
   return useGraphDataUnitsLive<VisitorsTrafficSourcesResponse>({
-    resolvedName: 'VisitorsTrafficSourcesWidget',
+    resolved_name: 'VisitorsTrafficSourcesWidget',
     props,
   });
 };
 
 export const useUsersByGender = (props: GenderProps) => {
   return useGraphDataUnits<UsersByGenderResponse>({
-    resolvedName: 'GenderWidget',
+    resolved_name: 'GenderWidget',
     props,
   });
 };
 
 export const useUsersByGenderLive = (props: GenderProps) => {
   return useGraphDataUnitsLive<UsersByGenderResponse>({
-    resolvedName: 'GenderWidget',
+    resolved_name: 'GenderWidget',
     props,
   });
 };
 
 export const useUsersByAge = (props: AgeProps) => {
   return useGraphDataUnits<UsersByBirthyearResponse>({
-    resolvedName: 'AgeWidget',
+    resolved_name: 'AgeWidget',
     props,
   });
 };
 
 export const useUsersByAgeLive = (props: AgeProps) => {
   return useGraphDataUnitsLive<UsersByBirthyearResponse>({
-    resolvedName: 'AgeWidget',
+    resolved_name: 'AgeWidget',
     props,
   });
 };
@@ -130,7 +130,7 @@ export const useActiveUsers = (
 ) => {
   return useGraphDataUnits<ActiveUsersResponse>(
     {
-      resolvedName: 'ActiveUsersWidget',
+      resolved_name: 'ActiveUsersWidget',
       props,
     },
     { onSuccess }
@@ -139,7 +139,7 @@ export const useActiveUsers = (
 
 export const usePostsByTime = (props: AnalyticsProps) => {
   return useGraphDataUnits<PostsByTimeResponse>({
-    resolvedName: 'PostsByTimeWidget',
+    resolved_name: 'PostsByTimeWidget',
     props,
   });
 };
@@ -150,7 +150,7 @@ export const usePostsByTimeLive = (
 ) => {
   return useGraphDataUnitsLive<PostsByTimeResponse>(
     {
-      resolvedName: 'PostsByTimeWidget',
+      resolved_name: 'PostsByTimeWidget',
       props,
     },
     { onSuccess }
@@ -163,7 +163,7 @@ export const useCommentsByTime = (
 ) => {
   return useGraphDataUnits<CommentsByTimeResponse>(
     {
-      resolvedName: 'CommentsByTimeWidget',
+      resolved_name: 'CommentsByTimeWidget',
       props,
     },
     { onSuccess }
@@ -176,7 +176,7 @@ export const useCommentsByTimeLive = (
 ) => {
   return useGraphDataUnitsLive<CommentsByTimeResponse>(
     {
-      resolvedName: 'CommentsByTimeWidget',
+      resolved_name: 'CommentsByTimeWidget',
       props,
     },
     { onSuccess }
@@ -185,7 +185,7 @@ export const useCommentsByTimeLive = (
 
 export const useReactionsByTime = (props: AnalyticsProps) => {
   return useGraphDataUnits<ReactionsByTimeResponse>({
-    resolvedName: 'ReactionsByTimeWidget',
+    resolved_name: 'ReactionsByTimeWidget',
     props,
   });
 };
@@ -196,7 +196,7 @@ export const useReactionsByTimeLive = (
 ) => {
   return useGraphDataUnitsLive<ReactionsByTimeResponse>(
     {
-      resolvedName: 'ReactionsByTimeWidget',
+      resolved_name: 'ReactionsByTimeWidget',
       props,
     },
     { onSuccess }
diff --git a/front/app/api/graph_data_units/requestTypes.ts b/front/app/api/graph_data_units/requestTypes.ts
index 6d1de0bab39e..b676f6f5c5c9 100644
--- a/front/app/api/graph_data_units/requestTypes.ts
+++ b/front/app/api/graph_data_units/requestTypes.ts
@@ -18,7 +18,7 @@ export type ResolvedName =
   | 'ReactionsByTimeWidget';
 
 export interface BaseParams {
-  resolvedName: ResolvedName;
+  resolved_name: ResolvedName;
   props: Record<string, any>;
 }
 
@@ -37,106 +37,106 @@ export type ParametersLive =
   | ReactionsByTimeParams;
 
 export interface SurveyResultsProps {
-  phaseId?: string | null;
+  phase_id?: string | null;
 }
 export interface SurveyResultsParams extends BaseParams {
-  resolvedName: 'SurveyResultsWidget';
+  resolved_name: 'SurveyResultsWidget';
   props: SurveyResultsProps;
 }
 
 export type GroupMode = 'user_field' | 'survey_question';
 
 export interface SurveyQuestionResultProps {
-  phaseId: string;
-  questionId: string;
-  groupMode?: GroupMode;
-  groupFieldId?: string;
+  phase_id: string;
+  question_id: string;
+  group_mode?: GroupMode;
+  group_field_id?: string;
 }
 
 export interface SurveyQuestionResultParams extends BaseParams {
-  resolvedName: 'SurveyQuestionResultWidget';
+  resolved_name: 'SurveyQuestionResultWidget';
   props: SurveyQuestionResultProps;
 }
 
 export interface AnalyticsProps {
-  projectId?: string | undefined;
+  project_id?: string | undefined;
   startAtMoment?: Moment | null | undefined;
   endAtMoment?: Moment | null;
   resolution?: IResolution;
 }
 
 export interface MostReactedIdeasProps {
-  phaseId?: string | null;
-  numberOfIdeas?: number;
+  phase_id?: string | null;
+  number_of_ideas?: number;
 }
 export interface MostReactedIdeasParams extends BaseParams {
-  resolvedName: 'MostReactedIdeasWidget';
+  resolved_name: 'MostReactedIdeasWidget';
   props: MostReactedIdeasProps;
 }
 
 export interface SingleIdeaProps {
-  phaseId?: string | null;
-  ideaId?: string;
+  phase_id?: string | null;
+  idea_id?: string;
 }
 export interface SingleIdeaParams extends BaseParams {
-  resolvedName: 'SingleIdeaWidget';
+  resolved_name: 'SingleIdeaWidget';
   props: SingleIdeaProps;
 }
 
 export interface VisitorsParams extends BaseParams {
-  resolvedName: 'VisitorsWidget';
+  resolved_name: 'VisitorsWidget';
   props: AnalyticsProps;
 }
 
 export interface VisitorsTrafficSourcesProps {
-  projectId?: string | undefined;
+  project_id?: string;
   startAtMoment?: Moment | null | undefined;
   endAtMoment?: Moment | null;
 }
 export interface VisitorsTrafficSourcesParams extends BaseParams {
-  resolvedName: 'VisitorsTrafficSourcesWidget';
+  resolved_name: 'VisitorsTrafficSourcesWidget';
   props: VisitorsTrafficSourcesProps;
 }
 
 export interface GenderProps {
-  projectId?: string | undefined;
+  project_id?: string;
   startAtMoment?: Moment | null | undefined;
   endAtMoment?: Moment | null;
-  groupId?: string | null;
+  group_id?: string | null;
 }
 export interface GenderParams extends BaseParams {
-  resolvedName: 'GenderWidget';
+  resolved_name: 'GenderWidget';
   props: GenderProps;
 }
 
 export interface AgeProps {
-  projectId?: string | undefined;
+  project_id?: string;
   startAtMoment?: Moment | null | undefined;
   endAtMoment?: Moment | null;
-  groupId?: string | null;
+  group_id?: string | null;
 }
 export interface AgeParams extends BaseParams {
-  resolvedName: 'AgeWidget';
+  resolved_name: 'AgeWidget';
   props: AgeProps;
 }
 
 export interface ActiveUsersParams extends BaseParams {
-  resolvedName: 'ActiveUsersWidget';
+  resolved_name: 'ActiveUsersWidget';
   props: AnalyticsProps;
 }
 
 export interface PostsByTimeParams extends BaseParams {
-  resolvedName: 'PostsByTimeWidget';
+  resolved_name: 'PostsByTimeWidget';
   props: AnalyticsProps;
 }
 
 export interface CommentsByTimeParams extends BaseParams {
-  resolvedName: 'CommentsByTimeWidget';
+  resolved_name: 'CommentsByTimeWidget';
   props: AnalyticsProps;
 }
 
 export interface ReactionsByTimeParams extends BaseParams {
-  resolvedName: 'ReactionsByTimeWidget';
+  resolved_name: 'ReactionsByTimeWidget';
   props: AnalyticsProps;
 }
 
diff --git a/front/app/api/graph_data_units/useGraphDataUnitsLive.ts b/front/app/api/graph_data_units/useGraphDataUnitsLive.ts
index cb4d3a5bba2a..100d83dcc27a 100644
--- a/front/app/api/graph_data_units/useGraphDataUnitsLive.ts
+++ b/front/app/api/graph_data_units/useGraphDataUnitsLive.ts
@@ -9,28 +9,18 @@ import graphDataUnitKeys from './keys';
 import { ParametersLive, Options } from './requestTypes';
 
 const fetchGraphDataUnitsLive = <Response extends BaseResponseData>({
-  resolvedName,
+  resolved_name,
   props,
 }: ParametersLive) => {
-  const _props = props as any;
-
   return fetcher<Response>({
     path: `/reports/graph_data_units/live`,
     action: 'get',
     queryParams: {
-      resolved_name: resolvedName,
+      resolved_name,
       props: {
-        project_id: _props.projectId,
-        phase_id: _props.phaseId,
-        idea_id: _props.ideaId,
-        resolution: _props.resolution,
-        group_id: _props.groupId,
-        number_of_ideas: _props.numberOfIdeas,
-        question_id: _props.questionId,
-        group_mode: _props.groupMode,
-        group_field_id: _props.groupFieldId,
-        start_at: _props.startAtMoment?.format('yyyy-MM-DD'),
-        end_at: _props.endAtMoment?.format('yyyy-MM-DD'),
+        ...props,
+        start_at: (props as any).startAtMoment?.format('yyyy-MM-DD'),
+        end_at: (props as any).endAtMoment?.format('yyyy-MM-DD'),
       },
     },
   });
diff --git a/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts b/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
index 3d1c26862f2d..446292deb6a4 100644
--- a/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
@@ -19,7 +19,7 @@ export default function useCommentsByTime({
   const [currentResolution, setCurrentResolution] = useState(resolution);
   const { data: analytics } = useCommentsByTimeLive(
     {
-      projectId,
+      project_id: projectId,
       startAtMoment,
       endAtMoment,
       resolution,
diff --git a/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts b/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
index 75077c660f93..4aeea2b2a497 100644
--- a/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
@@ -20,7 +20,7 @@ export default function usePostsByTime({
   const [currentResolution, setCurrentResolution] = useState(resolution);
   const { data: analytics } = usePostsByTimeLive(
     {
-      projectId,
+      project_id: projectId,
       startAtMoment,
       endAtMoment,
       resolution,
diff --git a/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts b/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
index a488ec42bfcb..78d0ec84368f 100644
--- a/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
@@ -21,7 +21,7 @@ export default function useReactionsByTime({
 
   const { data: analytics } = useReactionsByTimeLive(
     {
-      projectId,
+      project_id: projectId,
       startAtMoment,
       endAtMoment,
       resolution,
diff --git a/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts b/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
index 0c88a88d8064..fc24a7e34253 100644
--- a/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
+++ b/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
@@ -12,7 +12,7 @@ export default function useVisitorsReferrerTypes({
   endAtMoment,
 }: QueryParameters) {
   const { data: analytics } = useVisitorsTrafficSourcesLive({
-    projectId,
+    project_id: projectId,
     startAtMoment,
     endAtMoment,
   });
diff --git a/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx b/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
index db0a316d0da1..270c757f9707 100644
--- a/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
+++ b/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
@@ -33,7 +33,7 @@ const AgeChart = ({
   const { data: usersByBirthyear } = useUsersByAgeLive({
     startAtMoment: startAt ? moment(startAt) : null,
     endAtMoment: endAt ? moment(endAt) : null,
-    groupId: currentGroupFilter,
+    group_id: currentGroupFilter,
   });
   const ageSerie = convertToGraphFormat(usersByBirthyear, formatMessage);
 
diff --git a/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx b/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
index 962723cfacb3..c8820b27343a 100644
--- a/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
+++ b/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
@@ -32,7 +32,7 @@ const GenderChart = ({
   const { data: usersByGender } = useUsersByGenderLive({
     startAtMoment: startAt ? moment(startAt) : null,
     endAtMoment: endAt ? moment(endAt) : null,
-    groupId: currentGroupFilter,
+    group_id: currentGroupFilter,
   });
   const serie = convertToGraphFormat(usersByGender, formatMessage);
   const graphRef = useRef();
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/index.ts
index 90ed524b09ef..a76092e3f499 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/index.ts
@@ -15,7 +15,7 @@ export default function useActiveUsers({
 
   const analytics = useActiveUsersData(
     {
-      projectId,
+      project_id: projectId,
       startAtMoment,
       endAtMoment,
       resolution,
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/AgeCard.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/AgeCard.tsx
index 8f85ba3732e1..6fe782f99b22 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/AgeCard.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/AgeCard.tsx
@@ -31,9 +31,9 @@ type Props = ProjectId & Dates;
 
 const AgeCard = ({ startAtMoment, endAtMoment, projectId }: Props) => {
   const usersByBirthyear = useUsersByAge({
+    project_id: projectId,
     startAtMoment,
     endAtMoment,
-    projectId,
   });
   const { formatMessage } = useIntl();
 
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/useCommentsByTime/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/useCommentsByTime/index.ts
index 3d243d25df71..40cddb042895 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/useCommentsByTime/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/useCommentsByTime/index.ts
@@ -15,7 +15,7 @@ export default function useCommentsByTime({
 
   const dataUnits = useCommentsByTimeData(
     {
-      projectId,
+      project_id: projectId,
       startAtMoment,
       endAtMoment,
       resolution,
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/GenderCard.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/GenderCard.tsx
index 09540c856f30..856bb8369bd5 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/GenderCard.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/GenderCard.tsx
@@ -22,9 +22,9 @@ type Props = ProjectId & Dates;
 
 const GenderCard = ({ startAtMoment, endAtMoment, projectId }: Props) => {
   const usersByGender = useUsersByGender({
+    project_id: projectId,
     startAtMoment,
     endAtMoment,
-    projectId,
   });
   const { formatMessage } = useIntl();
 
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/usePostsByTime/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/usePostsByTime/index.ts
index 8b30a9cb7c06..503364aeeb15 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/usePostsByTime/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/usePostsByTime/index.ts
@@ -14,7 +14,7 @@ export default function usePostsByTime({
   const [currentResolution] = useState(resolution);
 
   const analytics = usePostsByTimeData({
-    projectId,
+    project_id: projectId,
     startAtMoment,
     endAtMoment,
     resolution,
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/useReactionsByTime/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/useReactionsByTime/index.tsx
index 5e753f33f08e..45623827ea43 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/useReactionsByTime/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/useReactionsByTime/index.tsx
@@ -14,7 +14,7 @@ export default function useReactionsByTime123({
   const [currentResolution] = useState(resolution);
 
   const analytics = useReactionsByTime({
-    projectId,
+    project_id: projectId,
     startAtMoment,
     endAtMoment,
     resolution,
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/useVisitorReferrerTypes/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/useVisitorReferrerTypes/index.ts
index 1a8495023845..2f9ae3129eec 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/useVisitorReferrerTypes/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/useVisitorReferrerTypes/index.ts
@@ -12,7 +12,7 @@ export default function useVisitorsReferrerTypes({
   endAtMoment,
 }: QueryParameters) {
   const analytics = useVisitorsTrafficSources({
-    projectId,
+    project_id: projectId,
     startAtMoment,
     endAtMoment,
   });
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/index.ts
index 5f522380454c..071e5a677a59 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/index.ts
@@ -18,7 +18,7 @@ export default function useVisitors({
 
   const analytics = useVisitorsData(
     {
-      projectId,
+      project_id: projectId,
       startAtMoment,
       endAtMoment,
       resolution,
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/MostReactedIdeasWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/MostReactedIdeasWidget/index.tsx
index 7e59f3b9695d..0f463ecfe8c7 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/MostReactedIdeasWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/MostReactedIdeasWidget/index.tsx
@@ -21,8 +21,8 @@ const MostReactedIdeasWidget = ({
 }: Props) => {
   const response = useMostReactedIdeas(
     {
-      phaseId,
-      numberOfIdeas,
+      phase_id: phaseId,
+      number_of_ideas: numberOfIdeas,
     },
     {
       enabled: !!phaseId,
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SingleIdeaWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SingleIdeaWidget/index.tsx
index 3b77e9662ad5..8301c4c9b6b1 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SingleIdeaWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SingleIdeaWidget/index.tsx
@@ -26,8 +26,8 @@ const SingleIdeaWidget = ({
 }: Props) => {
   const response = useSingleIdea(
     {
-      phaseId,
-      ideaId,
+      phase_id: phaseId,
+      idea_id: ideaId,
     },
     {
       enabled: !!phaseId && !!ideaId,
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/index.tsx
index ff75c05c88a2..c53f1a01ab96 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyQuestionResultWidget/Question/index.tsx
@@ -34,10 +34,10 @@ const SurveyQuestionResult = ({
   groupFieldId,
 }: Props) => {
   const response = useSurveyQuestionResult({
-    phaseId,
-    questionId,
-    groupMode,
-    groupFieldId,
+    phase_id: phaseId,
+    question_id: questionId,
+    group_mode: groupMode,
+    group_field_id: groupFieldId,
   });
 
   const localize = useLocalize();
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/SurveyResults.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/SurveyResults.tsx
index 562e854dc199..f885f1a8a1c5 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/SurveyResults.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/SurveyResults.tsx
@@ -37,7 +37,7 @@ const SurveyResults = ({ phaseId, shownQuestions }: Props) => {
   );
 
   const formResults = useSurveyResults({
-    phaseId,
+    phase_id: phaseId,
   });
 
   const resultRows = useMemo(() => {

From 01bf43dafdbf87ff07f6841b808b8b6dbc26b99a Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Thu, 7 Mar 2024 14:33:31 +0100
Subject: [PATCH 173/282] [TAN-1261] Check report layout policy in published
 data policy

---
 .../published_graph_data_unit_policy.rb       |  2 +-
 .../published_graph_data_unit_policy_spec.rb  | 88 +++----------------
 2 files changed, 11 insertions(+), 79 deletions(-)

diff --git a/back/engines/commercial/report_builder/app/policies/report_builder/published_graph_data_unit_policy.rb b/back/engines/commercial/report_builder/app/policies/report_builder/published_graph_data_unit_policy.rb
index 80d2c12c50fa..d7d8cb544b93 100644
--- a/back/engines/commercial/report_builder/app/policies/report_builder/published_graph_data_unit_policy.rb
+++ b/back/engines/commercial/report_builder/app/policies/report_builder/published_graph_data_unit_policy.rb
@@ -3,7 +3,7 @@
 module ReportBuilder
   class PublishedGraphDataUnitPolicy < ::ApplicationPolicy
     def published?
-      record.report.phase.started? && PhasePolicy.new(user, record.report.phase).show?
+      ReportPolicy.new(user, record.report).layout?
     end
   end
 end
diff --git a/back/engines/commercial/report_builder/spec/policies/report_builder/published_graph_data_unit_policy_spec.rb b/back/engines/commercial/report_builder/spec/policies/report_builder/published_graph_data_unit_policy_spec.rb
index 9d16c2e36b08..f44fc21d3751 100644
--- a/back/engines/commercial/report_builder/spec/policies/report_builder/published_graph_data_unit_policy_spec.rb
+++ b/back/engines/commercial/report_builder/spec/policies/report_builder/published_graph_data_unit_policy_spec.rb
@@ -3,92 +3,24 @@
 require 'rails_helper'
 
 RSpec.describe ReportBuilder::PublishedGraphDataUnitPolicy do
-  subject { described_class.new(user, data_unit) }
+  subject { described_class.new(instance_double(User), data_unit) }
 
-  shared_examples 'permits if phase started' do
-    context 'phase started' do
-      let_it_be(:phase) { build(:phase, project: project, start_at: 1.day.ago) }
-      let_it_be(:report) { build(:report, phase: phase) }
-      let_it_be(:data_unit) { build(:published_graph_data_unit, report: report) }
-
-      it { is_expected.to permit(:published) }
-    end
-  end
-
-  shared_examples 'does not permit if phase not started' do
-    context 'phase not started' do
-      let_it_be(:phase) { build(:phase, project: project, start_at: 1.day.from_now) }
-      let_it_be(:report) { build(:report, phase: phase) }
-      let_it_be(:data_unit) { build(:published_graph_data_unit, report: report) }
-
-      it { is_expected.not_to permit(:published) }
-    end
-  end
-
-  let_it_be(:project) { create(:project) }
-  let_it_be(:phase) { create(:phase, project: project) }
-  let_it_be(:report) { create(:report, phase: phase) }
+  let_it_be(:report) { create(:report, phase: build(:phase)) }
   let_it_be(:data_unit) { create(:published_graph_data_unit, report: report) }
 
-  context 'when user is admin' do
-    let_it_be(:user) { build(:admin) }
-
-    it { is_expected.to permit(:published) }
+  before do
+    allow(ReportBuilder::ReportPolicy).to receive(:new).and_return(report_policy)
   end
 
-  context 'when user is moderator' do
-    context 'when user can moderate project' do
-      let_it_be(:user) { build(:project_moderator, projects: [project]) }
-      it { is_expected.to permit(:published) }
-    end
+  context 'when ReportPolicy#layout? returns true' do
+    let(:report_policy) { instance_double(ReportBuilder::ReportPolicy, layout?: true) }
 
-    context 'when user cannot moderate project' do
-      let_it_be(:user) { build(:project_moderator) }
-
-      include_examples 'permits if phase started'
-      include_examples 'does not permit if phase not started'
-    end
-  end
-
-  context 'when user is normal user' do
-    let_it_be(:user) { build(:user) }
-
-    context 'when user is not project member' do
-      before do
-        allow(PhasePolicy).to receive(:new).and_return(instance_double(PhasePolicy, show?: false))
-      end
-
-      it { is_expected.not_to permit(:published) }
-    end
-
-    context 'when user is project member' do
-      before do
-        allow(PhasePolicy).to receive(:new).and_return(instance_double(PhasePolicy, show?: true))
-      end
-
-      include_examples 'permits if phase started'
-      include_examples 'does not permit if phase not started'
-    end
+    it { is_expected.to permit(:published) }
   end
 
-  context 'when user is visitor' do
-    let_it_be(:user) { nil }
-
-    context 'when user is not project member' do
-      before do
-        allow(PhasePolicy).to receive(:new).and_return(instance_double(PhasePolicy, show?: false))
-      end
-
-      it { is_expected.not_to permit(:published) }
-    end
-
-    context 'when user is project member' do
-      before do
-        allow(PhasePolicy).to receive(:new).and_return(instance_double(PhasePolicy, show?: true))
-      end
+  context 'when ReportPolicy#layout? returns false' do
+    let(:report_policy) { instance_double(ReportBuilder::ReportPolicy, layout?: false) }
 
-      include_examples 'permits if phase started'
-      include_examples 'does not permit if phase not started'
-    end
+    it { is_expected.not_to permit(:published) }
   end
 end

From 250173e04389b7e5b71164126c83fb1071e24fae Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 7 Mar 2024 14:08:59 +0000
Subject: [PATCH 174/282] Fix all start_at and end_at type stuff

---
 .../app/api/graph_data_units/requestTypes.ts  | 18 +++++------
 .../graph_data_units/useGraphDataUnitsLive.ts | 16 +++-------
 front/app/api/graph_data_units/utils.ts       |  5 ++++
 .../useCommentsByTime/index.ts                |  5 ++--
 .../PostsByTimeCard/usePostsByTime/index.ts   |  5 ++--
 .../useReactionsByTime/index.ts               |  5 ++--
 .../useVisitorReferrerTypes/index.ts          | 10 +++++--
 .../useVisitorReferrerTypes/typings.ts        |  4 ---
 .../components/admin/GraphCards/typings.ts    |  5 ++++
 .../dashboard/users/Charts/AgeChart/index.tsx |  5 ++--
 .../users/Charts/GenderChart/index.tsx        |  5 ++--
 .../ActiveUsersWidget/ActiveUsersCard.tsx     | 20 +++++--------
 .../ChartWidgets/ActiveUsersWidget/index.tsx  | 26 +++-------------
 .../ActiveUsersWidget/useActiveUsers/index.ts | 17 ++++++-----
 .../useActiveUsers/typings.ts                 |  4 +--
 .../ChartWidgets/AgeWidget/AgeCard.tsx        | 14 +++++----
 .../Widgets/ChartWidgets/AgeWidget/index.tsx  | 10 +------
 .../CommentsByTimeCard.tsx                    | 20 +++++--------
 .../CommentsByTimeWidget/index.tsx            | 21 ++-----------
 .../useCommentsByTime/index.ts                | 24 ++++++++++-----
 .../ChartWidgets/GenderWidget/GenderCard.tsx  | 10 +++----
 .../ChartWidgets/GenderWidget/index.tsx       | 15 +---------
 .../PostsByTimeWidget/PostsByTimeCard.tsx     | 20 +++++--------
 .../ChartWidgets/PostsByTimeWidget/index.tsx  | 21 ++-----------
 .../PostsByTimeWidget/usePostsByTime/index.ts | 24 ++++++++++-----
 .../ReactionsByTimeCard.tsx                   | 20 +++++--------
 .../ReactionsByTimeWidget/index.tsx           | 21 ++-----------
 .../useReactionsByTime/index.tsx              | 30 ++++++++++++-------
 .../VisitorTrafficSourcesCard.tsx             | 14 ++++-----
 .../VisitorsTrafficSourcesWidget/index.tsx    | 19 ++----------
 .../useVisitorReferrerTypes/index.ts          | 12 ++++----
 .../VisitorsWidget/VisitorsCard.tsx           | 20 +++++--------
 .../ChartWidgets/VisitorsWidget/index.tsx     | 22 ++------------
 .../VisitorsWidget/useVisitors/index.ts       | 16 +++++-----
 .../VisitorsWidget/useVisitors/typings.ts     |  4 +--
 35 files changed, 199 insertions(+), 308 deletions(-)
 create mode 100644 front/app/api/graph_data_units/utils.ts

diff --git a/front/app/api/graph_data_units/requestTypes.ts b/front/app/api/graph_data_units/requestTypes.ts
index b676f6f5c5c9..ebf83e2dfa3d 100644
--- a/front/app/api/graph_data_units/requestTypes.ts
+++ b/front/app/api/graph_data_units/requestTypes.ts
@@ -1,5 +1,3 @@
-import { Moment } from 'moment';
-
 import { IResolution } from 'components/admin/ResolutionControl';
 
 // live
@@ -60,8 +58,8 @@ export interface SurveyQuestionResultParams extends BaseParams {
 
 export interface AnalyticsProps {
   project_id?: string | undefined;
-  startAtMoment?: Moment | null | undefined;
-  endAtMoment?: Moment | null;
+  start_at?: string | null | undefined;
+  end_at?: string | null;
   resolution?: IResolution;
 }
 
@@ -90,8 +88,8 @@ export interface VisitorsParams extends BaseParams {
 
 export interface VisitorsTrafficSourcesProps {
   project_id?: string;
-  startAtMoment?: Moment | null | undefined;
-  endAtMoment?: Moment | null;
+  start_at?: string | null | undefined;
+  end_at?: string | null;
 }
 export interface VisitorsTrafficSourcesParams extends BaseParams {
   resolved_name: 'VisitorsTrafficSourcesWidget';
@@ -100,8 +98,8 @@ export interface VisitorsTrafficSourcesParams extends BaseParams {
 
 export interface GenderProps {
   project_id?: string;
-  startAtMoment?: Moment | null | undefined;
-  endAtMoment?: Moment | null;
+  start_at?: string | null | undefined;
+  end_at?: string | null;
   group_id?: string | null;
 }
 export interface GenderParams extends BaseParams {
@@ -111,8 +109,8 @@ export interface GenderParams extends BaseParams {
 
 export interface AgeProps {
   project_id?: string;
-  startAtMoment?: Moment | null | undefined;
-  endAtMoment?: Moment | null;
+  start_at?: string | null | undefined;
+  end_at?: string | null;
   group_id?: string | null;
 }
 export interface AgeParams extends BaseParams {
diff --git a/front/app/api/graph_data_units/useGraphDataUnitsLive.ts b/front/app/api/graph_data_units/useGraphDataUnitsLive.ts
index 100d83dcc27a..8f78b273830f 100644
--- a/front/app/api/graph_data_units/useGraphDataUnitsLive.ts
+++ b/front/app/api/graph_data_units/useGraphDataUnitsLive.ts
@@ -8,21 +8,13 @@ import fetcher, { BaseResponseData } from 'utils/cl-react-query/fetcher';
 import graphDataUnitKeys from './keys';
 import { ParametersLive, Options } from './requestTypes';
 
-const fetchGraphDataUnitsLive = <Response extends BaseResponseData>({
-  resolved_name,
-  props,
-}: ParametersLive) => {
+const fetchGraphDataUnitsLive = <Response extends BaseResponseData>(
+  queryParams: ParametersLive
+) => {
   return fetcher<Response>({
     path: `/reports/graph_data_units/live`,
     action: 'get',
-    queryParams: {
-      resolved_name,
-      props: {
-        ...props,
-        start_at: (props as any).startAtMoment?.format('yyyy-MM-DD'),
-        end_at: (props as any).endAtMoment?.format('yyyy-MM-DD'),
-      },
-    },
+    queryParams,
   });
 };
 
diff --git a/front/app/api/graph_data_units/utils.ts b/front/app/api/graph_data_units/utils.ts
new file mode 100644
index 000000000000..fe04d1f12164
--- /dev/null
+++ b/front/app/api/graph_data_units/utils.ts
@@ -0,0 +1,5 @@
+import { Moment } from 'moment';
+
+export const formatMoment = (moment: Moment | null | undefined) => {
+  return moment?.format('yyyy-MM-DD');
+};
diff --git a/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts b/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
index 446292deb6a4..2ddb67aeaae3 100644
--- a/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
@@ -1,6 +1,7 @@
 import { useMemo, useState } from 'react';
 
 import { useCommentsByTimeLive } from 'api/graph_data_units';
+import { formatMoment } from 'api/graph_data_units/utils';
 
 import { getFormattedNumbers } from 'components/admin/GraphCards/_utils/parse';
 
@@ -20,8 +21,8 @@ export default function useCommentsByTime({
   const { data: analytics } = useCommentsByTimeLive(
     {
       project_id: projectId,
-      startAtMoment,
-      endAtMoment,
+      start_at: formatMoment(startAtMoment),
+      end_at: formatMoment(endAtMoment),
       resolution,
     },
     {
diff --git a/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts b/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
index 4aeea2b2a497..0e99181daeb7 100644
--- a/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
@@ -1,6 +1,7 @@
 import { useMemo, useState } from 'react';
 
 import { usePostsByTimeLive } from 'api/graph_data_units';
+import { formatMoment } from 'api/graph_data_units/utils';
 
 import { getFormattedNumbers } from 'components/admin/GraphCards/_utils/parse';
 
@@ -21,8 +22,8 @@ export default function usePostsByTime({
   const { data: analytics } = usePostsByTimeLive(
     {
       project_id: projectId,
-      startAtMoment,
-      endAtMoment,
+      start_at: formatMoment(startAtMoment),
+      end_at: formatMoment(endAtMoment),
       resolution,
     },
     {
diff --git a/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts b/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
index 78d0ec84368f..7c2b45b25130 100644
--- a/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
@@ -1,6 +1,7 @@
 import { useMemo, useState } from 'react';
 
 import { useReactionsByTimeLive } from 'api/graph_data_units';
+import { formatMoment } from 'api/graph_data_units/utils';
 
 import { getFormattedNumbers } from 'components/admin/GraphCards/_utils/parse';
 
@@ -22,8 +23,8 @@ export default function useReactionsByTime({
   const { data: analytics } = useReactionsByTimeLive(
     {
       project_id: projectId,
-      startAtMoment,
-      endAtMoment,
+      start_at: formatMoment(startAtMoment),
+      end_at: formatMoment(endAtMoment),
       resolution,
     },
     {
diff --git a/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts b/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
index fc24a7e34253..5b3b63055ea6 100644
--- a/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
+++ b/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
@@ -1,10 +1,14 @@
 import { useVisitorsTrafficSourcesLive } from 'api/graph_data_units';
+import { formatMoment } from 'api/graph_data_units/utils';
+
+import { ProjectId, Dates } from 'components/admin/GraphCards/typings';
 
 import { useIntl } from 'utils/cl-intl';
 
 import { parsePieData, parseExcelData } from './parse';
 import { getTranslations } from './translations';
-import { QueryParameters } from './typings';
+
+type QueryParameters = ProjectId & Dates;
 
 export default function useVisitorsReferrerTypes({
   projectId,
@@ -13,8 +17,8 @@ export default function useVisitorsReferrerTypes({
 }: QueryParameters) {
   const { data: analytics } = useVisitorsTrafficSourcesLive({
     project_id: projectId,
-    startAtMoment,
-    endAtMoment,
+    start_at: formatMoment(startAtMoment),
+    end_at: formatMoment(endAtMoment),
   });
 
   const { formatMessage } = useIntl();
diff --git a/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/typings.ts b/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/typings.ts
index d3405774e76a..beb53c5caf11 100644
--- a/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/typings.ts
+++ b/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/typings.ts
@@ -1,7 +1,3 @@
-import { ProjectId, Dates } from '../../typings';
-
-export type QueryParameters = ProjectId & Dates;
-
 export interface TrafficSourcesRow {
   count: number;
   'dimension_referrer_type.id': string;
diff --git a/front/app/components/admin/GraphCards/typings.ts b/front/app/components/admin/GraphCards/typings.ts
index 322d221b2177..db0cca4bd5f1 100644
--- a/front/app/components/admin/GraphCards/typings.ts
+++ b/front/app/components/admin/GraphCards/typings.ts
@@ -12,6 +12,11 @@ export interface Dates {
   endAtMoment: Moment | null;
 }
 
+export interface DatesStrings {
+  startAt?: string | null;
+  endAt?: string | null;
+}
+
 export interface Resolution {
   resolution: IResolution;
 }
diff --git a/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx b/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
index 270c757f9707..e0987c46aad5 100644
--- a/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
+++ b/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
@@ -4,6 +4,7 @@ import { Box } from '@citizenlab/cl2-component-library';
 import moment from 'moment';
 
 import { useUsersByAgeLive } from 'api/graph_data_units';
+import { formatMoment } from 'api/graph_data_units/utils';
 import { usersByBirthyearXlsxEndpoint } from 'api/users_by_birthyear/util';
 
 import messages from 'containers/Admin/dashboard/messages';
@@ -31,8 +32,8 @@ const AgeChart = ({
   const graphRef = useRef();
 
   const { data: usersByBirthyear } = useUsersByAgeLive({
-    startAtMoment: startAt ? moment(startAt) : null,
-    endAtMoment: endAt ? moment(endAt) : null,
+    start_at: startAt ? formatMoment(moment(startAt)) : null,
+    end_at: endAt ? formatMoment(moment(endAt)) : null,
     group_id: currentGroupFilter,
   });
   const ageSerie = convertToGraphFormat(usersByBirthyear, formatMessage);
diff --git a/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx b/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
index c8820b27343a..9979e727292f 100644
--- a/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
+++ b/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
@@ -3,6 +3,7 @@ import React, { useRef } from 'react';
 import moment from 'moment';
 
 import { useUsersByGenderLive } from 'api/graph_data_units';
+import { formatMoment } from 'api/graph_data_units/utils';
 import { usersByGenderXlsxEndpoint } from 'api/users_by_gender/util';
 
 import messages from 'containers/Admin/dashboard/messages';
@@ -30,8 +31,8 @@ const GenderChart = ({
   const { formatMessage } = useIntl();
 
   const { data: usersByGender } = useUsersByGenderLive({
-    startAtMoment: startAt ? moment(startAt) : null,
-    endAtMoment: endAt ? moment(endAt) : null,
+    start_at: startAt ? formatMoment(moment(startAt)) : null,
+    end_at: endAt ? formatMoment(moment(endAt)) : null,
     group_id: currentGroupFilter,
   });
   const serie = convertToGraphFormat(usersByGender, formatMessage);
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/ActiveUsersCard.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/ActiveUsersCard.tsx
index 27aa20912092..eaee550b6e6c 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/ActiveUsersCard.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/ActiveUsersCard.tsx
@@ -1,12 +1,13 @@
 import React from 'react';
 
 import { Box } from '@citizenlab/cl2-component-library';
+import moment from 'moment';
 
 import useLayout from 'containers/Admin/reporting/hooks/useLayout';
 
 import {
   ProjectId,
-  Dates,
+  DatesStrings,
   Resolution,
 } from 'components/admin/GraphCards/typings';
 import Statistic from 'components/admin/Graphs/Statistic';
@@ -19,20 +20,15 @@ import messages from '../messages';
 import Chart from './Chart';
 import useActiveUsers from './useActiveUsers';
 
-type Props = ProjectId & Dates & Resolution;
+type Props = ProjectId & DatesStrings & Resolution;
 
-const ActiveUsers = ({
-  projectId,
-  startAtMoment,
-  endAtMoment,
-  resolution,
-}: Props) => {
+const ActiveUsers = ({ projectId, startAt, endAt, resolution }: Props) => {
   const { formatMessage } = useIntl();
 
   const { currentResolution, stats, timeSeries } = useActiveUsers({
     projectId,
-    startAtMoment,
-    endAtMoment,
+    startAt,
+    endAt,
     resolution,
   });
 
@@ -67,8 +63,8 @@ const ActiveUsers = ({
           <Box pt="8px" width="100%" maxWidth="800px">
             <Chart
               timeSeries={timeSeries}
-              startAtMoment={startAtMoment}
-              endAtMoment={endAtMoment}
+              startAtMoment={moment(startAt)}
+              endAtMoment={moment(endAt)}
               resolution={currentResolution}
               layout={layout}
             />
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/index.tsx
index d2d31da814cb..111be1faeedf 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/index.tsx
@@ -1,9 +1,5 @@
 import React from 'react';
 
-import moment from 'moment';
-
-import { IResolution } from 'components/admin/ResolutionControl';
-
 import Card from '../../_shared/Card';
 import messages from '../messages';
 import { ChartWidgetProps } from '../typings';
@@ -11,24 +7,10 @@ import { ChartWidgetProps } from '../typings';
 import ActiveUsers from './ActiveUsersCard';
 import ChartWidgetSettings from './ChartWidgetSettings';
 
-const ActiveUsersWidget = ({
-  title,
-  projectId,
-  startAt,
-  endAt,
-}: ChartWidgetProps) => {
-  const resolution: IResolution = 'month';
-
-  const analyticsChartProps = {
-    startAtMoment: startAt ? moment(startAt) : null,
-    endAtMoment: endAt ? moment(endAt) : null,
-    projectId,
-    resolution,
-  };
-
+const ActiveUsersWidget = ({ title, ...props }: ChartWidgetProps) => {
   return (
     <Card title={title} pagebreak>
-      <ActiveUsers {...analyticsChartProps} />
+      <ActiveUsers {...props} resolution="month" />
     </Card>
   );
 };
@@ -37,8 +19,8 @@ ActiveUsersWidget.craft = {
   props: {
     title: {},
     projectId: undefined,
-    startAtMoment: undefined,
-    endAtMoment: null,
+    startAt: undefined,
+    endAt: null,
   },
   related: {
     settings: ChartWidgetSettings,
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/index.ts
index a76092e3f499..bd33c7cdbc56 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/index.ts
@@ -1,5 +1,7 @@
 import { useMemo, useState } from 'react';
 
+import moment from 'moment';
+
 import { useActiveUsers as useActiveUsersData } from 'api/graph_data_units';
 
 import { parseTimeSeries, parseStats } from './parse';
@@ -7,8 +9,8 @@ import { QueryParameters } from './typings';
 
 export default function useActiveUsers({
   projectId,
-  startAtMoment,
-  endAtMoment,
+  startAt,
+  endAt,
   resolution,
 }: QueryParameters) {
   const [currentResolution, setCurrentResolution] = useState(resolution);
@@ -16,12 +18,11 @@ export default function useActiveUsers({
   const analytics = useActiveUsersData(
     {
       project_id: projectId,
-      startAtMoment,
-      endAtMoment,
+      start_at: startAt,
+      end_at: endAt,
       resolution,
     },
     {
-      // enabled: true,
       onSuccess: () => setCurrentResolution(resolution),
     }
   );
@@ -33,12 +34,12 @@ export default function useActiveUsers({
       analytics?.data
         ? parseTimeSeries(
             analytics.data.attributes[0],
-            startAtMoment,
-            endAtMoment,
+            moment(startAt),
+            moment(endAt),
             currentResolution
           )
         : null,
-    [analytics?.data, startAtMoment, endAtMoment, currentResolution]
+    [analytics?.data, startAt, endAt, currentResolution]
   );
 
   return { timeSeries, stats, currentResolution };
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/typings.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/typings.ts
index 380a5bb90e88..34883ba145bc 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/typings.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ActiveUsersWidget/useActiveUsers/typings.ts
@@ -1,10 +1,10 @@
 import {
   ProjectId,
-  Dates,
+  DatesStrings,
   Resolution,
 } from 'components/admin/GraphCards/typings';
 
-export type QueryParameters = ProjectId & Dates & Resolution;
+export type QueryParameters = ProjectId & DatesStrings & Resolution;
 
 export interface TimeSeriesResponseRow extends ActiveUsersRow {
   first_dimension_date_created_date: string;
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/AgeCard.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/AgeCard.tsx
index 6fe782f99b22..8532796b01a2 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/AgeCard.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/AgeCard.tsx
@@ -7,7 +7,11 @@ import { useUsersByAge } from 'api/graph_data_units';
 import convertToGraphFormat from 'containers/Admin/dashboard/users/Charts/AgeChart/convertToGraphFormat';
 import useLayout from 'containers/Admin/reporting/hooks/useLayout';
 
-import { ProjectId, Dates, Layout } from 'components/admin/GraphCards/typings';
+import {
+  ProjectId,
+  DatesStrings,
+  Layout,
+} from 'components/admin/GraphCards/typings';
 import BarChart from 'components/admin/Graphs/BarChart';
 import { Margin } from 'components/admin/Graphs/typings';
 
@@ -27,13 +31,13 @@ const MARGINS: Record<Layout, Margin | undefined> = {
   },
 };
 
-type Props = ProjectId & Dates;
+type Props = ProjectId & DatesStrings;
 
-const AgeCard = ({ startAtMoment, endAtMoment, projectId }: Props) => {
+const AgeCard = ({ startAt, endAt, projectId }: Props) => {
   const usersByBirthyear = useUsersByAge({
     project_id: projectId,
-    startAtMoment,
-    endAtMoment,
+    start_at: startAt,
+    end_at: endAt,
   });
   const { formatMessage } = useIntl();
 
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/index.tsx
index d26c0158f3ea..9fe6616f5c15 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/AgeWidget/index.tsx
@@ -1,7 +1,5 @@
 import React from 'react';
 
-import moment from 'moment';
-
 import Card from '../../_shared/Card';
 import ChartWidgetSettings from '../_shared/ChartWidgetSettings';
 import messages from '../messages';
@@ -9,13 +7,7 @@ import { ChartWidgetProps } from '../typings';
 
 import AgeCard from './AgeCard';
 
-const AgeWidget = ({ title, projectId, startAt, endAt }: ChartWidgetProps) => {
-  const props = {
-    startAtMoment: startAt ? moment(startAt) : null,
-    endAtMoment: endAt ? moment(endAt) : null,
-    projectId,
-  };
-
+const AgeWidget = ({ title, ...props }: ChartWidgetProps) => {
   return (
     <Card title={title} pagebreak>
       <AgeCard {...props} />
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/CommentsByTimeCard.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/CommentsByTimeCard.tsx
index 976784acbed1..4057a771c92a 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/CommentsByTimeCard.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/CommentsByTimeCard.tsx
@@ -1,11 +1,12 @@
 import React from 'react';
 
 import { Box } from '@citizenlab/cl2-component-library';
+import moment from 'moment';
 
 import Chart from 'components/admin/GraphCards/CommentsByTimeCard/Chart';
 import {
   ProjectId,
-  Dates,
+  DatesStrings,
   Resolution,
 } from 'components/admin/GraphCards/typings';
 
@@ -16,18 +17,13 @@ import messages from '../messages';
 
 import useCommentsByTime from './useCommentsByTime';
 
-type Props = ProjectId & Dates & Resolution;
+type Props = ProjectId & DatesStrings & Resolution;
 
-const CommentsByTime = ({
-  projectId,
-  startAtMoment,
-  endAtMoment,
-  resolution,
-}: Props) => {
+const CommentsByTime = ({ projectId, startAt, endAt, resolution }: Props) => {
   const { currentResolution, timeSeries } = useCommentsByTime({
     projectId,
-    startAtMoment,
-    endAtMoment,
+    startAt,
+    endAt,
     resolution,
   });
 
@@ -45,8 +41,8 @@ const CommentsByTime = ({
     >
       <Chart
         timeSeries={timeSeries}
-        startAtMoment={startAtMoment}
-        endAtMoment={endAtMoment}
+        startAtMoment={moment(startAt)}
+        endAtMoment={moment(endAt)}
         resolution={currentResolution}
       />
     </Box>
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/index.tsx
index f10b91532bf2..2852fb4ae8ab 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/index.tsx
@@ -1,34 +1,17 @@
 import React from 'react';
 
-import moment from 'moment';
-
 import messages from 'containers/Admin/dashboard/messages';
 
-import { IResolution } from 'components/admin/ResolutionControl';
-
 import Card from '../../_shared/Card';
 import ChartWidgetSettings from '../_shared/ChartWidgetSettings';
 import { ChartWidgetProps } from '../typings';
 
 import CommentsByTimeCard from './CommentsByTimeCard';
 
-const CommentsByTimeWidget = ({
-  title,
-  projectId,
-  startAt,
-  endAt,
-}: ChartWidgetProps) => {
-  const resolution: IResolution = 'month';
-  const analyticsChartProps = {
-    startAtMoment: startAt ? moment(startAt) : null,
-    endAtMoment: endAt ? moment(endAt) : null,
-    projectId,
-    resolution,
-  };
-
+const CommentsByTimeWidget = ({ title, ...props }: ChartWidgetProps) => {
   return (
     <Card title={title} className="e2e-comments-by-time-widget" pagebreak>
-      <CommentsByTimeCard {...analyticsChartProps} />
+      <CommentsByTimeCard {...props} resolution="month" />
     </Card>
   );
 };
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/useCommentsByTime/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/useCommentsByTime/index.ts
index 40cddb042895..d131267a9951 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/useCommentsByTime/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/CommentsByTimeWidget/useCommentsByTime/index.ts
@@ -1,14 +1,22 @@
 import { useMemo, useState } from 'react';
 
+import moment from 'moment';
+
 import { useCommentsByTime as useCommentsByTimeData } from 'api/graph_data_units';
 
 import { parseTimeSeries } from 'components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/parse';
-import { QueryParameters } from 'components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/typings';
+import {
+  ProjectId,
+  DatesStrings,
+  Resolution,
+} from 'components/admin/GraphCards/typings';
+
+type QueryParameters = ProjectId & DatesStrings & Resolution;
 
 export default function useCommentsByTime({
   projectId,
-  startAtMoment,
-  endAtMoment,
+  startAt,
+  endAt,
   resolution,
 }: QueryParameters) {
   const [currentResolution, setCurrentResolution] = useState(resolution);
@@ -16,8 +24,8 @@ export default function useCommentsByTime({
   const dataUnits = useCommentsByTimeData(
     {
       project_id: projectId,
-      startAtMoment,
-      endAtMoment,
+      start_at: startAt,
+      end_at: endAt,
       resolution,
     },
     {
@@ -30,13 +38,13 @@ export default function useCommentsByTime({
       dataUnits?.data
         ? parseTimeSeries(
             dataUnits.data.attributes[0],
-            startAtMoment,
-            endAtMoment,
+            moment(startAt),
+            moment(endAt),
             currentResolution,
             dataUnits.data.attributes[1]
           )
         : null,
-    [dataUnits?.data, startAtMoment, endAtMoment, currentResolution]
+    [dataUnits?.data, startAt, endAt, currentResolution]
   );
 
   return { currentResolution, timeSeries };
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/GenderCard.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/GenderCard.tsx
index 856bb8369bd5..b066e285ae69 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/GenderCard.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/GenderCard.tsx
@@ -7,7 +7,7 @@ import { useUsersByGender } from 'api/graph_data_units';
 import convertToGraphFormat from 'containers/Admin/dashboard/users/Charts/GenderChart/convertToGraphFormat';
 import useLayout from 'containers/Admin/reporting/hooks/useLayout';
 
-import { ProjectId, Dates } from 'components/admin/GraphCards/typings';
+import { ProjectId, DatesStrings } from 'components/admin/GraphCards/typings';
 
 import { useIntl } from 'utils/cl-intl';
 import { isNilOrError } from 'utils/helperUtils';
@@ -18,13 +18,13 @@ import { serieHasValues } from '../utils';
 
 import Chart from './Chart';
 
-type Props = ProjectId & Dates;
+type Props = ProjectId & DatesStrings;
 
-const GenderCard = ({ startAtMoment, endAtMoment, projectId }: Props) => {
+const GenderCard = ({ startAt, endAt, projectId }: Props) => {
   const usersByGender = useUsersByGender({
     project_id: projectId,
-    startAtMoment,
-    endAtMoment,
+    start_at: startAt,
+    end_at: endAt,
   });
   const { formatMessage } = useIntl();
 
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/index.tsx
index b23f3c2c6366..f5733458dd34 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/GenderWidget/index.tsx
@@ -1,7 +1,5 @@
 import React from 'react';
 
-import moment from 'moment';
-
 import Card from '../../_shared/Card';
 import ChartWidgetSettings from '../_shared/ChartWidgetSettings';
 import messages from '../messages';
@@ -9,18 +7,7 @@ import { ChartWidgetProps } from '../typings';
 
 import GenderCard from './GenderCard';
 
-const GenderWidget = ({
-  title,
-  projectId,
-  startAt,
-  endAt,
-}: ChartWidgetProps) => {
-  const props = {
-    startAtMoment: startAt ? moment(startAt) : null,
-    endAtMoment: endAt ? moment(endAt) : null,
-    projectId,
-  };
-
+const GenderWidget = ({ title, ...props }: ChartWidgetProps) => {
   return (
     <Card title={title} pagebreak>
       <GenderCard {...props} />
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/PostsByTimeCard.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/PostsByTimeCard.tsx
index 6d2af4a3d203..4d4e9f99f78a 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/PostsByTimeCard.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/PostsByTimeCard.tsx
@@ -1,11 +1,12 @@
 import React from 'react';
 
 import { Box } from '@citizenlab/cl2-component-library';
+import moment from 'moment';
 
 import Chart from 'components/admin/GraphCards/PostsByTimeCard/Chart';
 import {
   ProjectId,
-  Dates,
+  DatesStrings,
   Resolution,
 } from 'components/admin/GraphCards/typings';
 
@@ -16,18 +17,13 @@ import messages from '../messages';
 
 import usePostsByTime from './usePostsByTime';
 
-type Props = ProjectId & Dates & Resolution;
+type Props = ProjectId & DatesStrings & Resolution;
 
-const PostsByTime = ({
-  projectId,
-  startAtMoment,
-  endAtMoment,
-  resolution,
-}: Props) => {
+const PostsByTime = ({ projectId, startAt, endAt, resolution }: Props) => {
   const { currentResolution, timeSeries } = usePostsByTime({
     projectId,
-    startAtMoment,
-    endAtMoment,
+    startAt,
+    endAt,
     resolution,
   });
 
@@ -45,8 +41,8 @@ const PostsByTime = ({
     >
       <Chart
         timeSeries={timeSeries}
-        startAtMoment={startAtMoment}
-        endAtMoment={endAtMoment}
+        startAtMoment={moment(startAt)}
+        endAtMoment={moment(endAt)}
         resolution={currentResolution}
       />
     </Box>
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/index.tsx
index 732f6f2fc04e..c39688de6f9d 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/index.tsx
@@ -1,34 +1,17 @@
 import React from 'react';
 
-import moment from 'moment';
-
 import messages from 'containers/Admin/dashboard/messages';
 
-import { IResolution } from 'components/admin/ResolutionControl';
-
 import Card from '../../_shared/Card';
 import ChartWidgetSettings from '../_shared/ChartWidgetSettings';
 import { ChartWidgetProps } from '../typings';
 
 import PostsByTimeCard from './PostsByTimeCard';
 
-const PostsByTimeWidget = ({
-  title,
-  projectId,
-  startAt,
-  endAt,
-}: ChartWidgetProps) => {
-  const resolution: IResolution = 'month';
-  const analyticsChartProps = {
-    startAtMoment: startAt ? moment(startAt) : null,
-    endAtMoment: endAt ? moment(endAt) : null,
-    projectId,
-    resolution,
-  };
-
+const PostsByTimeWidget = ({ title, ...props }: ChartWidgetProps) => {
   return (
     <Card title={title} pagebreak>
-      <PostsByTimeCard {...analyticsChartProps} />
+      <PostsByTimeCard {...props} resolution="month" />
     </Card>
   );
 };
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/usePostsByTime/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/usePostsByTime/index.ts
index 503364aeeb15..39b919eeda07 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/usePostsByTime/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/PostsByTimeWidget/usePostsByTime/index.ts
@@ -1,22 +1,30 @@
 import { useMemo, useState } from 'react';
 
+import moment from 'moment';
+
 import { usePostsByTime as usePostsByTimeData } from 'api/graph_data_units';
 
 import { parseTimeSeries } from 'components/admin/GraphCards/PostsByTimeCard/usePostsByTime/parse';
-import { QueryParameters } from 'components/admin/GraphCards/PostsByTimeCard/usePostsByTime/typings';
+import {
+  ProjectId,
+  DatesStrings,
+  Resolution,
+} from 'components/admin/GraphCards/typings';
+
+type QueryParameters = ProjectId & DatesStrings & Resolution;
 
 export default function usePostsByTime({
   projectId,
-  startAtMoment,
-  endAtMoment,
+  startAt,
+  endAt,
   resolution,
 }: QueryParameters) {
   const [currentResolution] = useState(resolution);
 
   const analytics = usePostsByTimeData({
     project_id: projectId,
-    startAtMoment,
-    endAtMoment,
+    start_at: startAt,
+    end_at: endAt,
     resolution,
   });
 
@@ -25,13 +33,13 @@ export default function usePostsByTime({
       analytics?.data
         ? parseTimeSeries(
             analytics.data.attributes[0],
-            startAtMoment,
-            endAtMoment,
+            moment(startAt),
+            moment(endAt),
             currentResolution,
             analytics.data.attributes[1]
           )
         : null,
-    [analytics?.data, startAtMoment, endAtMoment, currentResolution]
+    [analytics?.data, startAt, endAt, currentResolution]
   );
 
   return { currentResolution, timeSeries };
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/ReactionsByTimeCard.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/ReactionsByTimeCard.tsx
index adb4fbbf4567..46fd178c228f 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/ReactionsByTimeCard.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/ReactionsByTimeCard.tsx
@@ -1,11 +1,12 @@
 import React from 'react';
 
 import { Box } from '@citizenlab/cl2-component-library';
+import moment from 'moment';
 
 import Chart from 'components/admin/GraphCards/ReactionsByTimeCard/Chart';
 import {
   ProjectId,
-  Dates,
+  DatesStrings,
   Resolution,
 } from 'components/admin/GraphCards/typings';
 
@@ -16,18 +17,13 @@ import messages from '../messages';
 
 import useReactionsByTime from './useReactionsByTime';
 
-type Props = ProjectId & Dates & Resolution;
+type Props = ProjectId & DatesStrings & Resolution;
 
-const ReactionsByTime = ({
-  projectId,
-  startAtMoment,
-  endAtMoment,
-  resolution,
-}: Props) => {
+const ReactionsByTime = ({ projectId, startAt, endAt, resolution }: Props) => {
   const { currentResolution, timeSeries } = useReactionsByTime({
     projectId,
-    startAtMoment,
-    endAtMoment,
+    startAt,
+    endAt,
     resolution,
   });
 
@@ -45,8 +41,8 @@ const ReactionsByTime = ({
     >
       <Chart
         timeSeries={timeSeries}
-        startAtMoment={startAtMoment}
-        endAtMoment={endAtMoment}
+        startAtMoment={moment(startAt)}
+        endAtMoment={moment(endAt)}
         resolution={currentResolution}
       />
     </Box>
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/index.tsx
index 9cbf00027ad3..9c39b00ad078 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/index.tsx
@@ -1,34 +1,17 @@
 import React from 'react';
 
-import moment from 'moment';
-
 import messages from 'containers/Admin/dashboard/messages';
 
-import { IResolution } from 'components/admin/ResolutionControl';
-
 import Card from '../../_shared/Card';
 import ChartWidgetSettings from '../_shared/ChartWidgetSettings';
 import { ChartWidgetProps } from '../typings';
 
 import ReactionsByTimeCard from './ReactionsByTimeCard';
 
-const ReactionsByTimeWidget = ({
-  title,
-  projectId,
-  startAt,
-  endAt,
-}: ChartWidgetProps) => {
-  const resolution: IResolution = 'month';
-  const analyticsChartProps = {
-    startAtMoment: startAt ? moment(startAt) : null,
-    endAtMoment: endAt ? moment(endAt) : null,
-    projectId,
-    resolution,
-  };
-
+const ReactionsByTimeWidget = ({ title, ...props }: ChartWidgetProps) => {
   return (
     <Card title={title} pagebreak>
-      <ReactionsByTimeCard {...analyticsChartProps} />
+      <ReactionsByTimeCard {...props} resolution="month" />
     </Card>
   );
 };
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/useReactionsByTime/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/useReactionsByTime/index.tsx
index 45623827ea43..d4d7aba9bedd 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/useReactionsByTime/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/ReactionsByTimeWidget/useReactionsByTime/index.tsx
@@ -1,22 +1,30 @@
 import { useMemo, useState } from 'react';
 
-import { useReactionsByTime } from 'api/graph_data_units';
+import moment from 'moment';
+
+import { useReactionsByTime as useReactionsByTimeData } from 'api/graph_data_units';
 
 import { parseTimeSeries } from 'components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/parse';
-import { QueryParameters } from 'components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/typings';
+import {
+  ProjectId,
+  DatesStrings,
+  Resolution,
+} from 'components/admin/GraphCards/typings';
+
+type QueryParameters = ProjectId & DatesStrings & Resolution;
 
-export default function useReactionsByTime123({
+export default function useReactionsByTime({
   projectId,
-  startAtMoment,
-  endAtMoment,
+  startAt,
+  endAt,
   resolution,
 }: QueryParameters) {
   const [currentResolution] = useState(resolution);
 
-  const analytics = useReactionsByTime({
+  const analytics = useReactionsByTimeData({
     project_id: projectId,
-    startAtMoment,
-    endAtMoment,
+    start_at: startAt,
+    end_at: endAt,
     resolution,
   });
 
@@ -25,13 +33,13 @@ export default function useReactionsByTime123({
       analytics?.data
         ? parseTimeSeries(
             analytics.data.attributes[0],
-            startAtMoment,
-            endAtMoment,
+            moment(startAt),
+            moment(endAt),
             currentResolution,
             analytics.data.attributes[1]
           )
         : null,
-    [analytics?.data, startAtMoment, endAtMoment, currentResolution]
+    [analytics?.data, startAt, endAt, currentResolution]
   );
 
   return { currentResolution, timeSeries };
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/VisitorTrafficSourcesCard.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/VisitorTrafficSourcesCard.tsx
index 6a274602b6f2..b4a73264fca8 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/VisitorTrafficSourcesCard.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/VisitorTrafficSourcesCard.tsx
@@ -4,7 +4,7 @@ import { Box } from '@citizenlab/cl2-component-library';
 
 import useLayout from 'containers/Admin/reporting/hooks/useLayout';
 
-import { ProjectId, Dates } from 'components/admin/GraphCards/typings';
+import { ProjectId, DatesStrings } from 'components/admin/GraphCards/typings';
 
 import { isNilOrError } from 'utils/helperUtils';
 
@@ -14,17 +14,13 @@ import messages from '../messages';
 import Chart from './Chart';
 import useVisitorReferrerTypes from './useVisitorReferrerTypes';
 
-type Props = ProjectId & Dates;
+type Props = ProjectId & DatesStrings;
 
-const VisitorsTrafficSourcesCard = ({
-  projectId,
-  startAtMoment,
-  endAtMoment,
-}: Props) => {
+const VisitorsTrafficSourcesCard = ({ projectId, startAt, endAt }: Props) => {
   const { pieData } = useVisitorReferrerTypes({
     projectId,
-    startAtMoment,
-    endAtMoment,
+    startAt,
+    endAt,
   });
   const layout = useLayout();
 
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/index.tsx
index 54cd2291e899..1ac9483f1c14 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/index.tsx
@@ -1,9 +1,5 @@
 import React from 'react';
 
-import moment from 'moment';
-
-import { IResolution } from 'components/admin/ResolutionControl';
-
 import Card from '../../_shared/Card';
 import ChartWidgetSettings from '../_shared/ChartWidgetSettings';
 import messages from '../messages';
@@ -13,22 +9,11 @@ import VisitorsTrafficSourcesCard from './VisitorTrafficSourcesCard';
 
 const VisitorsTrafficSourcesWidget = ({
   title,
-  projectId,
-  startAt,
-  endAt,
+  ...props
 }: ChartWidgetProps) => {
-  const resolution: IResolution = 'month';
-  const analyticsChartProps = {
-    startAtMoment: startAt ? moment(startAt) : null,
-    endAtMoment: endAt ? moment(endAt) : null,
-    projectId,
-    resolution,
-    title,
-  };
-
   return (
     <Card title={title} pagebreak>
-      <VisitorsTrafficSourcesCard {...analyticsChartProps} />
+      <VisitorsTrafficSourcesCard {...props} />
     </Card>
   );
 };
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/useVisitorReferrerTypes/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/useVisitorReferrerTypes/index.ts
index 2f9ae3129eec..471befb1fd2f 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/useVisitorReferrerTypes/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsTrafficSourcesWidget/useVisitorReferrerTypes/index.ts
@@ -1,20 +1,22 @@
 import { useVisitorsTrafficSources } from 'api/graph_data_units';
 
+import { ProjectId, DatesStrings } from 'components/admin/GraphCards/typings';
 import { parsePieData } from 'components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/parse';
 import { getTranslations } from 'components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/translations';
-import { QueryParameters } from 'components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/typings';
 
 import { useIntl } from 'utils/cl-intl';
 
+type QueryParameters = ProjectId & DatesStrings;
+
 export default function useVisitorsReferrerTypes({
   projectId,
-  startAtMoment,
-  endAtMoment,
+  startAt,
+  endAt,
 }: QueryParameters) {
   const analytics = useVisitorsTrafficSources({
     project_id: projectId,
-    startAtMoment,
-    endAtMoment,
+    start_at: startAt,
+    end_at: endAt,
   });
 
   const { formatMessage } = useIntl();
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/VisitorsCard.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/VisitorsCard.tsx
index 404d038b56ee..6fe02a1ac1ae 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/VisitorsCard.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/VisitorsCard.tsx
@@ -1,12 +1,13 @@
 import React from 'react';
 
 import { Box } from '@citizenlab/cl2-component-library';
+import moment from 'moment';
 
 import useLayout from 'containers/Admin/reporting/hooks/useLayout';
 
 import {
   ProjectId,
-  Dates,
+  DatesStrings,
   Resolution,
 } from 'components/admin/GraphCards/typings';
 import visitorsCardMessages from 'components/admin/GraphCards/VisitorsCard/messages';
@@ -21,21 +22,16 @@ import messages from '../messages';
 import Chart from './Chart';
 import useVisitors from './useVisitors';
 
-type Props = ProjectId & Dates & Resolution;
+type Props = ProjectId & DatesStrings & Resolution;
 
 // Report specific version of <VisitorsCard/>
-const VisitorsCard = ({
-  projectId,
-  startAtMoment,
-  endAtMoment,
-  resolution,
-}: Props) => {
+const VisitorsCard = ({ projectId, startAt, endAt, resolution }: Props) => {
   const { formatMessage } = useIntl();
 
   const { currentResolution, stats, timeSeries } = useVisitors({
     projectId,
-    startAtMoment,
-    endAtMoment,
+    startAt,
+    endAt,
     resolution,
   });
 
@@ -88,8 +84,8 @@ const VisitorsCard = ({
           >
             <Chart
               timeSeries={timeSeries}
-              startAtMoment={startAtMoment}
-              endAtMoment={endAtMoment}
+              startAtMoment={moment(startAt)}
+              endAtMoment={moment(endAt)}
               resolution={currentResolution}
               layout={layout}
             />
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/index.tsx
index e9cd7392eea2..3166c5a38e1b 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/index.tsx
@@ -1,9 +1,5 @@
 import React from 'react';
 
-import moment from 'moment';
-
-import { IResolution } from 'components/admin/ResolutionControl';
-
 import Card from '../../_shared/Card';
 import ChartWidgetSettings from '../_shared/ChartWidgetSettings';
 import messages from '../messages';
@@ -11,24 +7,10 @@ import { ChartWidgetProps } from '../typings';
 
 import VisitorsCard from './VisitorsCard';
 
-const VisitorsWidget = ({
-  title,
-  projectId,
-  startAt,
-  endAt,
-}: ChartWidgetProps) => {
-  const resolution: IResolution = 'month';
-  const analyticsChartProps = {
-    startAtMoment: startAt ? moment(startAt) : null,
-    endAtMoment: endAt ? moment(endAt) : null,
-    projectId,
-    resolution,
-    title,
-  };
-
+const VisitorsWidget = ({ title, ...props }: ChartWidgetProps) => {
   return (
     <Card title={title} pagebreak>
-      <VisitorsCard {...analyticsChartProps} />
+      <VisitorsCard {...props} resolution="month" />
     </Card>
   );
 };
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/index.ts
index 071e5a677a59..50603a19833e 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/index.ts
@@ -1,5 +1,7 @@
 import { useMemo, useState } from 'react';
 
+import moment from 'moment';
+
 import { useVisitors as useVisitorsData } from 'api/graph_data_units';
 
 import { IResolution } from 'components/admin/ResolutionControl';
@@ -9,8 +11,8 @@ import { QueryParameters } from './typings';
 
 export default function useVisitors({
   projectId,
-  startAtMoment,
-  endAtMoment,
+  startAt,
+  endAt,
   resolution,
 }: QueryParameters) {
   const [currentResolution, setCurrentResolution] =
@@ -19,8 +21,8 @@ export default function useVisitors({
   const analytics = useVisitorsData(
     {
       project_id: projectId,
-      startAtMoment,
-      endAtMoment,
+      start_at: startAt,
+      end_at: endAt,
       resolution,
     },
     {
@@ -35,12 +37,12 @@ export default function useVisitors({
       analytics?.data
         ? parseTimeSeries(
             analytics.data.attributes[1],
-            startAtMoment,
-            endAtMoment,
+            moment(startAt),
+            moment(endAt),
             currentResolution
           )
         : null,
-    [analytics?.data, startAtMoment, endAtMoment, currentResolution]
+    [analytics?.data, startAt, endAt, currentResolution]
   );
 
   return { currentResolution, stats, timeSeries };
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/typings.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/typings.ts
index 12d5b410fa16..a5736609747e 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/typings.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/ChartWidgets/VisitorsWidget/useVisitors/typings.ts
@@ -1,10 +1,10 @@
 import {
   ProjectId,
-  Dates,
+  DatesStrings,
   Resolution,
 } from 'components/admin/GraphCards/typings';
 
-export type QueryParameters = ProjectId & Dates & Resolution;
+export type QueryParameters = ProjectId & DatesStrings & Resolution;
 
 interface BaseRow {
   count: number;

From 93792678897ebdbabb048239d3f958a7adda0192 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Thu, 7 Mar 2024 15:14:38 +0100
Subject: [PATCH 175/282] [TAN-1261] Use simple shared examples in report
 policy spec

---
 .../report_builder/report_policy_spec.rb      | 88 ++++++-------------
 1 file changed, 28 insertions(+), 60 deletions(-)

diff --git a/back/engines/commercial/report_builder/spec/policies/report_builder/report_policy_spec.rb b/back/engines/commercial/report_builder/spec/policies/report_builder/report_policy_spec.rb
index cb41388063b5..3882e16c03a0 100644
--- a/back/engines/commercial/report_builder/spec/policies/report_builder/report_policy_spec.rb
+++ b/back/engines/commercial/report_builder/spec/policies/report_builder/report_policy_spec.rb
@@ -13,16 +13,28 @@
   let_it_be(:current_phase) { create(:phase, project: project, start_at: 1.day.ago, end_at: 1.day.from_now) }
   let_it_be(:future_phase) { create(:phase, project: project, start_at: 2.days.from_now) }
 
-  context 'when user has admin rights' do
-    let_it_be(:all_reports) { create_list(:report, 3) }
-    let_it_be(:report) { all_reports.first }
-    let_it_be(:user) { build(:admin) }
-
+  shared_examples 'permitted everything' do
     it { is_expected.to permit(:show) }
     it { is_expected.to permit(:layout) }
     it { is_expected.to permit(:create) }
     it { is_expected.to permit(:destroy) }
     it { is_expected.to permit(:update) }
+  end
+
+  shared_examples 'not permitted anything' do
+    it { is_expected.not_to permit(:show) }
+    it { is_expected.not_to permit(:layout) }
+    it { is_expected.not_to permit(:create) }
+    it { is_expected.not_to permit(:destroy) }
+    it { is_expected.not_to permit(:update) }
+  end
+
+  context 'when user has admin rights' do
+    let_it_be(:all_reports) { create_list(:report, 3) }
+    let_it_be(:report) { all_reports.first }
+    let_it_be(:user) { build(:admin) }
+
+    it_behaves_like 'permitted everything'
     it { expect(scope.resolve.count).to eq(3) }
   end
 
@@ -33,11 +45,7 @@
 
     context 'when report does not belong to a phase' do
       context 'when user did not create report' do
-        it { is_expected.not_to permit(:show) }
-        it { is_expected.not_to permit(:layout) }
-        it { is_expected.not_to permit(:create) }
-        it { is_expected.not_to permit(:destroy) }
-        it { is_expected.not_to permit(:update) }
+        it_behaves_like 'not permitted anything'
         it { expect(scope.resolve.count).to eq(0) }
       end
 
@@ -96,11 +104,7 @@
           let_it_be(:user) { create(:project_moderator, projects: [project, project2]) }
           let_it_be(:report) { create(:report, owner: user, layout: layout) }
 
-          it { is_expected.to permit(:show) }
-          it { is_expected.to permit(:layout) }
-          it { is_expected.to permit(:create) }
-          it { is_expected.to permit(:destroy) }
-          it { is_expected.to permit(:update) }
+          it_behaves_like 'permitted everything'
           it { expect(scope.resolve.count).to eq(1) }
         end
       end
@@ -129,11 +133,7 @@
           let_it_be(:user) { create(:project_moderator, projects: [project, another_project]) }
           let_it_be(:report) { create(:report, phase: future_phase, layout: layout) }
 
-          it { is_expected.to permit(:show) }
-          it { is_expected.to permit(:layout) }
-          it { is_expected.to permit(:create) }
-          it { is_expected.to permit(:destroy) }
-          it { is_expected.to permit(:update) }
+          it_behaves_like 'permitted everything'
         end
 
         context 'when user can moderate phase, but does not have access to all data in report' do
@@ -151,11 +151,7 @@
           let_it_be(:user) { create(:project_moderator) }
           let_it_be(:report) { create(:report, phase: future_phase, layout: layout) }
 
-          it { is_expected.not_to permit(:show) }
-          it { is_expected.not_to permit(:layout) }
-          it { is_expected.not_to permit(:create) }
-          it { is_expected.not_to permit(:destroy) }
-          it { is_expected.not_to permit(:update) }
+          it_behaves_like 'not permitted anything'
         end
       end
 
@@ -196,11 +192,7 @@
             )
           end
 
-          it { is_expected.not_to permit(:show) }
-          it { is_expected.not_to permit(:layout) }
-          it { is_expected.not_to permit(:create) }
-          it { is_expected.not_to permit(:destroy) }
-          it { is_expected.not_to permit(:update) }
+          it_behaves_like 'not permitted anything'
           it { expect(scope.resolve.count).to eq(0) }
         end
       end
@@ -213,11 +205,7 @@
     context 'when report does not belong to phase' do
       let_it_be(:report) { create(:report) }
 
-      it { is_expected.not_to permit(:show) }
-      it { is_expected.not_to permit(:layout) }
-      it { is_expected.not_to permit(:create) }
-      it { is_expected.not_to permit(:destroy) }
-      it { is_expected.not_to permit(:update) }
+      it_behaves_like 'not permitted anything'
       it { expect { scope.resolve.count }.to raise_error(Pundit::NotAuthorizedError) }
     end
 
@@ -226,11 +214,7 @@
       let_it_be(:phase) { create(:phase, project: project) }
       let_it_be(:report) { create(:report, phase: phase) }
 
-      it { is_expected.not_to permit(:show) }
-      it { is_expected.not_to permit(:layout) }
-      it { is_expected.not_to permit(:create) }
-      it { is_expected.not_to permit(:destroy) }
-      it { is_expected.not_to permit(:update) }
+      it_behaves_like 'not permitted anything'
       it { expect { scope.resolve.count }.to raise_error(Pundit::NotAuthorizedError) }
     end
 
@@ -260,11 +244,7 @@
       context 'phase started and report not visible' do
         let_it_be(:report) { create(:report, phase: current_phase, visible: false) }
 
-        it { is_expected.not_to permit(:show) }
-        it { is_expected.not_to permit(:layout) }
-        it { is_expected.not_to permit(:create) }
-        it { is_expected.not_to permit(:destroy) }
-        it { is_expected.not_to permit(:update) }
+        it_behaves_like 'not permitted anything'
         it { expect { scope.resolve.count }.to raise_error(Pundit::NotAuthorizedError) }
       end
     end
@@ -276,11 +256,7 @@
     context 'when report does not belong to phase' do
       let_it_be(:report) { create(:report) }
 
-      it { is_expected.not_to permit(:show) }
-      it { is_expected.not_to permit(:layout) }
-      it { is_expected.not_to permit(:create) }
-      it { is_expected.not_to permit(:destroy) }
-      it { is_expected.not_to permit(:update) }
+      it_behaves_like 'not permitted anything'
       it { expect { scope.resolve.count }.to raise_error(Pundit::NotAuthorizedError) }
     end
 
@@ -288,11 +264,7 @@
       context 'phase not started' do
         let_it_be(:report) { create(:report, phase: future_phase) }
 
-        it { is_expected.not_to permit(:show) }
-        it { is_expected.not_to permit(:layout) }
-        it { is_expected.not_to permit(:create) }
-        it { is_expected.not_to permit(:destroy) }
-        it { is_expected.not_to permit(:update) }
+        it_behaves_like 'not permitted anything'
         it { expect { scope.resolve.count }.to raise_error(Pundit::NotAuthorizedError) }
       end
 
@@ -310,11 +282,7 @@
       context 'phase started and report not visible' do
         let_it_be(:report) { create(:report, phase: current_phase, visible: false) }
 
-        it { is_expected.not_to permit(:show) }
-        it { is_expected.not_to permit(:layout) }
-        it { is_expected.not_to permit(:create) }
-        it { is_expected.not_to permit(:destroy) }
-        it { is_expected.not_to permit(:update) }
+        it_behaves_like 'not permitted anything'
         it { expect { scope.resolve.count }.to raise_error(Pundit::NotAuthorizedError) }
       end
     end

From 4f455cb2363b865d15571ffe159bab05005a7b2a Mon Sep 17 00:00:00 2001
From: brentguf <brentguf@users.noreply.github.com>
Date: Thu, 7 Mar 2024 15:52:41 +0100
Subject: [PATCH 176/282] Revert to old proposal_page_action E2E

---
 front/cypress/e2e/proposal_page_action.cy.ts | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/cypress/e2e/proposal_page_action.cy.ts b/front/cypress/e2e/proposal_page_action.cy.ts
index a34a4aa0a20e..f82994b1b216 100644
--- a/front/cypress/e2e/proposal_page_action.cy.ts
+++ b/front/cypress/e2e/proposal_page_action.cy.ts
@@ -19,6 +19,8 @@ describe('Initiative show page actions', () => {
           cy.get('#e2e-initiative-show');
           cy.acceptCookies();
 
+          cy.get('#e2e-proposal-vote-button').should('exist');
+          cy.wait(2000);
           cy.get('#e2e-proposal-vote-button').click();
           cy.get('#e2e-authentication-modal').should('exist');
 

From cb5a2ea6aa9f45f76b610694ed1e3efeea24173e Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 17:04:03 +0100
Subject: [PATCH 177/282] New translations en.json (German)

---
 front/app/translations/admin/de-DE.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index f14172e68c19..f3cc556c95ec 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -233,7 +233,7 @@
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupport": "Geben Sie hier den Link zu Ihrem Konveio-Dokument an. Weitere Informationen zum Einrichten von Konveio finden Sie in unserer {supportArticleLink}.",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportArticle": "Support-Artikel",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportPageURL": "https://support.citizenlab.co/en/articles/7946532-embedding-konveio-pdf-documents-for-collecting-feedback",
-  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dies ist in Ihrem aktuellen Plan nicht enthalten. Wenden Sie sich an Ihren Government Success Manager oder Administrator, um es freizuschalten.",
+  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Diese Funktion ist in Ihrer aktuellen Lizenz nicht enthalten. Sprechen Sie mit Ihrer Kundenbetreuerin oder Ihrem Admin, um sie freizuschalten.",
   "app.components.app.containers.AdminPage.ProjectEdit.maxBudgetRequired": "Ein maximales Budget ist erforderlich",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesPerOptionError": "Die maximale Anzahl der Stimmen pro Option muss kleiner oder gleich der Gesamtzahl der Stimmen sein",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesRequired": "Eine maximale Anzahl von Stimmen ist erforderlich",
@@ -2471,7 +2471,7 @@
   "app.modules.navbar.admin.containers.pageHeader": "Seiten & Menü",
   "app.modules.navbar.admin.containers.pageSubtitle": "In Ihrer Navigationsleiste können bis zu fünf Seiten zusätzlich zur Startseite und den Projektseiten angezeigt werden. Sie können Menü-Elemente umbenennen, neu anordnen und neue Seiten mit eigenem Inhalt hinzufügen.",
   "app.modules.project_management.admin.components.permissionsTab": "Zugriffsrechte",
-  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dies ist in Ihrem aktuellen Plan nicht enthalten. Wenden Sie sich an Ihren Government Success Manager oder Administrator, um es freizuschalten.",
+  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Diese Funktion ist in Ihrer aktuellen Lizenz nicht enthalten. Sprechen Sie mit Ihrer Kundenbetreuerin oder Ihrem Admin, um sie freizuschalten.",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupBySurveyQuestion": "Nach Frage gruppieren",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupByUserField": "Nach Nutzer*innenfeld gruppieren",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupMode": "Gruppieren",

From 9abd44c8e3d61ec0100441ccd3ea409d21b105d9 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 17:04:28 +0100
Subject: [PATCH 178/282] New translations en.json (Dutch)

---
 front/app/translations/admin/nl-NL.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index 468412b95524..3e1db7089fa3 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -233,7 +233,7 @@
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupport": "Geef hier de link naar je Konveio-document. Lees ons {supportArticleLink} voor meer informatie over het instellen van Konveio.",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportArticle": "support-artikel",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportPageURL": "https://support.citizenlab.co/en/articles/7946532-embedding-konveio-pdf-documents-for-collecting-feedback",
-  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dit is niet inbegrepen in je huidige plan. Neem contact op met je Government Success Manager of admin om het vrij te geven.",
+  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dit is niet in je huidige abonnement inbegrepen. Neem contact op met je Government Success Manager of platformbeheerder om deze functionaliteit te ontgrendelen.",
   "app.components.app.containers.AdminPage.ProjectEdit.maxBudgetRequired": "Er is een maximumbudget nodig",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesPerOptionError": "Maximum aantal stemmen per optie moet kleiner zijn dan of gelijk aan totaal aantal stemmen",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesRequired": "Er is een maximum aantal stemmen vereist",
@@ -2471,7 +2471,7 @@
   "app.modules.navbar.admin.containers.pageHeader": "Pagina's en menu",
   "app.modules.navbar.admin.containers.pageSubtitle": "Je navigatiebalk kan maximaal vijf pagina's weergeven naast de startpagina en de projectenpagina. Je kunt menu-items een andere naam geven, anders ordenen en nieuwe pagina's toevoegen met je eigen inhoud.",
   "app.modules.project_management.admin.components.permissionsTab": "Toegangsrechten",
-  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dit is niet inbegrepen in je huidige plan. Neem contact op met je Government Success Manager of admin om het vrij te geven.",
+  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dit is niet in je huidige abonnement inbegrepen. Neem contact op met je Government Success Manager of platformbeheerder om deze functionaliteit te ontgrendelen.",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupBySurveyQuestion": "Groepeer per enquêtevraag",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupByUserField": "Groepeer per gebruikersveld",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupMode": "Groepeer modus",

From d5818a1134c63bd92bfda241fec9a150fe28ff35 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 7 Mar 2024 17:12:19 +0000
Subject: [PATCH 179/282] Change report tab banner copy and toggle copy

---
 .../project/information/ReportTab/index.tsx   |  4 ++--
 .../project/information/ReportTab/messages.ts | 22 +++++++++----------
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/front/app/containers/Admin/projects/project/information/ReportTab/index.tsx b/front/app/containers/Admin/projects/project/information/ReportTab/index.tsx
index eda53cb5b2b7..1df7b0f9ff81 100644
--- a/front/app/containers/Admin/projects/project/information/ReportTab/index.tsx
+++ b/front/app/containers/Admin/projects/project/information/ReportTab/index.tsx
@@ -11,6 +11,7 @@ import useUpdateReport from 'api/reports/useUpdateReport';
 import useFeatureFlag from 'hooks/useFeatureFlag';
 
 import Buttons from 'containers/Admin/reporting/components/ReportBuilderPage/ReportRow/Buttons';
+import { MAX_REPORT_WIDTH } from 'containers/Admin/reporting/constants';
 
 import Warning from 'components/UI/Warning';
 
@@ -20,7 +21,6 @@ import { pastPresentOrFuture } from 'utils/dateUtils';
 import EmptyState from './EmptyState';
 import messages from './messages';
 import ReportPreview from './ReportPreview';
-import { MAX_REPORT_WIDTH } from 'containers/Admin/reporting/constants';
 
 const ReportTab = () => {
   const { phaseId } = useParams();
@@ -91,7 +91,7 @@ const ReportTab = () => {
                     visible: !report.data.attributes.visible,
                   });
                 }}
-                label={formatMessage(messages.reportVisible)}
+                label={formatMessage(messages.visible)}
               />
             </Box>
             <Buttons
diff --git a/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts b/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts
index d8f8f51853a6..497e19f46416 100644
--- a/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts
+++ b/front/app/containers/Admin/projects/project/information/ReportTab/messages.ts
@@ -39,28 +39,28 @@ export default defineMessages({
     id: 'app.containers.Admin.projects.project.information.ReportTab.modalDescription',
     defaultMessage: 'Create a report for a past phase, or start from scratch.',
   },
-  reportVisible: {
-    id: 'app.containers.Admin.projects.project.information.ReportTab.reportVisible',
-    defaultMessage: 'Report visible to public',
+  visible: {
+    id: 'app.containers.Admin.projects.project.information.ReportTab.visible',
+    defaultMessage: 'Visible',
   },
   notVisibleNotStarted: {
-    id: 'app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted',
+    id: 'app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1',
     defaultMessage:
-      'This report is not visible to the public. To make it publicly visible once the phase starts, enable the "Report visible to public" toggle.',
+      'This report is not public. To make it public, enable the "Visible" toggle.',
   },
   visibleNotStarted: {
-    id: 'app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted',
+    id: 'app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1',
     defaultMessage:
-      'This report will be publicly available as soon as the phase starts. To make it not publicly visible, disable the "Report visible to public" toggle.',
+      'This report will be public as soon as the phase starts. To make it not public, disable the "Visible" toggle.',
   },
   notVisibleStarted: {
-    id: 'app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted',
+    id: 'app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1',
     defaultMessage:
-      'This phase has started, but the report is not visible yet to the public. To make it publicly visible, enable the "Report visible to public" toggle.',
+      'This phase has started, but the report is not public yet. To make it public, enable the "Visible" toggle.',
   },
   visibleStarted: {
-    id: 'app.containers.Admin.projects.project.information.ReportTab.visibleStarted',
+    id: 'app.containers.Admin.projects.project.information.ReportTab.visibleStarted1',
     defaultMessage:
-      'This report is currently publicly visible. To make it not publicly visible, disable the "Report visible to public" toggle.',
+      'This report is currently public. To make it not public, disable the "Visible" toggle.',
   },
 });

From 331f3568f43e3c5d5751267ddd3e514781ef920e Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 7 Mar 2024 17:26:37 +0000
Subject: [PATCH 180/282] Add live data warning banner in report builder itself

---
 .../reporting/containers/ReportBuilder/index.tsx     | 12 ++++++++++++
 front/app/containers/Admin/reporting/messages.ts     |  5 +++++
 2 files changed, 17 insertions(+)

diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index 388b70598fd7..64a1dde859ad 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -18,6 +18,9 @@ import { StyledRightColumn } from 'components/admin/ContentBuilder/Frame/FrameWr
 import FullscreenContentBuilder from 'components/admin/ContentBuilder/FullscreenContentBuilder';
 import LanguageProvider from 'components/admin/ContentBuilder/LanguageProvider';
 import { ContentBuilderErrors } from 'components/admin/ContentBuilder/typings';
+import Warning from 'components/UI/Warning';
+
+import { FormattedMessage } from 'utils/cl-intl';
 
 import Editor from '../../components/ReportBuilder/Editor';
 import Settings from '../../components/ReportBuilder/Settings';
@@ -27,7 +30,9 @@ import Toolbox from '../../components/ReportBuilder/Toolbox';
 import TopBar from '../../components/ReportBuilder/TopBar';
 import ViewContainer from '../../components/ReportBuilder/ViewContainer';
 import { View } from '../../components/ReportBuilder/ViewContainer/typings';
+import { A4_WIDTH } from '../../constants';
 import { ReportContextProvider } from '../../context/ReportContext';
+import messages from '../../messages';
 import areCraftjsObjectsEqual from '../../utils/areCraftjsObjectsEqual';
 
 interface Props {
@@ -130,6 +135,13 @@ const ReportBuilder = ({ report, reportLayout }: Props) => {
               platformLocale={platformLocale}
             >
               <StyledRightColumn>
+                {!!phaseId && (
+                  <Box maxWidth={A4_WIDTH} mb="20px">
+                    <Warning>
+                      <FormattedMessage {...messages.warningBanner} />
+                    </Warning>
+                  </Box>
+                )}
                 <ViewContainer view={view}>
                   <Frame editorData={initialData}>
                     {emptyReportOnInit && templateProjectId ? (
diff --git a/front/app/containers/Admin/reporting/messages.ts b/front/app/containers/Admin/reporting/messages.ts
index 64ed91b2a111..420733770ffa 100644
--- a/front/app/containers/Admin/reporting/messages.ts
+++ b/front/app/containers/Admin/reporting/messages.ts
@@ -42,4 +42,9 @@ export default defineMessages({
     id: 'app.containers.Admin.reporting.deprecated',
     defaultMessage: 'DEPRECATED',
   },
+  warningBanner: {
+    id: 'app.containers.Admin.reporting.warningBanner',
+    defaultMessage:
+      'On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.',
+  },
 });

From 0a804462fa31510fee410a3f228541233f494926 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Thu, 7 Mar 2024 17:29:04 +0000
Subject: [PATCH 181/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/ar-SA.json   |  1 -
 front/app/translations/admin/da-DK.json   |  1 -
 front/app/translations/admin/de-DE.json   |  1 -
 front/app/translations/admin/en-CA.json   |  1 -
 front/app/translations/admin/en-GB.json   |  1 -
 front/app/translations/admin/en.json      | 11 ++++++-----
 front/app/translations/admin/es-CL.json   |  1 -
 front/app/translations/admin/es-ES.json   |  1 -
 front/app/translations/admin/fi-FI.json   |  1 -
 front/app/translations/admin/fr-BE.json   |  1 -
 front/app/translations/admin/fr-FR.json   |  1 -
 front/app/translations/admin/hr-HR.json   |  1 -
 front/app/translations/admin/lv-LV.json   |  1 -
 front/app/translations/admin/nb-NO.json   |  1 -
 front/app/translations/admin/nl-BE.json   |  1 -
 front/app/translations/admin/nl-NL.json   |  1 -
 front/app/translations/admin/pl-PL.json   |  1 -
 front/app/translations/admin/pt-BR.json   |  1 -
 front/app/translations/admin/sr-Latn.json |  1 -
 front/app/translations/admin/sr-SP.json   |  1 -
 front/app/translations/admin/sv-SE.json   |  1 -
 front/app/translations/admin/tr-TR.json   |  1 -
 22 files changed, 6 insertions(+), 26 deletions(-)

diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index c96863548d67..bb0a211a295f 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "قم بإنشاء تقرير لمرحلة سابقة، أو ابدأ من الصفر.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "ابدأ بقالب المرحلة",
   "app.containers.Admin.projects.project.information.ReportTab.report": "تقرير",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "التقرير مرئي للعامة",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "مشاركة نتائج الاستطلاع أو مرحلة التفكير السابقة",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "هل أنت متأكد أنك تريد حذف هذا التقرير؟ لا يمكن التراجع عن هذا الإجراء.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "أضف إلى المرحلة",
diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 94987f0b186f..908f5cc5207a 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Opret en rapport for en tidligere fase, eller start forfra.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start med en faseskabelon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport synlig for offentligheden",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Del resultaterne af en tidligere survey eller idéfase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Er du sikker på, at du vil slette denne rapport? Handligen kan ikke fortrydes.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Tilføj til fase",
diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index 34617815119c..b27381f9c8a6 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Erstellen Sie einen Bericht für eine vergangene Phase oder beginnen Sie von Grund auf neu.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Mit einer Projektvorlage beginnen",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Bericht",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Bericht öffentlich sichtbar",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Teilen Sie die Ergebnisse einer vergangenen Umfrage oder Ideenfindung",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Sind Sie sicher, dass Sie diesen Beitrag löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Zur Phase hinzufügen",
diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index 8fc1eb4f0cb7..af6a8157a4f6 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index 03a3192954b4..cc4b3c1e7646 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 67f5f563adae..d638444f859e 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -782,14 +782,14 @@
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Create a report to:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Create a report",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
-  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted": "This report is not visible to the public. To make it publicly visible once the phase starts, enable the \"Report visible to public\" toggle.",
-  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted": "This phase has started, but the report is not visible yet to the public. To make it publicly visible, enable the \"Report visible to public\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "This report is not public. To make it public, enable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "This phase has started, but the report is not public yet. To make it public, enable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted": "This report will be publicly available as soon as the phase starts. To make it not publicly visible, disable the \"Report visible to public\" toggle.",
-  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted": "This report is currently publicly visible. To make it not publicly visible, disable the \"Report visible to public\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "This report will be public as soon as the phase starts. To make it not public, disable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "This report is currently public. To make it not public, disable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "You need to consent to this before you can continue",
@@ -899,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Report builder",
   "app.containers.Admin.reporting.reportHeader": "Report header",
   "app.containers.Admin.reporting.resultsSection": "RESULTS",
+  "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Create new token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancel",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Your token has been created. Please copy the {secret} below and store it safely.",
diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index 9228e405d2d2..a9ae1fad641a 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crea un informe para una fase anterior, o empieza desde cero.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Empieza con una plantilla de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Reporte",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Informe visible para el público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Comparte los resultados de una encuesta pasada o de una fase de ideación",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "¿Estás seguro de que deseas eliminar esta entrada? Esta acción no se puede deshacer.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Añadir a la fase",
diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index c7f3c3078b53..f888677332a5 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crea un informe para una fase anterior, o empieza desde cero.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Empieza con una plantilla de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Reporte",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Informe visible para el público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Comparte los resultados de una encuesta pasada o de una fase de ideación",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "¿Estás seguro de que deseas eliminar esta entrada? Esta acción no se puede deshacer.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Añadir a la fase",
diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index d5c856632369..3e82da9a3274 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Luo raportti menneestä vaiheesta tai aloita alusta.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Aloita vaihemallilla",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Raportoi",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Raportti näkyy julkisesti",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Jaa aiemman kyselyn tai ideointivaiheen tulokset",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Haluatko varmasti poistaa tämän raportin? Tätä toimintoa ei voi kumota.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Lisää vaiheeseen",
diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index 0e4c825796d7..7ef77792634c 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Générez un rapport basé sur une phase précédente ou commencez avec une page blanche.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Commencez à partir d'un modèle",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport visible publiquement",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "partager les résultats d'une enquête ou d'une phase de vote passée ;",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer ce rapport ? Cette action ne peut pas être annulée.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Ajouter à la phase",
diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index 1b1c0259abaa..6ac1b719a4a7 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Générez un rapport basé sur une phase précédente ou commencez avec une page blanche.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Commencez à partir d'un modèle",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport visible publiquement",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "partager les résultats d'une enquête ou d'une phase de vote passée ;",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer ce rapport ? Cette action ne peut pas être annulée.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Ajouter à la phase",
diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index 5c0c6f9449ca..3442f750f6bf 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Napravite izvješće za prošlu fazu ili počnite od nule.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Počnite s predloškom faze",
   "app.containers.Admin.projects.project.information.ReportTab.report": "izvješće",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Izvještaj vidljiv javnosti",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Podijelite rezultate prošlog istraživanja ili faze razmišljanja",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Jeste li sigurni da želite izbrisati ovo izvješće? Ova se radnja ne može poništiti.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Dodaj u fazu",
diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 5009fc21394b..d854c3e9f5be 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Izveidojiet pārskatu par iepriekšējo posmu vai sāciet no jauna.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Sāciet ar fāzes veidni",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Ziņojums",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Publiski redzams ziņojums",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Kopīgojiet iepriekš veiktas aptaujas vai ideju izstrādes posma rezultātus.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Vai esat pārliecināts, ka vēlaties dzēst šo ziņojumu? Šo darbību nevar atcelt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Pievienot fāzei",
diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index 9ec9e2afa4f9..441475c751e1 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Lag en rapport for en tidligere fase, eller start fra bunnen av.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start med en fasemal",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapportere",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapporten er synlig for publikum",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Del resultater fra en tidligere undersøkelse eller idéfase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Er du sikker på at du vil slette denne rapporten? Denne handlingen kan ikke angres.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Legg til fase",
diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index 83e4d5830a61..b6ad57c14c07 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Maak een rapport voor een eerdere fase of begin helemaal opnieuw.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Begin met een fasesjabloon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport zichtbaar voor publiek",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "De resultaten van een eerdere vragenlijst of fase waarin ideeën zijn verzameld te delen",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Weet je zeker dat je dit rapport wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Toevoegen aan fase",
diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index d69ea0f71b0a..96c1bf4fd5ac 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Maak een rapport voor een eerdere fase of begin helemaal opnieuw.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Begin met een fasesjabloon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport zichtbaar voor publiek",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "De resultaten van een eerdere vragenlijst of fase waarin ideeën zijn verzameld te delen",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Weet je zeker dat je dit rapport wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Toevoegen aan fase",
diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index c51194fd21be..99dab6f6afdc 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Utwórz raport dla poprzedniej fazy lub zacznij od zera.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Zacznij od szablonu fazy",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Raport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Raport widoczny publicznie",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Podziel się wynikami wcześniejszej ankiety lub fazy tworzenia pomysłów.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Czy na pewno chcesz usunąć ten raport? Tej czynności nie można cofnąć.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Dodaj do fazy",
diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index 1b868445585c..fb97bed6dee9 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crie um relatório para uma fase anterior ou comece do zero.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Comece com um modelo de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Relatório",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Relatório visível para o público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Compartilhe os resultados de uma pesquisa anterior ou da fase de ideação",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Você tem certeza de que deseja excluir este relatório? Essa ação não pode ser desfeita.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Adicionar à fase",
diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index a706ab241245..a576468a8b5a 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index cf6b11a5466b..09ac9b3adf0a 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Да ли сте сигурни да желите да избришете овај извештај? Ова радња се не може опозвати.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Додајте у фазу",
diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 9656d97b0ce3..1fbe4c10a190 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Skapa en rapport för en tidigare fas eller börja om från början.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Börja med en fasmall",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport synlig för allmänheten",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Dela med dig av resultaten från en tidigare undersökning eller idéfas",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Är du säker på att du vill ta bort denna rapport? Denna åtgärd kan inte ångras.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Lägg till fas",
diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index 28e8b39758fc..6ff5a34b3a40 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Geçmiş bir aşama için rapor oluşturun veya sıfırdan başlayın.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Bir faz şablonu ile başlayın",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapor",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Kamuoyu tarafından görülebilen rapor",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Geçmiş bir anketin veya fikir aşamasının sonuçlarını paylaşın",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Bu raporu silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Faza ekle",

From be8aba3f8768cd0b60fd4dc4739a6663d6abeb2c Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Thu, 7 Mar 2024 17:31:45 +0000
Subject: [PATCH 182/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/ar-SA.json   |  1 -
 front/app/translations/admin/da-DK.json   |  1 -
 front/app/translations/admin/de-DE.json   |  1 -
 front/app/translations/admin/en-CA.json   |  1 -
 front/app/translations/admin/en-GB.json   |  1 -
 front/app/translations/admin/en.json      | 11 ++++++-----
 front/app/translations/admin/es-CL.json   |  1 -
 front/app/translations/admin/es-ES.json   |  1 -
 front/app/translations/admin/fi-FI.json   |  1 -
 front/app/translations/admin/fr-BE.json   |  1 -
 front/app/translations/admin/fr-FR.json   |  1 -
 front/app/translations/admin/hr-HR.json   |  1 -
 front/app/translations/admin/lv-LV.json   |  1 -
 front/app/translations/admin/nb-NO.json   |  1 -
 front/app/translations/admin/nl-BE.json   |  1 -
 front/app/translations/admin/nl-NL.json   |  1 -
 front/app/translations/admin/pl-PL.json   |  1 -
 front/app/translations/admin/pt-BR.json   |  1 -
 front/app/translations/admin/sr-Latn.json |  1 -
 front/app/translations/admin/sr-SP.json   |  1 -
 front/app/translations/admin/sv-SE.json   |  1 -
 front/app/translations/admin/tr-TR.json   |  1 -
 22 files changed, 6 insertions(+), 26 deletions(-)

diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index c96863548d67..bb0a211a295f 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "قم بإنشاء تقرير لمرحلة سابقة، أو ابدأ من الصفر.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "ابدأ بقالب المرحلة",
   "app.containers.Admin.projects.project.information.ReportTab.report": "تقرير",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "التقرير مرئي للعامة",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "مشاركة نتائج الاستطلاع أو مرحلة التفكير السابقة",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "هل أنت متأكد أنك تريد حذف هذا التقرير؟ لا يمكن التراجع عن هذا الإجراء.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "أضف إلى المرحلة",
diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 94987f0b186f..908f5cc5207a 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Opret en rapport for en tidligere fase, eller start forfra.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start med en faseskabelon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport synlig for offentligheden",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Del resultaterne af en tidligere survey eller idéfase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Er du sikker på, at du vil slette denne rapport? Handligen kan ikke fortrydes.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Tilføj til fase",
diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index 34617815119c..b27381f9c8a6 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Erstellen Sie einen Bericht für eine vergangene Phase oder beginnen Sie von Grund auf neu.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Mit einer Projektvorlage beginnen",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Bericht",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Bericht öffentlich sichtbar",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Teilen Sie die Ergebnisse einer vergangenen Umfrage oder Ideenfindung",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Sind Sie sicher, dass Sie diesen Beitrag löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Zur Phase hinzufügen",
diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index 8fc1eb4f0cb7..af6a8157a4f6 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index 03a3192954b4..cc4b3c1e7646 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 67f5f563adae..d638444f859e 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -782,14 +782,14 @@
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Create a report to:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Create a report",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
-  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted": "This report is not visible to the public. To make it publicly visible once the phase starts, enable the \"Report visible to public\" toggle.",
-  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted": "This phase has started, but the report is not visible yet to the public. To make it publicly visible, enable the \"Report visible to public\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "This report is not public. To make it public, enable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "This phase has started, but the report is not public yet. To make it public, enable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted": "This report will be publicly available as soon as the phase starts. To make it not publicly visible, disable the \"Report visible to public\" toggle.",
-  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted": "This report is currently publicly visible. To make it not publicly visible, disable the \"Report visible to public\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "This report will be public as soon as the phase starts. To make it not public, disable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "This report is currently public. To make it not public, disable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "You need to consent to this before you can continue",
@@ -899,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Report builder",
   "app.containers.Admin.reporting.reportHeader": "Report header",
   "app.containers.Admin.reporting.resultsSection": "RESULTS",
+  "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Create new token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancel",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Your token has been created. Please copy the {secret} below and store it safely.",
diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index 9228e405d2d2..a9ae1fad641a 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crea un informe para una fase anterior, o empieza desde cero.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Empieza con una plantilla de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Reporte",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Informe visible para el público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Comparte los resultados de una encuesta pasada o de una fase de ideación",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "¿Estás seguro de que deseas eliminar esta entrada? Esta acción no se puede deshacer.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Añadir a la fase",
diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index c7f3c3078b53..f888677332a5 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crea un informe para una fase anterior, o empieza desde cero.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Empieza con una plantilla de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Reporte",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Informe visible para el público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Comparte los resultados de una encuesta pasada o de una fase de ideación",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "¿Estás seguro de que deseas eliminar esta entrada? Esta acción no se puede deshacer.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Añadir a la fase",
diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index d5c856632369..3e82da9a3274 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Luo raportti menneestä vaiheesta tai aloita alusta.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Aloita vaihemallilla",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Raportoi",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Raportti näkyy julkisesti",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Jaa aiemman kyselyn tai ideointivaiheen tulokset",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Haluatko varmasti poistaa tämän raportin? Tätä toimintoa ei voi kumota.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Lisää vaiheeseen",
diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index 0e4c825796d7..7ef77792634c 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Générez un rapport basé sur une phase précédente ou commencez avec une page blanche.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Commencez à partir d'un modèle",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport visible publiquement",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "partager les résultats d'une enquête ou d'une phase de vote passée ;",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer ce rapport ? Cette action ne peut pas être annulée.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Ajouter à la phase",
diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index 1b1c0259abaa..6ac1b719a4a7 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Générez un rapport basé sur une phase précédente ou commencez avec une page blanche.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Commencez à partir d'un modèle",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport visible publiquement",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "partager les résultats d'une enquête ou d'une phase de vote passée ;",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer ce rapport ? Cette action ne peut pas être annulée.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Ajouter à la phase",
diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index 5c0c6f9449ca..3442f750f6bf 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Napravite izvješće za prošlu fazu ili počnite od nule.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Počnite s predloškom faze",
   "app.containers.Admin.projects.project.information.ReportTab.report": "izvješće",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Izvještaj vidljiv javnosti",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Podijelite rezultate prošlog istraživanja ili faze razmišljanja",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Jeste li sigurni da želite izbrisati ovo izvješće? Ova se radnja ne može poništiti.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Dodaj u fazu",
diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 5009fc21394b..d854c3e9f5be 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Izveidojiet pārskatu par iepriekšējo posmu vai sāciet no jauna.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Sāciet ar fāzes veidni",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Ziņojums",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Publiski redzams ziņojums",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Kopīgojiet iepriekš veiktas aptaujas vai ideju izstrādes posma rezultātus.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Vai esat pārliecināts, ka vēlaties dzēst šo ziņojumu? Šo darbību nevar atcelt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Pievienot fāzei",
diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index 9ec9e2afa4f9..441475c751e1 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Lag en rapport for en tidligere fase, eller start fra bunnen av.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start med en fasemal",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapportere",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapporten er synlig for publikum",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Del resultater fra en tidligere undersøkelse eller idéfase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Er du sikker på at du vil slette denne rapporten? Denne handlingen kan ikke angres.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Legg til fase",
diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index 83e4d5830a61..b6ad57c14c07 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Maak een rapport voor een eerdere fase of begin helemaal opnieuw.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Begin met een fasesjabloon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport zichtbaar voor publiek",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "De resultaten van een eerdere vragenlijst of fase waarin ideeën zijn verzameld te delen",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Weet je zeker dat je dit rapport wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Toevoegen aan fase",
diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index d69ea0f71b0a..96c1bf4fd5ac 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Maak een rapport voor een eerdere fase of begin helemaal opnieuw.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Begin met een fasesjabloon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport zichtbaar voor publiek",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "De resultaten van een eerdere vragenlijst of fase waarin ideeën zijn verzameld te delen",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Weet je zeker dat je dit rapport wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Toevoegen aan fase",
diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index c51194fd21be..99dab6f6afdc 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Utwórz raport dla poprzedniej fazy lub zacznij od zera.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Zacznij od szablonu fazy",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Raport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Raport widoczny publicznie",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Podziel się wynikami wcześniejszej ankiety lub fazy tworzenia pomysłów.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Czy na pewno chcesz usunąć ten raport? Tej czynności nie można cofnąć.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Dodaj do fazy",
diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index 1b868445585c..fb97bed6dee9 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crie um relatório para uma fase anterior ou comece do zero.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Comece com um modelo de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Relatório",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Relatório visível para o público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Compartilhe os resultados de uma pesquisa anterior ou da fase de ideação",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Você tem certeza de que deseja excluir este relatório? Essa ação não pode ser desfeita.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Adicionar à fase",
diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index a706ab241245..a576468a8b5a 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index cf6b11a5466b..09ac9b3adf0a 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Да ли сте сигурни да желите да избришете овај извештај? Ова радња се не може опозвати.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Додајте у фазу",
diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 9656d97b0ce3..1fbe4c10a190 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Skapa en rapport för en tidigare fas eller börja om från början.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Börja med en fasmall",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport synlig för allmänheten",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Dela med dig av resultaten från en tidigare undersökning eller idéfas",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Är du säker på att du vill ta bort denna rapport? Denna åtgärd kan inte ångras.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Lägg till fas",
diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index 28e8b39758fc..6ff5a34b3a40 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Geçmiş bir aşama için rapor oluşturun veya sıfırdan başlayın.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Bir faz şablonu ile başlayın",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapor",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Kamuoyu tarafından görülebilen rapor",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Geçmiş bir anketin veya fikir aşamasının sonuçlarını paylaşın",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Bu raporu silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Faza ekle",

From 9bc7eb7a43e4328246429dbbf58eb8fc5743b892 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Thu, 7 Mar 2024 17:31:53 +0000
Subject: [PATCH 183/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/ar-SA.json   |  1 -
 front/app/translations/admin/da-DK.json   |  1 -
 front/app/translations/admin/de-DE.json   |  1 -
 front/app/translations/admin/en-CA.json   |  1 -
 front/app/translations/admin/en-GB.json   |  1 -
 front/app/translations/admin/en.json      | 11 ++++++-----
 front/app/translations/admin/es-CL.json   |  1 -
 front/app/translations/admin/es-ES.json   |  1 -
 front/app/translations/admin/fi-FI.json   |  1 -
 front/app/translations/admin/fr-BE.json   |  1 -
 front/app/translations/admin/fr-FR.json   |  1 -
 front/app/translations/admin/hr-HR.json   |  1 -
 front/app/translations/admin/lv-LV.json   |  1 -
 front/app/translations/admin/nb-NO.json   |  1 -
 front/app/translations/admin/nl-BE.json   |  1 -
 front/app/translations/admin/nl-NL.json   |  1 -
 front/app/translations/admin/pl-PL.json   |  1 -
 front/app/translations/admin/pt-BR.json   |  1 -
 front/app/translations/admin/sr-Latn.json |  1 -
 front/app/translations/admin/sr-SP.json   |  1 -
 front/app/translations/admin/sv-SE.json   |  1 -
 front/app/translations/admin/tr-TR.json   |  1 -
 22 files changed, 6 insertions(+), 26 deletions(-)

diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index c96863548d67..bb0a211a295f 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "قم بإنشاء تقرير لمرحلة سابقة، أو ابدأ من الصفر.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "ابدأ بقالب المرحلة",
   "app.containers.Admin.projects.project.information.ReportTab.report": "تقرير",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "التقرير مرئي للعامة",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "مشاركة نتائج الاستطلاع أو مرحلة التفكير السابقة",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "هل أنت متأكد أنك تريد حذف هذا التقرير؟ لا يمكن التراجع عن هذا الإجراء.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "أضف إلى المرحلة",
diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 94987f0b186f..908f5cc5207a 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Opret en rapport for en tidligere fase, eller start forfra.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start med en faseskabelon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport synlig for offentligheden",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Del resultaterne af en tidligere survey eller idéfase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Er du sikker på, at du vil slette denne rapport? Handligen kan ikke fortrydes.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Tilføj til fase",
diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index 34617815119c..b27381f9c8a6 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Erstellen Sie einen Bericht für eine vergangene Phase oder beginnen Sie von Grund auf neu.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Mit einer Projektvorlage beginnen",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Bericht",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Bericht öffentlich sichtbar",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Teilen Sie die Ergebnisse einer vergangenen Umfrage oder Ideenfindung",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Sind Sie sicher, dass Sie diesen Beitrag löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Zur Phase hinzufügen",
diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index 8fc1eb4f0cb7..af6a8157a4f6 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index 03a3192954b4..cc4b3c1e7646 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index 67f5f563adae..d638444f859e 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -782,14 +782,14 @@
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Create a report to:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Create a report",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
-  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted": "This report is not visible to the public. To make it publicly visible once the phase starts, enable the \"Report visible to public\" toggle.",
-  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted": "This phase has started, but the report is not visible yet to the public. To make it publicly visible, enable the \"Report visible to public\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "This report is not public. To make it public, enable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "This phase has started, but the report is not public yet. To make it public, enable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted": "This report will be publicly available as soon as the phase starts. To make it not publicly visible, disable the \"Report visible to public\" toggle.",
-  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted": "This report is currently publicly visible. To make it not publicly visible, disable the \"Report visible to public\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "This report will be public as soon as the phase starts. To make it not public, disable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "This report is currently public. To make it not public, disable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "You need to consent to this before you can continue",
@@ -899,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Report builder",
   "app.containers.Admin.reporting.reportHeader": "Report header",
   "app.containers.Admin.reporting.resultsSection": "RESULTS",
+  "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Create new token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancel",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Your token has been created. Please copy the {secret} below and store it safely.",
diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index 9228e405d2d2..a9ae1fad641a 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crea un informe para una fase anterior, o empieza desde cero.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Empieza con una plantilla de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Reporte",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Informe visible para el público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Comparte los resultados de una encuesta pasada o de una fase de ideación",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "¿Estás seguro de que deseas eliminar esta entrada? Esta acción no se puede deshacer.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Añadir a la fase",
diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index c7f3c3078b53..f888677332a5 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crea un informe para una fase anterior, o empieza desde cero.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Empieza con una plantilla de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Reporte",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Informe visible para el público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Comparte los resultados de una encuesta pasada o de una fase de ideación",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "¿Estás seguro de que deseas eliminar esta entrada? Esta acción no se puede deshacer.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Añadir a la fase",
diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index d5c856632369..3e82da9a3274 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Luo raportti menneestä vaiheesta tai aloita alusta.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Aloita vaihemallilla",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Raportoi",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Raportti näkyy julkisesti",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Jaa aiemman kyselyn tai ideointivaiheen tulokset",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Haluatko varmasti poistaa tämän raportin? Tätä toimintoa ei voi kumota.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Lisää vaiheeseen",
diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index 0e4c825796d7..7ef77792634c 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Générez un rapport basé sur une phase précédente ou commencez avec une page blanche.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Commencez à partir d'un modèle",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport visible publiquement",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "partager les résultats d'une enquête ou d'une phase de vote passée ;",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer ce rapport ? Cette action ne peut pas être annulée.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Ajouter à la phase",
diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index 1b1c0259abaa..6ac1b719a4a7 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Générez un rapport basé sur une phase précédente ou commencez avec une page blanche.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Commencez à partir d'un modèle",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport visible publiquement",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "partager les résultats d'une enquête ou d'une phase de vote passée ;",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer ce rapport ? Cette action ne peut pas être annulée.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Ajouter à la phase",
diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index 5c0c6f9449ca..3442f750f6bf 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Napravite izvješće za prošlu fazu ili počnite od nule.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Počnite s predloškom faze",
   "app.containers.Admin.projects.project.information.ReportTab.report": "izvješće",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Izvještaj vidljiv javnosti",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Podijelite rezultate prošlog istraživanja ili faze razmišljanja",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Jeste li sigurni da želite izbrisati ovo izvješće? Ova se radnja ne može poništiti.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Dodaj u fazu",
diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 5009fc21394b..d854c3e9f5be 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Izveidojiet pārskatu par iepriekšējo posmu vai sāciet no jauna.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Sāciet ar fāzes veidni",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Ziņojums",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Publiski redzams ziņojums",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Kopīgojiet iepriekš veiktas aptaujas vai ideju izstrādes posma rezultātus.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Vai esat pārliecināts, ka vēlaties dzēst šo ziņojumu? Šo darbību nevar atcelt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Pievienot fāzei",
diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index 9ec9e2afa4f9..441475c751e1 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Lag en rapport for en tidligere fase, eller start fra bunnen av.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start med en fasemal",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapportere",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapporten er synlig for publikum",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Del resultater fra en tidligere undersøkelse eller idéfase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Er du sikker på at du vil slette denne rapporten? Denne handlingen kan ikke angres.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Legg til fase",
diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index 83e4d5830a61..b6ad57c14c07 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Maak een rapport voor een eerdere fase of begin helemaal opnieuw.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Begin met een fasesjabloon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport zichtbaar voor publiek",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "De resultaten van een eerdere vragenlijst of fase waarin ideeën zijn verzameld te delen",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Weet je zeker dat je dit rapport wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Toevoegen aan fase",
diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index d69ea0f71b0a..96c1bf4fd5ac 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Maak een rapport voor een eerdere fase of begin helemaal opnieuw.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Begin met een fasesjabloon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport zichtbaar voor publiek",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "De resultaten van een eerdere vragenlijst of fase waarin ideeën zijn verzameld te delen",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Weet je zeker dat je dit rapport wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Toevoegen aan fase",
diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index c51194fd21be..99dab6f6afdc 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Utwórz raport dla poprzedniej fazy lub zacznij od zera.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Zacznij od szablonu fazy",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Raport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Raport widoczny publicznie",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Podziel się wynikami wcześniejszej ankiety lub fazy tworzenia pomysłów.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Czy na pewno chcesz usunąć ten raport? Tej czynności nie można cofnąć.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Dodaj do fazy",
diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index 1b868445585c..fb97bed6dee9 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crie um relatório para uma fase anterior ou comece do zero.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Comece com um modelo de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Relatório",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Relatório visível para o público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Compartilhe os resultados de uma pesquisa anterior ou da fase de ideação",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Você tem certeza de que deseja excluir este relatório? Essa ação não pode ser desfeita.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Adicionar à fase",
diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index a706ab241245..a576468a8b5a 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index cf6b11a5466b..09ac9b3adf0a 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Да ли сте сигурни да желите да избришете овај извештај? Ова радња се не може опозвати.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Додајте у фазу",
diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 9656d97b0ce3..1fbe4c10a190 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Skapa en rapport för en tidigare fas eller börja om från början.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Börja med en fasmall",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport synlig för allmänheten",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Dela med dig av resultaten från en tidigare undersökning eller idéfas",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Är du säker på att du vill ta bort denna rapport? Denna åtgärd kan inte ångras.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Lägg till fas",
diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index 28e8b39758fc..6ff5a34b3a40 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -783,7 +783,6 @@
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Geçmiş bir aşama için rapor oluşturun veya sıfırdan başlayın.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Bir faz şablonu ile başlayın",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapor",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Kamuoyu tarafından görülebilen rapor",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Geçmiş bir anketin veya fikir aşamasının sonuçlarını paylaşın",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Bu raporu silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Faza ekle",

From 1c8461cea398eb1d56be3b265f00b86c785be396 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 7 Mar 2024 17:46:00 +0000
Subject: [PATCH 184/282] Make moment to iso date global util

---
 front/app/api/graph_data_units/utils.ts                     | 5 -----
 .../CommentsByTimeCard/useCommentsByTime/index.ts           | 6 +++---
 .../GraphCards/PostsByTimeCard/usePostsByTime/index.ts      | 6 +++---
 .../ReactionsByTimeCard/useReactionsByTime/index.ts         | 6 +++---
 .../useVisitorReferrerTypes/index.ts                        | 6 +++---
 .../Admin/dashboard/users/Charts/AgeChart/index.tsx         | 6 +++---
 .../Admin/dashboard/users/Charts/GenderChart/index.tsx      | 6 +++---
 front/app/utils/dateUtils.ts                                | 6 +++++-
 8 files changed, 23 insertions(+), 24 deletions(-)
 delete mode 100644 front/app/api/graph_data_units/utils.ts

diff --git a/front/app/api/graph_data_units/utils.ts b/front/app/api/graph_data_units/utils.ts
deleted file mode 100644
index fe04d1f12164..000000000000
--- a/front/app/api/graph_data_units/utils.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Moment } from 'moment';
-
-export const formatMoment = (moment: Moment | null | undefined) => {
-  return moment?.format('yyyy-MM-DD');
-};
diff --git a/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts b/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
index 2ddb67aeaae3..f6d909a42f15 100644
--- a/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
@@ -1,7 +1,7 @@
 import { useMemo, useState } from 'react';
 
 import { useCommentsByTimeLive } from 'api/graph_data_units';
-import { formatMoment } from 'api/graph_data_units/utils';
+import { momentToIsoDate } from 'utils/dateUtils';
 
 import { getFormattedNumbers } from 'components/admin/GraphCards/_utils/parse';
 
@@ -21,8 +21,8 @@ export default function useCommentsByTime({
   const { data: analytics } = useCommentsByTimeLive(
     {
       project_id: projectId,
-      start_at: formatMoment(startAtMoment),
-      end_at: formatMoment(endAtMoment),
+      start_at: momentToIsoDate(startAtMoment),
+      end_at: momentToIsoDate(endAtMoment),
       resolution,
     },
     {
diff --git a/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts b/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
index 0e99181daeb7..2924ee249d56 100644
--- a/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
@@ -1,7 +1,7 @@
 import { useMemo, useState } from 'react';
 
 import { usePostsByTimeLive } from 'api/graph_data_units';
-import { formatMoment } from 'api/graph_data_units/utils';
+import { momentToIsoDate } from 'utils/dateUtils';
 
 import { getFormattedNumbers } from 'components/admin/GraphCards/_utils/parse';
 
@@ -22,8 +22,8 @@ export default function usePostsByTime({
   const { data: analytics } = usePostsByTimeLive(
     {
       project_id: projectId,
-      start_at: formatMoment(startAtMoment),
-      end_at: formatMoment(endAtMoment),
+      start_at: momentToIsoDate(startAtMoment),
+      end_at: momentToIsoDate(endAtMoment),
       resolution,
     },
     {
diff --git a/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts b/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
index 7c2b45b25130..ff463416435e 100644
--- a/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
@@ -1,7 +1,7 @@
 import { useMemo, useState } from 'react';
 
 import { useReactionsByTimeLive } from 'api/graph_data_units';
-import { formatMoment } from 'api/graph_data_units/utils';
+import { momentToIsoDate } from 'utils/dateUtils';
 
 import { getFormattedNumbers } from 'components/admin/GraphCards/_utils/parse';
 
@@ -23,8 +23,8 @@ export default function useReactionsByTime({
   const { data: analytics } = useReactionsByTimeLive(
     {
       project_id: projectId,
-      start_at: formatMoment(startAtMoment),
-      end_at: formatMoment(endAtMoment),
+      start_at: momentToIsoDate(startAtMoment),
+      end_at: momentToIsoDate(endAtMoment),
       resolution,
     },
     {
diff --git a/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts b/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
index 5b3b63055ea6..ad248e7760f9 100644
--- a/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
+++ b/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
@@ -1,5 +1,5 @@
 import { useVisitorsTrafficSourcesLive } from 'api/graph_data_units';
-import { formatMoment } from 'api/graph_data_units/utils';
+import { momentToIsoDate } from 'utils/dateUtils';
 
 import { ProjectId, Dates } from 'components/admin/GraphCards/typings';
 
@@ -17,8 +17,8 @@ export default function useVisitorsReferrerTypes({
 }: QueryParameters) {
   const { data: analytics } = useVisitorsTrafficSourcesLive({
     project_id: projectId,
-    start_at: formatMoment(startAtMoment),
-    end_at: formatMoment(endAtMoment),
+    start_at: momentToIsoDate(startAtMoment),
+    end_at: momentToIsoDate(endAtMoment),
   });
 
   const { formatMessage } = useIntl();
diff --git a/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx b/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
index e0987c46aad5..aea3df9b6df9 100644
--- a/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
+++ b/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
@@ -4,7 +4,7 @@ import { Box } from '@citizenlab/cl2-component-library';
 import moment from 'moment';
 
 import { useUsersByAgeLive } from 'api/graph_data_units';
-import { formatMoment } from 'api/graph_data_units/utils';
+import { momentToIsoDate } from 'utils/dateUtils';
 import { usersByBirthyearXlsxEndpoint } from 'api/users_by_birthyear/util';
 
 import messages from 'containers/Admin/dashboard/messages';
@@ -32,8 +32,8 @@ const AgeChart = ({
   const graphRef = useRef();
 
   const { data: usersByBirthyear } = useUsersByAgeLive({
-    start_at: startAt ? formatMoment(moment(startAt)) : null,
-    end_at: endAt ? formatMoment(moment(endAt)) : null,
+    start_at: startAt ? momentToIsoDate(moment(startAt)) : null,
+    end_at: endAt ? momentToIsoDate(moment(endAt)) : null,
     group_id: currentGroupFilter,
   });
   const ageSerie = convertToGraphFormat(usersByBirthyear, formatMessage);
diff --git a/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx b/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
index 9979e727292f..d4e5ba715c71 100644
--- a/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
+++ b/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
@@ -3,7 +3,7 @@ import React, { useRef } from 'react';
 import moment from 'moment';
 
 import { useUsersByGenderLive } from 'api/graph_data_units';
-import { formatMoment } from 'api/graph_data_units/utils';
+import { momentToIsoDate } from 'utils/dateUtils';
 import { usersByGenderXlsxEndpoint } from 'api/users_by_gender/util';
 
 import messages from 'containers/Admin/dashboard/messages';
@@ -31,8 +31,8 @@ const GenderChart = ({
   const { formatMessage } = useIntl();
 
   const { data: usersByGender } = useUsersByGenderLive({
-    start_at: startAt ? formatMoment(moment(startAt)) : null,
-    end_at: endAt ? formatMoment(moment(endAt)) : null,
+    start_at: startAt ? momentToIsoDate(moment(startAt)) : null,
+    end_at: endAt ? momentToIsoDate(moment(endAt)) : null,
     group_id: currentGroupFilter,
   });
   const serie = convertToGraphFormat(usersByGender, formatMessage);
diff --git a/front/app/utils/dateUtils.ts b/front/app/utils/dateUtils.ts
index 84c982f3d061..7a2ebbf40ff6 100644
--- a/front/app/utils/dateUtils.ts
+++ b/front/app/utils/dateUtils.ts
@@ -1,5 +1,5 @@
 import { isString } from 'lodash-es';
-import moment, { unitOfTime } from 'moment';
+import moment, { unitOfTime, Moment } from 'moment';
 import { Locale } from 'typings';
 
 import { IEventData } from 'api/events/types';
@@ -136,6 +136,10 @@ export function getIsoDateUtc(date: string) {
   return moment.utc(new Date(date)).format('YYYY-MM-DD');
 }
 
+export const momentToIsoDate = (moment: Moment | null | undefined) => {
+  return moment?.format('yyyy-MM-DD');
+};
+
 export function getPeriodRemainingUntil(
   date: string,
   timeUnit: unitOfTime.Diff = 'days'

From 02c1591a97dbdba339e0ba7df57c87d8d26b3d2d Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:21 +0100
Subject: [PATCH 185/282] New translations en.json (French)

---
 front/app/translations/admin/fr-FR.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index a983f54fea45..2476882a555b 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "ici",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Avant de poursuivre",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Après avoir créé un rapport, vous pouvez choisir de le partager avec le public dès le début de la phase.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "créer une page plus élaborée pour le partage d'informations.",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Créez un rapport pour :",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Créer un rapport",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Générez un rapport basé sur une phase précédente ou commencez avec une page blanche.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Ce rapport n'est pas public. Pour le rendre public, activez la case à cocher \"Visible\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Cette phase a commencé, mais le rapport n'est pas encore public. Pour le rendre public, activez la case à cocher \"Visible\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Commencez à partir d'un modèle",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport visible publiquement",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "partager les résultats d'une enquête ou d'une phase de vote passée ;",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Celui-ci sera visible par tous les utilisateurs dès le début de cette phase.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Ce rapport sera public dès le début de la phase. Pour qu'il ne soit pas public, désactivez la case à cocher \"Visible\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Ce rapport est actuellement public. Pour le rendre non public, désactivez l'option \"Visible\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer ce rapport ? Cette action ne peut pas être annulée.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Ajouter à la phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Vous devez donner votre accord avant de pouvoir continuer",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Éditeur de rapports",
   "app.containers.Admin.reporting.reportHeader": "En-tête du rapport",
   "app.containers.Admin.reporting.resultsSection": "RÉSULTATS",
+  "app.containers.Admin.reporting.warningBanner": "Sur cette page, le rapport présente les dernières données de la plate-forme. Sur les autres pages, un instantané du rapport est affiché. Les instantanés sont pris lorsque vous enregistrez le rapport sur cette page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Créer un nouveau jeton",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuler",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Votre jeton a été créé avec succès. Copiez le {secret} ci-dessous et conservez-le en lieu sûr.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Modifier le contenu de l'enquête",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Les réponses à ce sondage commencent à arriver. Des modifications apportées au sondage pourraient entraîner des pertes de données et des données incomplètes dans les fichiers exportés.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Téléchargement de fichier",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Retour",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Les réponses aux questions à réponse courte et longue ne sont actuellement disponibles que dans le téléchargement de l'enquête",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Échelle linéaire",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Réponse longue",

From 11e694a290bb858515f05e21ad93f7b32d06cf8a Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:23 +0100
Subject: [PATCH 186/282] New translations en.json (Spanish)

---
 front/app/translations/admin/es-ES.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index 952648127c16..c58660fc531b 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "aquí",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Antes de continuar",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Después de crear un informe, puedes elegir compartirlo con el público una vez iniciada la fase.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Crear una página más compleja para compartir información",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Crea un informe para:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Crear un informe",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crea un informe para una fase anterior, o empieza desde cero.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Este informe no es público. Para hacerlo público, activa el conmutador \"Visible\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Esta fase ha comenzado, pero el informe aún no es público. Para hacerlo público, activa el conmutador \"Visible\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Empieza con una plantilla de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Reporte",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Informe visible para el público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Comparte los resultados de una encuesta pasada o de una fase de ideación",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Estará a disposición pública de los usuarios en cuanto comience esta fase.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Este informe será público en cuanto comience la fase. Para que no sea público, desactiva el conmutador \"Visible\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Este informe es actualmente público. Para que no sea público, desactiva el conmutador \"Visible\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "¿Estás seguro de que deseas eliminar esta entrada? Esta acción no se puede deshacer.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Añadir a la fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Tienes que dar tu consentimiento antes de continuar",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Constructor de informes",
   "app.containers.Admin.reporting.reportHeader": "Encabezado del informe",
   "app.containers.Admin.reporting.resultsSection": "RESULTADOS",
+  "app.containers.Admin.reporting.warningBanner": "En esta página, el informe muestra los últimos datos de la plataforma. En otras páginas, se muestra una instantánea del informe. Las instantáneas se toman cuando guardas el informe en esta página.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Crear nuevo token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancelar",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Se ha creado tu ficha. Por favor, copia el siguiente {secret} y guárdalo de forma segura.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Editar el contenido de la encuesta",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Ya han empezado a llegar las respuestas a esta encuesta. Los cambios en la encuesta pueden dar lugar a la pérdida de datos y a datos incompletos en los archivos exportados.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Carga del archivo",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Volver",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Las respuestas a las preguntas de respuesta corta y larga solo están disponibles actualmente en la descarga de la encuesta",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Escala lineal",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Respuesta larga",

From e9bdafbaa9ddb041f25e0a67de55d1e1361d6a1d Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:24 +0100
Subject: [PATCH 187/282] New translations en.json (Arabic)

---
 front/app/translations/admin/ar-SA.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index fb7b73fe015f..e0199439b7a4 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "هنا",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "قبل المتابعة",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "بعد إنشاء التقرير، يمكنك اختيار مشاركته مع الجمهور بمجرد بدء المرحلة.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "قم بإنشاء صفحة أكثر تعقيدًا لمشاركة المعلومات",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "إنشاء تقرير إلى:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "إنشاء تقرير",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "قم بإنشاء تقرير لمرحلة سابقة، أو ابدأ من الصفر.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "هذا التقرير ليس عاما. ولجعله عامًا، قم بتمكين التبديل \"مرئي\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "لقد بدأت هذه المرحلة، لكن التقرير لم يُنشر بعد. ولجعله عامًا، قم بتمكين التبديل \"مرئي\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "ابدأ بقالب المرحلة",
   "app.containers.Admin.projects.project.information.ReportTab.report": "تقرير",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "التقرير مرئي للعامة",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "مشاركة نتائج الاستطلاع أو مرحلة التفكير السابقة",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "سيكون هذا متاحًا للجمهور بمجرد بدء هذه المرحلة.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "مرئي",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "سيكون هذا التقرير متاحًا للعامة بمجرد بدء المرحلة. ولجعلها غير عامة، قم بتعطيل مفتاح التبديل \"مرئي\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "هذا التقرير متاح للعامة حاليًا. ولجعلها غير عامة، قم بتعطيل مفتاح التبديل \"مرئي\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "هل أنت متأكد أنك تريد حذف هذا التقرير؟ لا يمكن التراجع عن هذا الإجراء.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "أضف إلى المرحلة",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "تحتاج إلى الموافقة على هذا قبل أن تتمكن من المتابعة",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "أداة إنشاء التقرير",
   "app.containers.Admin.reporting.reportHeader": "ترويسة التقرير",
   "app.containers.Admin.reporting.resultsSection": "النتائج",
+  "app.containers.Admin.reporting.warningBanner": "في هذه الصفحة، يعرض التقرير أحدث بيانات النظام الأساسي. وفي الصفحات الأخرى، تظهر لقطة من التقرير. يتم التقاط اللقطات عند حفظ التقرير على هذه الصفحة.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "إنشاء رمز جديد",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "يلغي",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "تم إنشاء الرمز المميز الخاص بك. يرجى نسخ {secret} أدناه وتخزينه بأمان.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "تعديل محتوى الاستبيان",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "لقد بدأت عمليات الإرسال لهذا الاستطلاع في الوصول. قد تؤدي التغييرات في الاستطلاع إلى فقدان البيانات وعدم اكتمال البيانات في الملفات المصدرة.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "تحميل الملف",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "عُد",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "لا تتوفر الردود على أسئلة الإجابات القصيرة والمطولة حاليًا إلا في الاستبيان الذي تم تنزيله",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "مقياس خطي",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "اجابة طويلة",

From 3a95aa7d9d9d70a2d90d17fb4d6af83e3e4ef2bd Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:26 +0100
Subject: [PATCH 188/282] New translations en.json (Danish)

---
 front/app/translations/admin/da-DK.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 0f96c4448c95..788b79e2203a 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "Lær, hvordan du opretter en workshop",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Før du fortsætter",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Når du har oprettet en rapport, kan du vælge at dele den med offentligheden, når fasen starter.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Opret en mere kompleks side til informationsdeling",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Opret en rapport til:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Opret en rapport",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Opret en rapport for en tidligere fase, eller start forfra.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Denne rapport er ikke offentlig. For at gøre den offentlig skal du aktivere \"Synlig\"-knappen.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Denne fase er startet, men rapporten er ikke offentlig endnu. For at gøre den offentlig skal du aktivere \"Synlig\"-knappen.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start med en faseskabelon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport synlig for offentligheden",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Del resultaterne af en tidligere survey eller idéfase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Dette vil være offentligt tilgængeligt for brugerne, så snart denne fase starter.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Synlig",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Denne rapport vil være offentlig, så snart fasen starter. Hvis du ikke vil offentliggøre den, skal du deaktivere \"Synlig\"-knappen.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Denne rapport er i øjeblikket offentlig. Hvis du ikke vil offentliggøre den, skal du slå \"Synlig\" fra.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Er du sikker på, at du vil slette denne rapport? Handligen kan ikke fortrydes.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Tilføj til fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Du skal give dit samtykke, før du kan fortsætte.",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Rapportbygger",
   "app.containers.Admin.reporting.reportHeader": "Rapports overskrift",
   "app.containers.Admin.reporting.resultsSection": "RESULTATER",
+  "app.containers.Admin.reporting.warningBanner": "På denne side viser rapporten de seneste platformdata. På andre sider vises et øjebliksbillede af rapporten. Snapshots tages, når du gemmer rapporten på denne side.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Opret nyt token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuller",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Dit token er blevet oprettet. Kopier venligst {secret} nedenfor og opbevar den sikkert.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Rediger undersøgelsesindhold",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Besvarelserne til denne undersøgelse er begyndt at komme ind. Ændringer i undersøgelsen kan resultere i tab af data og ufuldstændige data i de eksporterede filer.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Upload af fil",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Gå tilbage",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Svarene på spørgsmål med korte og lange svar er i øjeblikket kun tilgængelige i download af undersøgelsen",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Lineær skala",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Langt svar",

From fe9955323c623c371bbb7ff92ac8cff8607cc59a Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:27 +0100
Subject: [PATCH 189/282] New translations en.json (German)

---
 front/app/translations/admin/de-DE.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index f3cc556c95ec..cfc659061b27 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "hier",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Bevor Sie fortfahren",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Nachdem Sie einen Bericht erstellt haben, können Sie ihn für die Öffentlichkeit freigeben, sobald die Phase beginnt.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Erstellen Sie eine komplexere Seite für den Informationsaustausch",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Erstellen Sie einen Bericht um:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Bericht erstellen",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Erstellen Sie einen Bericht für eine vergangene Phase oder beginnen Sie von Grund auf neu.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Dieser Bericht ist nicht öffentlich. Um ihn öffentlich zu machen, aktivieren Sie den Schalter \"Sichtbar\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Diese Phase hat begonnen, aber der Bericht ist noch nicht öffentlich. Um ihn öffentlich zu machen, aktivieren Sie den Schalter \"Sichtbar\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Mit einer Projektvorlage beginnen",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Bericht",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Bericht öffentlich sichtbar",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Teilen Sie die Ergebnisse einer vergangenen Umfrage oder Ideenfindung",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Sobald diese Phase beginnt, wird der Bericht für Nutzer*innen öffentlich zugänglich sein.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Sichtbar",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Dieser Bericht wird veröffentlicht, sobald die Phase beginnt. Um ihn nicht zu veröffentlichen, deaktivieren Sie den Schalter \"Sichtbar\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Dieser Bericht ist derzeit öffentlich. Um ihn nicht zu veröffentlichen, deaktivieren Sie den Schalter \"Sichtbar\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Sind Sie sicher, dass Sie diesen Beitrag löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Zur Phase hinzufügen",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Sie müssen zustimmen, bevor Sie fortfahren können",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Report Builder",
   "app.containers.Admin.reporting.reportHeader": "Berichtskopf",
   "app.containers.Admin.reporting.resultsSection": "ERGEBNISSE",
+  "app.containers.Admin.reporting.warningBanner": "Auf dieser Seite zeigt der Bericht die neuesten Plattformdaten an. Auf anderen Seiten wird ein Schnappschuss des Berichts angezeigt. Schnappschüsse werden erstellt, wenn Sie den Bericht auf dieser Seite speichern.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Neues Token erstellen",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Abbrechen",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Ihr Token wurde erstellt. Bitte kopieren Sie das {secret} unten und bewahren Sie es sicher auf.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Inhalt der Umfrage bearbeiten",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Die ersten Einsendungen für diese Umfrage sind bereits eingetroffen. Änderungen an der Umfrage können zu Datenverlusten und unvollständigen Daten in den exportierten Dateien führen.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Dateien hochladen",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Zurück",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Die Antworten auf die Fragen mit kurzen und langen Antworten sind derzeit nur im Download der Umfrage verfügbar.",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Lineare Skala",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Lange Antwort",

From 922fa0b03d754b680450050360e14ecd65e06172 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:29 +0100
Subject: [PATCH 190/282] New translations en.json (Finnish)

---
 front/app/translations/admin/fi-FI.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index 5823f2d868c5..314387ed7576 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "tässä",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Ennen kuin jatkat",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Kun olet luonut raportin, voit halutessasi jakaa sen julkisesti vaiheen alkaessa.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Luo monimutkaisempi sivu tiedon jakamista varten",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Luo raportti:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Luo raportti",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Luo raportti menneestä vaiheesta tai aloita alusta.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Tämä raportti ei ole julkinen. Jos haluat tehdä sen julkiseksi, ota Näkyvä-kytkin käyttöön.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Tämä vaihe on alkanut, mutta raportti ei ole vielä julkinen. Jos haluat tehdä sen julkiseksi, ota Näkyvä-kytkin käyttöön.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Aloita vaihemallilla",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Raportoi",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Raportti näkyy julkisesti",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Jaa aiemman kyselyn tai ideointivaiheen tulokset",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Tämä on julkisesti käyttäjien saatavilla heti tämän vaiheen alkaessa.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Näkyy",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Tämä raportti julkistetaan heti vaiheen alkaessa. Jos haluat, että se ei ole julkinen, poista Näkyvä-kytkin käytöstä.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Tämä raportti on tällä hetkellä julkinen. Jos haluat, että se ei ole julkinen, poista Näkyvä-kytkin käytöstä.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Haluatko varmasti poistaa tämän raportin? Tätä toimintoa ei voi kumota.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Lisää vaiheeseen",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Sinun on hyväksyttävä tämä ennen kuin voit jatkaa",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Raportin rakentaja",
   "app.containers.Admin.reporting.reportHeader": "Raportin otsikko",
   "app.containers.Admin.reporting.resultsSection": "TULOKSET",
+  "app.containers.Admin.reporting.warningBanner": "Tällä sivulla raportti näyttää uusimmat alustatiedot. Muilla sivuilla näytetään tilannekuva raportista. Tilannekuvia otetaan, kun tallennat raportin tälle sivulle.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Luo uusi tunnus",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Peruuttaa",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Tunnus on luotu. Kopioi alla oleva {secret} ja säilytä se turvallisesti.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Muokkaa kyselyn sisältöä",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Tähän kyselyyn on alkanut saapua palautetta. Kyselyyn tehdyt muutokset voivat johtaa tietojen katoamiseen ja epätäydellisiin tietoihin viedyissä tiedostoissa.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Tiedoston lataus",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Mene takaisin",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Vastaukset lyhyisiin ja pitkiin vastauskysymyksiin ovat tällä hetkellä saatavilla vain kyselyn latauksessa",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Lineaarinen asteikko",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Pitkä vastaus",

From 310909bce8bc43c881878b14cdb7239a29c839b4 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:30 +0100
Subject: [PATCH 191/282] New translations en.json (Dutch)

---
 front/app/translations/admin/nl-NL.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index 3e1db7089fa3..4629a4bd658e 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "hier",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Voordat je verder gaat",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Nadat je een rapport hebt gemaakt, kun je ervoor kiezen om het met het publiek te delen zodra de fase begint.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Een complexere pagina te maken om informatie te delen",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Maak een rapport om:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Maak een rapport",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Maak een rapport voor een eerdere fase of begin helemaal opnieuw.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Dit rapport is niet openbaar. Om het openbaar te maken, schakel je de \"Zichtbaar\" knop in.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Deze fase is gestart, maar het rapport is nog niet openbaar. Om het openbaar te maken, schakel je de knop \"Zichtbaar\" in.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Begin met een fasesjabloon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport zichtbaar voor publiek",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "De resultaten van een eerdere vragenlijst of fase waarin ideeën zijn verzameld te delen",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Dit zal publiekelijk zichtbaar zijn voor gebruikers zodra deze fase van start gaat.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Zichtbaar",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Dit rapport wordt openbaar zodra de fase begint. Om het niet openbaar te maken, schakel je de \"Zichtbaar\" knop uit.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Dit rapport is momenteel openbaar. Om het niet openbaar te maken, schakel je de \"Zichtbaar\" knop uit.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Weet je zeker dat je dit rapport wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Toevoegen aan fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Je moet hiermee instemmen voordat je verder kunt gaan",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Rapport vormgever",
   "app.containers.Admin.reporting.reportHeader": "Koptekst rapport",
   "app.containers.Admin.reporting.resultsSection": "RESULTATEN",
+  "app.containers.Admin.reporting.warningBanner": "Op deze pagina toont het rapport de laatste platformgegevens. Op andere pagina's wordt een momentopname van het rapport getoond. Snapshots worden gemaakt wanneer je het rapport op deze pagina opslaat.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Nieuw token aanmaken",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuleren",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Je token is aangemaakt. Kopieer het {secret} hieronder en bewaar het veilig.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Bewerk inhoud van de vragenlijst",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "De inzendingen voor deze vragenlijst beginnen binnen te komen. Wijzigingen aan de vragenlijst kunnen leiden tot gegevensverlies en onvolledige gegevens in de geëxporteerde bestanden.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Bestand uploaden",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Ga terug",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Antwoorden op korte en lange antwoordvragen zijn momenteel alleen beschikbaar in de resultatendownload",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Lineaire schaal",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Lang antwoord",

From 206fa5f268870aeebec59d3524f166d4b7d9e4c5 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:32 +0100
Subject: [PATCH 192/282] New translations en.json (Norwegian)

---
 front/app/translations/admin/nb-NO.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index 70ac501248af..9585713864fe 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "her",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Før du fortsetter",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Etter å ha opprettet en rapport, kan du velge å dele den med offentligheten når fasen starter.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Lag en mer kompleks side for informasjonsdeling",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Lag en rapport til:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Lag en rapport",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Lag en rapport for en tidligere fase, eller start fra bunnen av.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Denne rapporten er ikke offentlig. For å gjøre det offentlig, aktiver \"Synlig\"-bryteren.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Denne fasen har startet, men rapporten er ikke offentlig ennå. For å gjøre det offentlig, aktiver \"Synlig\"-bryteren.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start med en fasemal",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapportere",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapporten er synlig for publikum",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Del resultater fra en tidligere undersøkelse eller idéfase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Dette vil være offentlig tilgjengelig for brukere så snart denne fasen starter.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Synlig",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Denne rapporten vil være offentlig så snart fasen starter. For å gjøre det ikke offentlig, deaktiver \"Synlig\"-bryteren.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Denne rapporten er for øyeblikket offentlig. For å gjøre det ikke offentlig, deaktiver \"Synlig\"-bryteren.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Er du sikker på at du vil slette denne rapporten? Denne handlingen kan ikke angres.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Legg til fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Du må samtykke til dette før du kan fortsette",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Rapportbygger",
   "app.containers.Admin.reporting.reportHeader": "Rapport overskrift",
   "app.containers.Admin.reporting.resultsSection": "RESULTATER",
+  "app.containers.Admin.reporting.warningBanner": "På denne siden viser rapporten de nyeste plattformdataene. På andre sider vises et øyeblikksbilde av rapporten. Øyeblikksbilder tas når du lagrer rapporten på denne siden.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Opprett nytt token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Avbryt",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Tokenet ditt er opprettet. Vennligst kopier {secret} en nedenfor og oppbevar den trygt.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Rediger spørreundersøkelsesinnhold",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Innleveringer til denne undersøkelsen har begynt å komme inn. Endringer i undersøkelsen kan føre til tap av data og ufullstendige data i de eksporterte filene.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Filopplasting",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Gå tilbake",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Svar på spørsmål med korte og lange svar er for øyeblikket bare tilgjengelig i nedlasting av spørreundersøkelsen",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Lineær skala",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Langt svar",

From e59eaef4d92b8fa05420846a7e0a666ab2de40a3 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:33 +0100
Subject: [PATCH 193/282] New translations en.json (Polish)

---
 front/app/translations/admin/pl-PL.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index bf5dadd7bb6a..4325312ca054 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "tutaj",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Zanim przejdziesz dalej",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Po utworzeniu raportu możesz udostępnić go publicznie po rozpoczęciu fazy.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Utwórz bardziej złożoną stronę do udostępniania informacji",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Utwórz raport do:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Utwórz raport",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Utwórz raport dla poprzedniej fazy lub zacznij od zera.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Ten raport nie jest publiczny. Aby go upublicznić, włącz przełącznik \"Widoczny\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Ta faza została rozpoczęta, ale raport nie jest jeszcze dostępny publicznie. Aby go upublicznić, włącz przełącznik \"Widoczny\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Zacznij od szablonu fazy",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Raport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Raport widoczny publicznie",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Podziel się wynikami wcześniejszej ankiety lub fazy tworzenia pomysłów.",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Będą one publicznie dostępne dla użytkowników zaraz po rozpoczęciu tej fazy.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Widoczny",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Ten raport zostanie upubliczniony zaraz po rozpoczęciu fazy. Aby go nie upubliczniać, wyłącz przełącznik \"Widoczny\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Ten raport jest obecnie publiczny. Aby go wyłączyć, wyłącz przełącznik \"Widoczny\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Czy na pewno chcesz usunąć ten raport? Tej czynności nie można cofnąć.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Dodaj do fazy",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Musisz wyrazić na to zgodę, zanim będziesz mógł kontynuować",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Kreator raportu",
   "app.containers.Admin.reporting.reportHeader": "Nagłówek raportu",
   "app.containers.Admin.reporting.resultsSection": "WYNIKI",
+  "app.containers.Admin.reporting.warningBanner": "Na tej stronie raport przedstawia najnowsze dane platformy. Na innych stronach wyświetlana jest migawka raportu. Migawki są tworzone, gdy zapisujesz raport na tej stronie.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Utwórz nowy token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Anuluj",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Twój token został utworzony. Skopiuj poniższy adres {secret} i przechowuj go w bezpiecznym miejscu.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Edycja treści ankiety",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Zaczęły napływać zgłoszenia do tej ankiety. Zmiany w ankiecie mogą spowodować utratę danych i niekompletne dane w wyeksportowanych plikach.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Przesyłanie plików",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Wróć",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Odpowiedzi na pytania z krótką i długą odpowiedzią są obecnie dostępne tylko w pliku do pobrania z ankiety",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Skala liniowa",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Długa odpowiedź",

From ff87c9ee98401e1d7fb2ffb03d2866dcf414b8ed Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:35 +0100
Subject: [PATCH 194/282] New translations en.json (Serbian (Cyrillic))

---
 front/app/translations/admin/sr-SP.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index a538f5c94740..fbfeb151f45c 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "хттпс://опенаи.цом/апи-дата-приваци",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "овде",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Пре него што наставите",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "After creating a report, you can choose to share it with the public once the phase starts.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Create a more complex page for information sharing",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Create a report to:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Create a report",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "This report is not public. To make it public, enable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "This phase has started, but the report is not public yet. To make it public, enable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "This will be publicly available to users as soon as this phase starts.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "This report will be public as soon as the phase starts. To make it not public, disable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "This report is currently public. To make it not public, disable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Да ли сте сигурни да желите да избришете овај извештај? Ова радња се не може опозвати.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Додајте у фазу",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Морате да пристанете на ово пре него што наставите",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Градитељ извештаја",
   "app.containers.Admin.reporting.reportHeader": "Заглавље извештаја",
   "app.containers.Admin.reporting.resultsSection": "РЕЗУЛТАТИ",
+  "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Креирајте нови токен",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Поништити, отказати",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Your token has been created. Please copy the {secret} below and store it safely.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Уредите садржај анкете",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Почели су да пристижу пријаве за ову анкету. Промене у анкети могу довести до губитка података и непотпуних података у извезеним датотекама.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "File upload",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Go back",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Одговори на питања са кратким и дугим одговорима тренутно су доступни само у преузимању анкете",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Линеарна скала",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Дуг одговор",

From 794fdaf177bc759836a10d2bb0d3380ba9716a4d Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:36 +0100
Subject: [PATCH 195/282] New translations en.json (Swedish)

---
 front/app/translations/admin/sv-SE.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 8f64cbad0465..feaae3cd033e 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "här",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Innan du fortsätter",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "När du har skapat en rapport kan du välja att dela den med allmänheten när fasen startar.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Skapa en mer komplex sida för informationsdelning",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Skapa en rapport till:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Skapa en rapport",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Skapa en rapport för en tidigare fas eller börja om från början.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Denna rapport är inte offentlig. För att göra den offentlig, aktivera knappen \"Synlig\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Denna fas har startat, men rapporten är ännu inte offentlig. För att göra den offentlig, aktivera växeln \"Synlig\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Börja med en fasmall",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport synlig för allmänheten",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Dela med dig av resultaten från en tidigare undersökning eller idéfas",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Detta kommer att vara offentligt tillgängligt för användarna så snart denna fas startar.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Synlig",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Denna rapport kommer att vara offentlig så snart fasen startar. Om du inte vill att den ska vara offentlig avaktiverar du knappen \"Synlig\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Denna rapport är för närvarande offentlig. Om du vill att den inte ska vara offentlig inaktiverar du knappen \"Synlig\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Är du säker på att du vill ta bort denna rapport? Denna åtgärd kan inte ångras.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Lägg till fas",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Du måste godkänna detta innan du kan fortsätta",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Rapportbyggare",
   "app.containers.Admin.reporting.reportHeader": "Rapportrubrik",
   "app.containers.Admin.reporting.resultsSection": "RESULTAT",
+  "app.containers.Admin.reporting.warningBanner": "På den här sidan visar rapporten de senaste plattformsdata. På andra sidor visas en ögonblicksbild av rapporten. Ögonblicksbilder tas när du sparar rapporten på den här sidan.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Skapa ny token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Avbryt",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Din token har skapats. Kopiera {secret} nedan och spara den på ett säkert sätt.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Redigera innehåll i undersökningen",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Bidragen till denna undersökning har börjat komma in. Ändringar i undersökningen kan leda till dataförluster och ofullständiga data i de exporterade filerna.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Uppladdning av filer",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Gå tillbaka",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Svar på frågor med korta och långa svar är för närvarande endast tillgängliga när undersökningen laddas ner.",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Linjär skala",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Långt svar",

From cb9204b00fd5ba216a8749b7951373cf8ed382a8 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:38 +0100
Subject: [PATCH 196/282] New translations en.json (Turkish)

---
 front/app/translations/admin/tr-TR.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index 0ebd60d2ac48..403505d8a10b 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "Burada",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Devam etmeden önce",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Bir rapor oluşturduktan sonra, aşama başladığında bunu kamuoyu ile paylaşmayı seçebilirsiniz.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Bilgi paylaşımı için daha karmaşık bir sayfa oluşturun",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Bir rapor oluşturun:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Bir rapor oluşturun",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Geçmiş bir aşama için rapor oluşturun veya sıfırdan başlayın.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Bu rapor herkese açık değildir. Herkese açık hale getirmek için \"Görünür\" geçişini etkinleştirin.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Bu aşama başladı, ancak rapor henüz herkese açık değil. Herkese açık hale getirmek için \"Görünür\" geçişini etkinleştirin.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Bir faz şablonu ile başlayın",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapor",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Kamuoyu tarafından görülebilen rapor",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Geçmiş bir anketin veya fikir aşamasının sonuçlarını paylaşın",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Bu aşama başlar başlamaz kullanıcılara açık olacaktır.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Görünür",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Bu rapor, aşama başlar başlamaz herkese açık olacaktır. Herkese açık olmaması için \"Görünür\" geçişini devre dışı bırakın.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Bu rapor şu anda herkese açıktır. Herkese açık olmaması için \"Görünür\" geçişini devre dışı bırakın.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Bu raporu silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Faza ekle",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Devam edebilmeniz için buna onay vermeniz gerekir",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Rapor oluşturucu",
   "app.containers.Admin.reporting.reportHeader": "Rapor başlığı",
   "app.containers.Admin.reporting.resultsSection": "SONUÇLAR",
+  "app.containers.Admin.reporting.warningBanner": "Bu sayfada, rapor en son platform verilerini gösterir. Diğer sayfalarda raporun bir anlık görüntüsü gösterilir. Anlık görüntüler, raporu bu sayfada kaydettiğinizde alınır.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Yeni belirteç oluşturun",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "İptal",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Jetonunuz oluşturulmuştur. Lütfen aşağıdaki {secret} adresini kopyalayın ve güvenli bir şekilde saklayın.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Anket içeriğini düzenleme",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Bu ankete başvurular gelmeye başlamıştır. Ankette yapılan değişiklikler veri kaybına ve dışa aktarılan dosyalarda eksik verilere neden olabilir.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Dosya yükleme",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Geri dön",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Kısa ve uzun cevaplı sorulara verilen yanıtlar şu anda yalnızca anketin indirilmesinde mevcuttur",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Doğrusal ölçek",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Uzun cevap",

From 3d7e34af114aa0e82102416ad2ff6a34c65863d6 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:40 +0100
Subject: [PATCH 197/282] New translations en.json (Portuguese, Brazilian)

---
 front/app/translations/admin/pt-BR.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index cc29c408476e..5657ddb75e88 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "aqui",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Antes de continuar",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Depois de criar um relatório, você pode optar por compartilhá-lo com o público assim que a fase começar.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Criar uma página mais complexa para o compartilhamento de informações",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Crie um relatório para você:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Criar um relatório",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crie um relatório para uma fase anterior ou comece do zero.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Este relatório não é público. Para torná-lo público, ative o botão de alternância \"Visível\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Essa fase foi iniciada, mas o relatório ainda não é público. Para torná-lo público, ative o botão de alternância \"Visível\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Comece com um modelo de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Relatório",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Relatório visível para o público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Compartilhe os resultados de uma pesquisa anterior ou da fase de ideação",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Isso estará disponível publicamente para os usuários assim que essa fase for iniciada.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visível",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Esse relatório se tornará público assim que a fase começar. Para que ele não seja público, desative o botão \"Visível\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "No momento, este relatório é público. Para torná-lo não público, desative a opção \"Visível\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Você tem certeza de que deseja excluir este relatório? Essa ação não pode ser desfeita.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Adicionar à fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Você precisa consentir com isso antes de continuar",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Elaboração de Relatórios",
   "app.containers.Admin.reporting.reportHeader": "Cabeçalho do relatório",
   "app.containers.Admin.reporting.resultsSection": "RESULTADOS",
+  "app.containers.Admin.reporting.warningBanner": "Nesta página, o relatório mostra os dados mais recentes da plataforma. Em outras páginas, é mostrado um instantâneo do relatório. Os instantâneos são tirados quando você salva o relatório nessa página.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Criar nova ficha",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancelar",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Seu token foi criado. Copie o endereço {secret} abaixo e guarde-o com segurança.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Editar o conteúdo da pesquisa",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Os envios para esta pesquisa começaram a chegar. Alterações na pesquisa podem resultar em perda de dados e dados incompletos nos arquivos exportados.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Carregamento de arquivos",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Voltar",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "As respostas a perguntas de resposta curta e longa estão atualmente disponíveis apenas no download da pesquisa",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Escala linear",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Resposta longa",

From ad518c7580cdd7d9198b42404cfa745108dbfb64 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:41 +0100
Subject: [PATCH 198/282] New translations en.json (Spanish, Chile)

---
 front/app/translations/admin/es-CL.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index d5695c4c8d9f..0ddc8835fe2f 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy/es",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "aquí",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Antes de continuar",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Después de crear un informe, puedes elegir compartirlo con el público una vez iniciada la fase.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Crear una página más compleja para compartir información",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Crea un informe para:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Crear un informe",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Crea un informe para una fase anterior, o empieza desde cero.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Este informe no es público. Para hacerlo público, activa el conmutador \"Visible\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Esta fase ha comenzado, pero el informe aún no es público. Para hacerlo público, activa el conmutador \"Visible\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Empieza con una plantilla de fase",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Reporte",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Informe visible para el público",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Comparte los resultados de una encuesta pasada o de una fase de ideación",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Estará a disposición pública de los usuarios en cuanto comience esta fase.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Este informe será público en cuanto comience la fase. Para que no sea público, desactiva el conmutador \"Visible\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Este informe es actualmente público. Para que no sea público, desactiva el conmutador \"Visible\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "¿Estás seguro de que deseas eliminar esta entrada? Esta acción no se puede deshacer.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Añadir a la fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Tienes que dar tu consentimiento antes de continuar",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Constructor de informes",
   "app.containers.Admin.reporting.reportHeader": "Encabezado del informe",
   "app.containers.Admin.reporting.resultsSection": "RESULTADOS",
+  "app.containers.Admin.reporting.warningBanner": "En esta página, el informe muestra los últimos datos de la plataforma. En otras páginas, se muestra una instantánea del informe. Las instantáneas se toman cuando guardas el informe en esta página.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Crear nuevo token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancelar",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Se ha creado tu ficha. Por favor, copia el siguiente {secret} y guárdalo de forma segura.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Editar el contenido de la encuesta",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Ya han empezado a llegar las respuestas a esta encuesta. Los cambios en la encuesta pueden dar lugar a la pérdida de datos y a datos incompletos en los archivos exportados.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Carga del archivo",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Volver",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Las respuestas a las preguntas cortas y largas sólo están disponibles en la descarga de la encuesta",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Escala lineal",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Respuesta larga",

From 29d9c07f204d6a5d0a0f2e734370c7cb9f3cd5b3 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:43 +0100
Subject: [PATCH 199/282] New translations en.json (Croatian)

---
 front/app/translations/admin/hr-HR.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index da024a657975..7002234e5808 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "ovdje",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Prije nego nastavite",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Nakon što izradite izvješće, možete ga podijeliti s javnošću nakon što faza započne.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Napravite složeniju stranicu za razmjenu informacija",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Napravite izvješće za:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Napravi izvješće",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Napravite izvješće za prošlu fazu ili počnite od nule.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Ovo izvješće nije javno. Da biste ga učinili javnim, omogućite prekidač \"Vidljivo\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Ova faza je započela, ali izvješće još nije javno. Da biste ga učinili javnim, omogućite prekidač \"Vidljivo\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Počnite s predloškom faze",
   "app.containers.Admin.projects.project.information.ReportTab.report": "izvješće",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Izvještaj vidljiv javnosti",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Podijelite rezultate prošlog istraživanja ili faze razmišljanja",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Ovo će biti javno dostupno korisnicima čim ova faza započne.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Vidljivo",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Ovo će izvješće biti javno čim faza započne. Da ne bude javno, onemogućite prekidač \"Vidljivo\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Ovo izvješće je trenutno javno. Da ne bude javno, onemogućite prekidač \"Vidljivo\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Jeste li sigurni da želite izbrisati ovo izvješće? Ova se radnja ne može poništiti.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Dodaj u fazu",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Morate pristati na ovo prije nego što možete nastaviti",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Alat za izgradnju izvješća",
   "app.containers.Admin.reporting.reportHeader": "Zaglavlje izvješća",
   "app.containers.Admin.reporting.resultsSection": "REZULTATI",
+  "app.containers.Admin.reporting.warningBanner": "Na ovoj stranici izvješće prikazuje najnovije podatke o platformi. Na ostalim stranicama prikazuje se snimka izvješća. Snimke se prave kada spremite izvješće na ovu stranicu.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Stvorite novi token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Otkazati",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Vaš token je stvoren. Kopirajte {secret} ispod i pohranite je na sigurno.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Uredi sadržaj upitnika",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Počeli su pristizati zahtjevi za ovu anketu. Promjene u anketi mogu dovesti do gubitka podataka i nepotpunih podataka u izvezenim datotekama.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Prijenos datoteke",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Idi natrag",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Odgovori na pitanja s kratkim i dugim odgovorima trenutačno su dostupni samo s preuzimanjem upitnika",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Linearna ljestvica",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Dug odgovor",

From d58ef184cc73cfd0a17af57b6e98b78a2134a888 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:44 +0100
Subject: [PATCH 200/282] New translations en.json (Latvian)

---
 front/app/translations/admin/lv-LV.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 3949a6fabeca..bb5626155dd1 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "šeit",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Pirms turpināt",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Pēc ziņojuma izveides varat izvēlēties to kopīgot ar sabiedrību, tiklīdz posms ir sācies.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Sarežģītākas informācijas kopīgošanas lapas izveide",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Izveidojiet ziņojumu, lai:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Izveidot ziņojumu",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Izveidojiet pārskatu par iepriekšējo posmu vai sāciet no jauna.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Šis ziņojums nav publiski pieejams. Lai padarītu to publiski pieejamu, aktivizējiet slēdzi \"Redzams\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Šis posms ir sācies, bet ziņojums vēl nav publiski pieejams. Lai to padarītu publiski pieejamu, aktivizējiet pārslēdzēju \"Redzams\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Sāciet ar fāzes veidni",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Ziņojums",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Publiski redzams ziņojums",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Kopīgojiet iepriekš veiktas aptaujas vai ideju izstrādes posma rezultātus.",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Tas būs publiski pieejams lietotājiem, tiklīdz sāksies šis posms.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Redzams",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Šis ziņojums tiks publiskots, tiklīdz posms sāksies. Lai tas nebūtu publiski pieejams, izslēdziet slēdzi \"Redzams\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Šis ziņojums pašlaik ir publiski pieejams. Lai tas nebūtu publiski pieejams, izslēdziet slēdzi \"Redzams\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Vai esat pārliecināts, ka vēlaties dzēst šo ziņojumu? Šo darbību nevar atcelt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Pievienot fāzei",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Pirms turpināt darbu, jums tam ir jāpiekrīt.",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Ziņojuma veidotājs",
   "app.containers.Admin.reporting.reportHeader": "Ziņojuma galvene",
   "app.containers.Admin.reporting.resultsSection": "REZULTĀTI",
+  "app.containers.Admin.reporting.warningBanner": "Šajā lapā pārskatā ir norādīti jaunākie platformas dati. Citās lapās tiek parādīts ziņojuma momentuzņēmums. Kad saglabājat ziņojumu šajā lapā, tiek veikti momentuzņēmumi.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Izveidot jaunu žetonu",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Atcelt",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Jūsu žetons ir izveidots. Lūdzu, nokopējiet zemāk redzamo {secret} un droši uzglabājiet to.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Aptaujas satura rediģēšana",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Ir sākuši pienākt iesniegumi šai aptaujai. Apsekojuma izmaiņu rezultātā eksportētajos failos var tikt zaudēti dati un tie var būt nepilnīgi.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Failu augšupielāde",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Atgriezties",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Atbildes uz jautājumiem ar īsām un garām atbildēm pašlaik ir pieejamas tikai apsekojuma lejupielādē.",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Lineārā skala",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Garā atbilde",

From 83dbf9b8b1795942dec994c6e754aaa0952d2882 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:46 +0100
Subject: [PATCH 201/282] New translations en.json (English, Canada)

---
 front/app/translations/admin/en-CA.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index 71bfca0ba54d..c1152129b51e 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "here",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Before you continue",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "After creating a report, you can choose to share it with the public once the phase starts.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Create a more complex page for information sharing",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Create a report to:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Create a report",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "This report is not public. To make it public, enable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "This phase has started, but the report is not public yet. To make it public, enable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "This will be publicly available to users as soon as this phase starts.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "This report will be public as soon as the phase starts. To make it not public, disable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "This report is currently public. To make it not public, disable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "You need to consent to this before you can continue",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Report builder",
   "app.containers.Admin.reporting.reportHeader": "Report header",
   "app.containers.Admin.reporting.resultsSection": "RESULTS",
+  "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Create new token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancel",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Your token has been created. Please copy the {secret} below and store it safely.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Edit survey content",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Submissions to this survey have started to come in. Changes to the survey may result in data loss and incomplete data in the exported files.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "File upload",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Go back",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Responses to short and long answer questions are currently only available in the survey download",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Linear scale",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Long answer",

From 2050a6d3bc2f5a37f0e24155a208a3259e0a6c79 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:48 +0100
Subject: [PATCH 202/282] New translations en.json (English, United Kingdom)

---
 front/app/translations/admin/en-GB.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index 7aea31291c17..46fc7ac4ce0d 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "here",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Before you continue",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "After creating a report, you can choose to share it with the public once the phase starts.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Create a more complex page for information sharing",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Create a report to:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Create a report",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "This report is not public. To make it public, enable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "This phase has started, but the report is not public yet. To make it public, enable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "This will be publicly available to users as soon as this phase starts.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "This report will be public as soon as the phase starts. To make it not public, disable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "This report is currently public. To make it not public, disable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "You need to consent to this before you can continue",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Report builder",
   "app.containers.Admin.reporting.reportHeader": "Report header",
   "app.containers.Admin.reporting.resultsSection": "RESULTS",
+  "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Create new token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancel",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Your token has been created. Please copy the {secret} below and store it safely.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Edit survey content",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Submissions to this survey have started to come in. Changes to the survey may result in data loss and incomplete data in the exported files.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "File upload",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Go back",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Responses to short and long answer questions are currently only available in the survey download",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Linear scale",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Long answer",

From 41d6b811124faebc083ebfcf46af4a72561f8dc8 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:49 +0100
Subject: [PATCH 203/282] New translations en.json (Serbian (Latin))

---
 front/app/translations/admin/sr-Latn.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index 528d6ed844c7..0d3ed68f26fb 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "here",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Before you continue",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "After creating a report, you can choose to share it with the public once the phase starts.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Create a more complex page for information sharing",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Create a report to:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Create a report",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Create a report for a past phase, or start from scratch.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "This report is not public. To make it public, enable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "This phase has started, but the report is not public yet. To make it public, enable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Start with a phase template",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Report",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Report visible to public",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "Share results of a past survey or ideation phase",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "This will be publicly available to users as soon as this phase starts.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "This report will be public as soon as the phase starts. To make it not public, disable the \"Visible\" toggle.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "This report is currently public. To make it not public, disable the \"Visible\" toggle.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Are you sure you want to delete this report? This action cannot be undone.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Add to phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "You need to consent to this before you can continue",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Prijavi alatku za izradu",
   "app.containers.Admin.reporting.reportHeader": "Zaglavlje izveštaja",
   "app.containers.Admin.reporting.resultsSection": "REZULTATI",
+  "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Креирајте нови токен",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Поништити, отказати",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Your token has been created. Please copy the {secret} below and store it safely.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Uredi sadržaj ankete",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Submissions to this survey have started to come in. Changes to the survey may result in data loss and incomplete data in the exported files.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "File upload",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Go back",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Odgovori na pitanja sa kratkim i dugačkim odgovorima trenutno su dostupni samo u preuzimanju ankete",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Linearna skala",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Long answer",

From ca08ece519131f37e3d3ea45007fa2dee9568d28 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:51 +0100
Subject: [PATCH 204/282] New translations en.json (Dutch, Belgium)

---
 front/app/translations/admin/nl-BE.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index 343c84fa40c5..8185f558bdbe 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "hier",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Voordat je verder gaat",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Nadat je een rapport hebt gemaakt, kun je ervoor kiezen om het met het publiek te delen zodra de fase begint.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "Een complexere pagina te maken om informatie te delen",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Maak een rapport om:",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Maak een rapport",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Maak een rapport voor een eerdere fase of begin helemaal opnieuw.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Dit rapport is niet openbaar. Om het openbaar te maken, schakel je de \"Zichtbaar\" knop in.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Deze fase is gestart, maar het rapport is nog niet openbaar. Om het openbaar te maken, schakel je de knop \"Zichtbaar\" in.",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Begin met een fasesjabloon",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport zichtbaar voor publiek",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "De resultaten van een eerdere vragenlijst of fase waarin ideeën zijn verzameld te delen",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Dit zal publiekelijk zichtbaar zijn voor gebruikers zodra deze fase van start gaat.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Zichtbaar",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Dit rapport wordt openbaar zodra de fase begint. Om het niet openbaar te maken, schakel je de \"Zichtbaar\" knop uit.",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Dit rapport is momenteel openbaar. Om het niet openbaar te maken, schakel je de \"Zichtbaar\" knop uit.",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Weet je zeker dat je dit rapport wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Toevoegen aan fase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Je moet hiermee instemmen voordat je verder kunt gaan",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Rapportbouwer",
   "app.containers.Admin.reporting.reportHeader": "Koptekst rapport",
   "app.containers.Admin.reporting.resultsSection": "RESULTATEN",
+  "app.containers.Admin.reporting.warningBanner": "Op deze pagina toont het rapport de laatste platformgegevens. Op andere pagina's wordt een momentopname van het rapport getoond. Snapshots worden gemaakt wanneer je het rapport op deze pagina opslaat.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Nieuw token aanmaken",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuleren",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Je token is aangemaakt. Kopieer het {secret} hieronder en bewaar het veilig.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Inhoud van de enquête bewerken",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "De inzendingen voor deze vragenlijst beginnen binnen te komen. Wijzigingen aan de vragenlijst kunnen leiden tot gegevensverlies en onvolledige gegevens in de geëxporteerde bestanden.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Bestand uploaden",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Ga terug",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Antwoorden op korte en lange antwoordvragen zijn momenteel alleen beschikbaar in de enquêtedownload",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Lineaire schaal",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Lang antwoord",

From df9f0a34291ab95d2752c871e6ae183feaee97e0 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:52 +0100
Subject: [PATCH 205/282] New translations en.json (French, Belgium)

---
 front/app/translations/admin/fr-BE.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index fb4bc732a88b..516004830f5b 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "https://openai.com/api-data-privacy",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "ici",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "Avant de poursuivre",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "Après avoir créé un rapport, vous pouvez choisir de le partager avec le public dès le début de la phase.",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "créer une page plus élaborée pour le partage d'informations.",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "Créez un rapport pour :",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "Créer un rapport",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "Générez un rapport basé sur une phase précédente ou commencez avec une page blanche.",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "Ce rapport n'est pas public. Pour le rendre public, activez la case à cocher \"Visible\".",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "Cette phase a commencé, mais le rapport n'est pas encore public. Pour le rendre public, activez la case à cocher \"Visible\".",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "Commencez à partir d'un modèle",
   "app.containers.Admin.projects.project.information.ReportTab.report": "Rapport",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "Rapport visible publiquement",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "partager les résultats d'une enquête ou d'une phase de vote passée ;",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "Celui-ci sera visible par tous les utilisateurs dès le début de cette phase.",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "Visible",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "Ce rapport sera public dès le début de la phase. Pour qu'il ne soit pas public, désactivez la case à cocher \"Visible\".",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "Ce rapport est actuellement public. Pour le rendre non public, désactivez l'option \"Visible\".",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer ce rapport ? Cette action ne peut pas être annulée.",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "Ajouter à la phase",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "Vous devez donner votre accord avant de pouvoir continuer",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Constructeur de rapports",
   "app.containers.Admin.reporting.reportHeader": "En-tête du rapport",
   "app.containers.Admin.reporting.resultsSection": "RÉSULTATS",
+  "app.containers.Admin.reporting.warningBanner": "Sur cette page, le rapport présente les dernières données de la plate-forme. Sur les autres pages, un instantané du rapport est affiché. Les instantanés sont pris lorsque vous enregistrez le rapport sur cette page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Créer un nouveau jeton",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuler",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Votre jeton a été créé avec succès. Copiez le {secret} ci-dessous et conservez-le en lieu sûr.",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "Modifier le contenu de l'enquête",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "Les réponses à ce sondage commencent à arriver. Des modifications apportées au sondage pourraient entraîner des pertes de données et des données incomplètes dans les fichiers exportés.",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "Téléchargement de fichier",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "Retour",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "Les réponses aux questions à réponses courtes et longues ne sont actuellement disponibles que dans le téléchargement de l'enquête.",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "Échelle linéaire",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "Réponse longue",

From 47dcd4482ca6da017e365af00ad5aa9abe493981 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Thu, 7 Mar 2024 19:03:54 +0100
Subject: [PATCH 206/282] New translations en.json (Acholi)

---
 front/app/translations/admin/ach-UG.json | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/ach-UG.json b/front/app/translations/admin/ach-UG.json
index c3bb4711fd0d..ff6ed38fc25b 100644
--- a/front/app/translations/admin/ach-UG.json
+++ b/front/app/translations/admin/ach-UG.json
@@ -777,15 +777,19 @@
   "app.containers.Admin.projects.project.ideas.consentModalText4Link": "crwdns904173:0crwdne904173:0",
   "app.containers.Admin.projects.project.ideas.consentModalText4LinkText": "crwdns904175:0crwdne904175:0",
   "app.containers.Admin.projects.project.ideas.consentModalTitle": "crwdns904177:0crwdne904177:0",
+  "app.containers.Admin.projects.project.information.ReportTab.afterCreating": "crwdns1919518:0crwdne1919518:0",
   "app.containers.Admin.projects.project.information.ReportTab.createAMoreComplex": "crwdns1845166:0crwdne1845166:0",
   "app.containers.Admin.projects.project.information.ReportTab.createAReportTo": "crwdns1845168:0crwdne1845168:0",
   "app.containers.Admin.projects.project.information.ReportTab.createReport": "crwdns1845170:0crwdne1845170:0",
   "app.containers.Admin.projects.project.information.ReportTab.modalDescription": "crwdns1845188:0crwdne1845188:0",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleNotStarted1": "crwdns1919520:0crwdne1919520:0",
+  "app.containers.Admin.projects.project.information.ReportTab.notVisibleStarted1": "crwdns1919522:0crwdne1919522:0",
   "app.containers.Admin.projects.project.information.ReportTab.phaseTemplate": "crwdns1845190:0crwdne1845190:0",
   "app.containers.Admin.projects.project.information.ReportTab.report": "crwdns1845172:0crwdne1845172:0",
-  "app.containers.Admin.projects.project.information.ReportTab.reportVisible": "crwdns1845192:0crwdne1845192:0",
   "app.containers.Admin.projects.project.information.ReportTab.shareResults": "crwdns1845174:0crwdne1845174:0",
-  "app.containers.Admin.projects.project.information.ReportTab.thisWillBe": "crwdns1845176:0crwdne1845176:0",
+  "app.containers.Admin.projects.project.information.ReportTab.visible": "crwdns1919524:0crwdne1919524:0",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleNotStarted1": "crwdns1919526:0crwdne1919526:0",
+  "app.containers.Admin.projects.project.information.ReportTab.visibleStarted1": "crwdns1919528:0crwdne1919528:0",
   "app.containers.Admin.projects.project.information.areYouSureYouWantToDelete": "crwdns1326178:0crwdne1326178:0",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.addToPhase": "crwdns1160014:0crwdne1160014:0",
   "app.containers.Admin.projects.project.offlineInputs.ImportModal.consentNeeded": "crwdns1160016:0crwdne1160016:0",
@@ -895,6 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "crwdns210460:0crwdne210460:0",
   "app.containers.Admin.reporting.reportHeader": "crwdns210462:0crwdne210462:0",
   "app.containers.Admin.reporting.resultsSection": "crwdns210464:0crwdne210464:0",
+  "app.containers.Admin.reporting.warningBanner": "crwdns1919530:0crwdne1919530:0",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "crwdns749037:0crwdne749037:0",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "crwdns749039:0crwdne749039:0",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "crwdns1442742:0{secret}crwdne1442742:0",
@@ -1507,6 +1512,7 @@
   "app.containers.AdminPage.ProjectEdit.survey.editSurveyContent2": "crwdns211438:0crwdne211438:0",
   "app.containers.AdminPage.ProjectEdit.survey.existingSubmissionsWarning": "crwdns1159958:0crwdne1159958:0",
   "app.containers.AdminPage.ProjectEdit.survey.file_upload": "crwdns1667594:0crwdne1667594:0",
+  "app.containers.AdminPage.ProjectEdit.survey.goBackButtonMessage": "crwdns1919516:0crwdne1919516:0",
   "app.containers.AdminPage.ProjectEdit.survey.informationText2": "crwdns211440:0crwdne211440:0",
   "app.containers.AdminPage.ProjectEdit.survey.linear_scale2": "crwdns211442:0crwdne211442:0",
   "app.containers.AdminPage.ProjectEdit.survey.multiline_text2": "crwdns992743:0crwdne992743:0",

From 544ef6a578ec5f03795c97d8f7744ad3c16c1579 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Thu, 7 Mar 2024 18:50:04 +0000
Subject: [PATCH 207/282] Fix e2e tests

---
 .../report_builder/widgets/comments_by_time_widget.cy.ts | 7 +++++++
 .../report_builder/widgets/posts_by_time_widget.cy.ts    | 9 +++++++++
 2 files changed, 16 insertions(+)

diff --git a/front/cypress/e2e/report_builder/widgets/comments_by_time_widget.cy.ts b/front/cypress/e2e/report_builder/widgets/comments_by_time_widget.cy.ts
index 1c6f25853b70..194acee93ff0 100644
--- a/front/cypress/e2e/report_builder/widgets/comments_by_time_widget.cy.ts
+++ b/front/cypress/e2e/report_builder/widgets/comments_by_time_widget.cy.ts
@@ -123,10 +123,17 @@ describe('Report builder Comments By Time widget', () => {
     cy.get('.e2e-comments-by-time-widget').should('exist');
     cy.get('.e2e-comments-by-time-widget').parent().click({ force: true });
 
+    cy.wait(1000);
+
     cy.get('#e2e-delete-button').click();
 
     cy.get('.e2e-comments-by-time-widget').should('not.exist');
 
+    cy.wait(1000);
+
+    cy.intercept('PATCH', `/web_api/v1/reports/${reportId}`).as(
+      'saveReportLayout'
+    );
     cy.get('#e2e-content-builder-topbar-save').click();
     cy.wait('@saveReportLayout');
 
diff --git a/front/cypress/e2e/report_builder/widgets/posts_by_time_widget.cy.ts b/front/cypress/e2e/report_builder/widgets/posts_by_time_widget.cy.ts
index 019ae5ea0874..8c437e7615e8 100644
--- a/front/cypress/e2e/report_builder/widgets/posts_by_time_widget.cy.ts
+++ b/front/cypress/e2e/report_builder/widgets/posts_by_time_widget.cy.ts
@@ -125,7 +125,16 @@ describe('Report builder Posts By Time widget', () => {
     cy.get('#e2e-draggable-posts-by-time-widget')
       .parent()
       .click({ force: true });
+
+    cy.wait(1000);
+
     cy.get('#e2e-delete-button').click();
+
+    cy.wait(1000);
+
+    cy.intercept('PATCH', `/web_api/v1/reports/${reportId}`).as(
+      'saveReportLayout'
+    );
     cy.get('#e2e-content-builder-topbar-save').click();
     cy.wait('@saveReportLayout');
 

From c18b2665484846a0974a274029e3fd1195ec99f6 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 09:14:08 +0100
Subject: [PATCH 208/282] New translations en.json (Dutch)

---
 front/app/translations/admin/nl-NL.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index 4629a4bd658e..85d2f6aef101 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -899,7 +899,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Rapport vormgever",
   "app.containers.Admin.reporting.reportHeader": "Koptekst rapport",
   "app.containers.Admin.reporting.resultsSection": "RESULTATEN",
-  "app.containers.Admin.reporting.warningBanner": "Op deze pagina toont het rapport de laatste platformgegevens. Op andere pagina's wordt een momentopname van het rapport getoond. Snapshots worden gemaakt wanneer je het rapport op deze pagina opslaat.",
+  "app.containers.Admin.reporting.warningBanner": "Op deze pagina toont het rapport de laatste platformgegevens. Op andere pagina's wordt een momentopname van het rapport getoond. Momentopnames worden gemaakt wanneer je het rapport op deze pagina opslaat.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Nieuw token aanmaken",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuleren",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Je token is aangemaakt. Kopieer het {secret} hieronder en bewaar het veilig.",

From 7575b5dd41457735116ab05a1e0c4733bddb097e Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 10:27:59 +0100
Subject: [PATCH 209/282] New translations en.yml (Dutch)

---
 back/engines/free/email_campaigns/config/locales/nl-NL.yml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/back/engines/free/email_campaigns/config/locales/nl-NL.yml b/back/engines/free/email_campaigns/config/locales/nl-NL.yml
index f0414cc786b5..5a3434804cfc 100644
--- a/back/engines/free/email_campaigns/config/locales/nl-NL.yml
+++ b/back/engines/free/email_campaigns/config/locales/nl-NL.yml
@@ -9,7 +9,7 @@ nl:
       "comment_on_idea_you_follow": Een reactie op een idee dat je volgt
       "comment_on_initiative_you_follow": Een reactie op een voorstel dat je volgt
       "cosponsor_of_your_initiative": Een gebruiker accepteert mijn uitnodiging om mijn voorstel te steunen
-      "event_registration_confirmation": Bevestiging registratie event
+      "event_registration_confirmation": Bevestiging registratie activiteit
       "first_idea_published": Posten van mijn eerste idee
       "idea_marked_as_spam": Idee spammelding
       "idea_published": Posten van mijn idee
@@ -592,7 +592,7 @@ nl:
       content_type:
         comments: 'Reacties'
         content_moderation: 'Inhoudelijke moderatie'
-        events: 'Evenementen'
+        events: 'Activiteiten'
         general: 'Algemeen'
         inputs: 'Bijdragen'
         internal_comments: 'Interne reacties'
@@ -649,5 +649,5 @@ nl:
         voting_basket_submitted: 'Stemmen zijn ingediend'
         7_days_after_invite_is_sent: '7 dagen na verzending van de uitnodiging'
         7_days_before_the_project_changes_phase: '7 dagen voor het project van fase verandert'
-        registration_to_event: 'Registratie voor een evenement'
+        registration_to_event: 'Registratie voor een activiteit'
         survey_1_day_after_draft_saved: '1 dag nadat de gebruiker de vragenlijst voor het laatst in concept heeft opgeslagen'

From c4da7a4afc7e921db020ded4187d3ae993a97aa1 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 10:29:07 +0100
Subject: [PATCH 210/282] New translations en.json (Dutch, Belgium)

---
 front/app/translations/admin/nl-BE.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index 26fd4e3ccd48..d9d78dee48bb 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -234,7 +234,7 @@
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupport": "Geef hier de link naar je Konveio-document. Lees ons {supportArticleLink} voor meer informatie over het instellen van Konveio.",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportArticle": "support-artikel",
   "app.components.app.containers.AdminPage.ProjectEdit.konveioSupportPageURL": "https://support.citizenlab.co/en/articles/7946532-embedding-konveio-pdf-documents-for-collecting-feedback",
-  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dit is niet in je huidige abonnement inbegrepen. Neem contact op met je Government Success Manager of platformbeheerder om deze functionaliteit te ontgrendelen.",
+  "app.components.app.containers.AdminPage.ProjectEdit.lockedTooltip": "Dit is niet inbegrepen in je huidige plan. Neem contact op met je Government Success Manager of admin om het vrij te geven.",
   "app.components.app.containers.AdminPage.ProjectEdit.maxBudgetRequired": "Er is een maximumbudget nodig",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesPerOptionError": "Maximum aantal stemmen per optie moet kleiner zijn dan of gelijk aan totaal aantal stemmen",
   "app.components.app.containers.AdminPage.ProjectEdit.maxVotesRequired": "Er is een maximum aantal stemmen vereist",
@@ -900,7 +900,7 @@
   "app.containers.Admin.reporting.reportBuilder": "Rapportbouwer",
   "app.containers.Admin.reporting.reportHeader": "Koptekst rapport",
   "app.containers.Admin.reporting.resultsSection": "RESULTATEN",
-  "app.containers.Admin.reporting.warningBanner": "Op deze pagina toont het rapport de laatste platformgegevens. Op andere pagina's wordt een momentopname van het rapport getoond. Snapshots worden gemaakt wanneer je het rapport op deze pagina opslaat.",
+  "app.containers.Admin.reporting.warningBanner": "Op deze pagina toont het rapport de laatste platformgegevens. Op andere pagina's wordt een momentopname van het rapport getoond. Momentopnames worden gemaakt wanneer je het rapport op deze pagina opslaat.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Nieuw token aanmaken",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuleren",
   "app.containers.Admin.tools.apiTokens.createTokenCreatedDescription": "Je token is aangemaakt. Kopieer het {secret} hieronder en bewaar het veilig.",
@@ -2478,7 +2478,7 @@
   "app.modules.navbar.admin.containers.pageHeader": "Pagina's en menu",
   "app.modules.navbar.admin.containers.pageSubtitle": "Je navigatiebalk kan maximaal vijf pagina's weergeven naast de startpagina en de projectenpagina's. Je kunt menu-items hernoemen, opnieuw ordenen en nieuwe pagina's toevoegen met uw eigen inhoud.",
   "app.modules.project_management.admin.components.permissionsTab": "Toegangsrechten",
-  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dit is niet in je huidige abonnement inbegrepen. Neem contact op met je Government Success Manager of platformbeheerder om deze functionaliteit te ontgrendelen.",
+  "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.featureLockedReason1": "Dit is niet inbegrepen in je huidige plan. Neem contact op met je Government Success Manager of admin om het vrij te geven.",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupBySurveyQuestion": "Groepeer per enquêtevraag",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupByUserField": "Groepeer per gebruikersveld",
   "containers.Admin.reporting.components.ReportBuilder.Widgets.SurveyQuestionResultWidget.Settings.groupMode": "Groepeer modus",

From 7328e68aeb325b9053bf60c0a81b3ab6aa4d252d Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 10:29:43 +0100
Subject: [PATCH 211/282] New translations en.json (Acholi)

---
 front/app/translations/admin/ach-UG.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/translations/admin/ach-UG.json b/front/app/translations/admin/ach-UG.json
index 3011db3dd42e..c154ffa3e547 100644
--- a/front/app/translations/admin/ach-UG.json
+++ b/front/app/translations/admin/ach-UG.json
@@ -203,7 +203,7 @@
   "app.components.admin.PostManager.title": "crwdns209348:0crwdne209348:0",
   "app.components.admin.PostManager.topicsTab": "crwdns209350:0crwdne209350:0",
   "app.components.admin.PostManager.topicsTabTooltipText": "crwdns209352:0crwdne209352:0",
-  "app.components.admin.PostManager.view": "crwdns1877216:0crwdne1877216:0",
+  "app.components.admin.PostManager.view": "crwdns1919532:0crwdne1919532:0",
   "app.components.admin.PostManager.votes": "crwdns209356:0crwdne209356:0",
   "app.components.admin.PostManager.xDaysLeft": "crwdns353652:0x={x}crwdne353652:0",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "crwdns209358:0crwdne209358:0",

From 8cdb32814b0b8779241205d89e81e41cf09e50d7 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 8 Mar 2024 10:31:00 +0100
Subject: [PATCH 212/282] [TAN-1276] Fix phase_report.cy.ts

---
 front/cypress/e2e/report_builder/phase_report.cy.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/cypress/e2e/report_builder/phase_report.cy.ts b/front/cypress/e2e/report_builder/phase_report.cy.ts
index 9e793f933f78..a2509df98047 100644
--- a/front/cypress/e2e/report_builder/phase_report.cy.ts
+++ b/front/cypress/e2e/report_builder/phase_report.cy.ts
@@ -193,7 +193,7 @@ describe('Phase report', () => {
       // Make sure it does exist in current phase
       cy.visit(`/projects/${projectSlug}/2`);
       cy.get('.e2e-phase-description').contains(currentInfoPhaseTitle);
-      cy.get('#e2e-phase-report').should('exist').contains('TextEdited text.');
+      cy.get('#e2e-phase-report').should('exist').contains('Edited text.');
 
       // Make sure widget is also there
       cy.get('.recharts-surface:first').trigger('mouseover');

From ca6247fb8e03d5b6d948ca09bb281cf5edda2b8b Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 8 Mar 2024 10:39:40 +0100
Subject: [PATCH 213/282] [TAN-1276] Fix global_report.cy.ts

---
 front/cypress/e2e/report_builder/global_report.cy.ts | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/front/cypress/e2e/report_builder/global_report.cy.ts b/front/cypress/e2e/report_builder/global_report.cy.ts
index aaa387bcf424..6da492fb38b2 100644
--- a/front/cypress/e2e/report_builder/global_report.cy.ts
+++ b/front/cypress/e2e/report_builder/global_report.cy.ts
@@ -19,9 +19,8 @@ describe('Global report', () => {
       position: 'inside',
     });
 
-    // Validate it is initialized with correct text
-    cy.get('.e2e-text-box').should('exist');
-    cy.get('.e2e-text-box').should('contain.text', 'Text');
+    // Validate it is initialized with empty text
+    cy.get('.e2e-text-box').should('contain.text', '');
 
     // Edit text
     cy.get('div.e2e-text-box').click('center');
@@ -34,8 +33,8 @@ describe('Global report', () => {
     // Switch locale
     cy.get('#e2e-locale-select').select('nl-BE');
 
-    // Validate that text for other locale is present
-    cy.get('.e2e-text-box').should('contain.text', 'Tekst');
+    // Validate that text for other locale is still empty
+    cy.get('.e2e-text-box').should('contain.text', '');
 
     // Switch back
     cy.get('#e2e-locale-select').select('en');

From 397676b1426ef3b8b09c129ac58ea0e55d549af2 Mon Sep 17 00:00:00 2001
From: brentguf <brentguf@users.noreply.github.com>
Date: Fri, 8 Mar 2024 12:27:44 +0100
Subject: [PATCH 214/282] npm run lint

---
 .../GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts   | 2 +-
 .../admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts   | 2 +-
 .../GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts | 2 +-
 .../useVisitorReferrerTypes/index.ts                           | 2 +-
 .../containers/Admin/dashboard/users/Charts/AgeChart/index.tsx | 2 +-
 .../Admin/dashboard/users/Charts/GenderChart/index.tsx         | 2 +-
 front/app/containers/UsersShowPage/UserHeader.test.tsx         | 3 ++-
 7 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts b/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
index f6d909a42f15..fa667ae9f3f2 100644
--- a/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/CommentsByTimeCard/useCommentsByTime/index.ts
@@ -1,11 +1,11 @@
 import { useMemo, useState } from 'react';
 
 import { useCommentsByTimeLive } from 'api/graph_data_units';
-import { momentToIsoDate } from 'utils/dateUtils';
 
 import { getFormattedNumbers } from 'components/admin/GraphCards/_utils/parse';
 
 import { useIntl } from 'utils/cl-intl';
+import { momentToIsoDate } from 'utils/dateUtils';
 
 import { parseTimeSeries, parseExcelData } from './parse';
 import { getTranslations } from './translations';
diff --git a/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts b/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
index 2924ee249d56..43ebb4138ae3 100644
--- a/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/PostsByTimeCard/usePostsByTime/index.ts
@@ -1,11 +1,11 @@
 import { useMemo, useState } from 'react';
 
 import { usePostsByTimeLive } from 'api/graph_data_units';
-import { momentToIsoDate } from 'utils/dateUtils';
 
 import { getFormattedNumbers } from 'components/admin/GraphCards/_utils/parse';
 
 import { useIntl } from 'utils/cl-intl';
+import { momentToIsoDate } from 'utils/dateUtils';
 
 import { parseTimeSeries, parseExcelData } from './parse';
 import { getTranslations } from './translations';
diff --git a/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts b/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
index ff463416435e..04cbbe4cf1ea 100644
--- a/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
+++ b/front/app/components/admin/GraphCards/ReactionsByTimeCard/useReactionsByTime/index.ts
@@ -1,11 +1,11 @@
 import { useMemo, useState } from 'react';
 
 import { useReactionsByTimeLive } from 'api/graph_data_units';
-import { momentToIsoDate } from 'utils/dateUtils';
 
 import { getFormattedNumbers } from 'components/admin/GraphCards/_utils/parse';
 
 import { useIntl } from 'utils/cl-intl';
+import { momentToIsoDate } from 'utils/dateUtils';
 
 import { parseTimeSeries, parseExcelData } from './parse';
 import { getTranslations } from './translations';
diff --git a/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts b/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
index ad248e7760f9..f01a59cbb697 100644
--- a/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
+++ b/front/app/components/admin/GraphCards/VisitorsTrafficSourcesCard/useVisitorReferrerTypes/index.ts
@@ -1,9 +1,9 @@
 import { useVisitorsTrafficSourcesLive } from 'api/graph_data_units';
-import { momentToIsoDate } from 'utils/dateUtils';
 
 import { ProjectId, Dates } from 'components/admin/GraphCards/typings';
 
 import { useIntl } from 'utils/cl-intl';
+import { momentToIsoDate } from 'utils/dateUtils';
 
 import { parsePieData, parseExcelData } from './parse';
 import { getTranslations } from './translations';
diff --git a/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx b/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
index aea3df9b6df9..4f5b28987cbe 100644
--- a/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
+++ b/front/app/containers/Admin/dashboard/users/Charts/AgeChart/index.tsx
@@ -4,7 +4,6 @@ import { Box } from '@citizenlab/cl2-component-library';
 import moment from 'moment';
 
 import { useUsersByAgeLive } from 'api/graph_data_units';
-import { momentToIsoDate } from 'utils/dateUtils';
 import { usersByBirthyearXlsxEndpoint } from 'api/users_by_birthyear/util';
 
 import messages from 'containers/Admin/dashboard/messages';
@@ -12,6 +11,7 @@ import messages from 'containers/Admin/dashboard/messages';
 import GraphCard from 'components/admin/GraphCard';
 
 import { useIntl } from 'utils/cl-intl';
+import { momentToIsoDate } from 'utils/dateUtils';
 import { isNilOrError } from 'utils/helperUtils';
 
 import Chart from './Chart';
diff --git a/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx b/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
index d4e5ba715c71..071227a86eda 100644
--- a/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
+++ b/front/app/containers/Admin/dashboard/users/Charts/GenderChart/index.tsx
@@ -3,7 +3,6 @@ import React, { useRef } from 'react';
 import moment from 'moment';
 
 import { useUsersByGenderLive } from 'api/graph_data_units';
-import { momentToIsoDate } from 'utils/dateUtils';
 import { usersByGenderXlsxEndpoint } from 'api/users_by_gender/util';
 
 import messages from 'containers/Admin/dashboard/messages';
@@ -12,6 +11,7 @@ import GraphCard from 'components/admin/GraphCard';
 import { NoDataContainer } from 'components/admin/GraphWrappers';
 
 import { useIntl } from 'utils/cl-intl';
+import { momentToIsoDate } from 'utils/dateUtils';
 import { isNilOrError } from 'utils/helperUtils';
 
 import Chart from './Chart';
diff --git a/front/app/containers/UsersShowPage/UserHeader.test.tsx b/front/app/containers/UsersShowPage/UserHeader.test.tsx
index 5174088babff..3efc1c6e8c17 100644
--- a/front/app/containers/UsersShowPage/UserHeader.test.tsx
+++ b/front/app/containers/UsersShowPage/UserHeader.test.tsx
@@ -1,9 +1,10 @@
 import React from 'react';
 
+import { makeUser } from 'api/users/__mocks__/useUsers';
+
 import { render, screen } from 'utils/testUtils/rtl';
 
 import UserHeader from './UserHeader';
-import { makeUser } from 'api/users/__mocks__/useUsers';
 
 jest.mock('api/users/useUserBySlug');
 let mockUser = makeUser();

From ab141c12c88bcda8077c75a18629fe879622cd33 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 8 Mar 2024 12:26:23 +0000
Subject: [PATCH 215/282] Add deprecated eslint rule

---
 front/.eslintrc.js                            |   2 +
 .../SurveyResultsWidget/Dot.tsx               |   0
 .../FormResultsQuestion.tsx                   |   0
 .../SurveyResultsWidget/QuestionFilter.tsx    |   0
 .../SurveyResultsWidget/SurveyResults.tsx     |   4 +-
 .../SurveyResultsWidget/index.tsx             |  13 +-
 .../SurveyResultsWidget/messages.ts           |   0
 .../SurveyResultsWidget/utils.test.ts         |   0
 .../SurveyResultsWidget/utils.ts              |   0
 .../{ => _deprecated}/TitleMultiloc/index.tsx |   5 +-
 .../TitleMultiloc/messages.ts                 |   0
 .../components/ReportBuilder/Widgets/index.ts |  24 +-
 front/package-lock.json                       | 252 ++++++++++++++++++
 front/package.json                            |   1 +
 14 files changed, 283 insertions(+), 18 deletions(-)
 rename front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/{ => _deprecated}/SurveyResultsWidget/Dot.tsx (100%)
 rename front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/{ => _deprecated}/SurveyResultsWidget/FormResultsQuestion.tsx (100%)
 rename front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/{ => _deprecated}/SurveyResultsWidget/QuestionFilter.tsx (100%)
 rename front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/{ => _deprecated}/SurveyResultsWidget/SurveyResults.tsx (97%)
 rename front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/{ => _deprecated}/SurveyResultsWidget/index.tsx (94%)
 rename front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/{ => _deprecated}/SurveyResultsWidget/messages.ts (100%)
 rename front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/{ => _deprecated}/SurveyResultsWidget/utils.test.ts (100%)
 rename front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/{ => _deprecated}/SurveyResultsWidget/utils.ts (100%)
 rename front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/{ => _deprecated}/TitleMultiloc/index.tsx (95%)
 rename front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/{ => _deprecated}/TitleMultiloc/messages.ts (100%)

diff --git a/front/.eslintrc.js b/front/.eslintrc.js
index eb89c39fcfa4..abb0c6a96c1d 100644
--- a/front/.eslintrc.js
+++ b/front/.eslintrc.js
@@ -25,6 +25,7 @@ module.exports = {
     '@typescript-eslint',
     'unused-imports',
     'import',
+    'deprecation',
   ],
   rules: {
     '@typescript-eslint/member-delimiter-style': ['warn'],
@@ -216,6 +217,7 @@ module.exports = {
         markers: ['/'],
       },
     ],
+    'deprecation/deprecation': 'warn',
   },
   ignorePatterns: [
     '.eslintrc.js',
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/Dot.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/Dot.tsx
similarity index 100%
rename from front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/Dot.tsx
rename to front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/Dot.tsx
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/FormResultsQuestion.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/FormResultsQuestion.tsx
similarity index 100%
rename from front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/FormResultsQuestion.tsx
rename to front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/FormResultsQuestion.tsx
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/QuestionFilter.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/QuestionFilter.tsx
similarity index 100%
rename from front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/QuestionFilter.tsx
rename to front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/QuestionFilter.tsx
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/SurveyResults.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/SurveyResults.tsx
similarity index 97%
rename from front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/SurveyResults.tsx
rename to front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/SurveyResults.tsx
index f885f1a8a1c5..1a287b3d698a 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/SurveyResults.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/SurveyResults.tsx
@@ -14,8 +14,8 @@ import PageBreakBox from 'components/admin/ContentBuilder/Widgets/PageBreakBox';
 import { useIntl } from 'utils/cl-intl';
 import { isNilOrError } from 'utils/helperUtils';
 
-import NoData from '../_shared/NoData';
-import { BORDER } from '../constants';
+import NoData from '../../_shared/NoData';
+import { BORDER } from '../../constants';
 
 import Dot from './Dot';
 import FormResultsQuestion from './FormResultsQuestion';
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/index.tsx
similarity index 94%
rename from front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/index.tsx
rename to front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/index.tsx
index 559972842712..01ba37bb64bc 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/index.tsx
@@ -17,11 +17,11 @@ import PhaseFilter from 'components/UI/PhaseFilter';
 
 import { useIntl } from 'utils/cl-intl';
 
-import Card from '../_shared/Card';
-import NoData from '../_shared/NoData';
-import ProjectFilter from '../_shared/ProjectFilter';
-import widgetMessages from '../messages';
-import { getEmptyMessage } from '../utils';
+import Card from '../../_shared/Card';
+import NoData from '../../_shared/NoData';
+import ProjectFilter from '../../_shared/ProjectFilter';
+import widgetMessages from '../../messages';
+import { getEmptyMessage } from '../../utils';
 
 import messages from './messages';
 import QuestionFilter from './QuestionFilter';
@@ -34,6 +34,9 @@ export type Props = {
   shownQuestions?: boolean[];
 };
 
+/**
+ * @deprecated
+ */
 const SurveyResultsWidget = ({
   title,
   projectId,
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/messages.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/messages.ts
similarity index 100%
rename from front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/messages.ts
rename to front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/messages.ts
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/utils.test.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/utils.test.ts
similarity index 100%
rename from front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/utils.test.ts
rename to front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/utils.test.ts
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/utils.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/utils.ts
similarity index 100%
rename from front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/SurveyResultsWidget/utils.ts
rename to front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/SurveyResultsWidget/utils.ts
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/TitleMultiloc/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/TitleMultiloc/index.tsx
similarity index 95%
rename from front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/TitleMultiloc/index.tsx
rename to front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/TitleMultiloc/index.tsx
index ec0f20e36981..688b6116d447 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/TitleMultiloc/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/TitleMultiloc/index.tsx
@@ -7,7 +7,7 @@ import { Multiloc } from 'typings';
 
 import useLocalize from 'hooks/useLocalize';
 
-import messages from 'containers/Admin/reporting/components/ReportBuilder/Widgets/TitleMultiloc/messages';
+import messages from 'containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/TitleMultiloc/messages';
 import useReportDefaultPadding from 'containers/Admin/reporting/hooks/useReportDefaultPadding';
 
 import PageBreakBox from 'components/admin/ContentBuilder/Widgets/PageBreakBox';
@@ -26,6 +26,9 @@ export interface Props {
   text?: Multiloc;
 }
 
+/**
+ * @deprecated
+ */
 const Title = ({ text }: Props) => {
   const px = useReportDefaultPadding();
   const localize = useLocalize();
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/TitleMultiloc/messages.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/TitleMultiloc/messages.ts
similarity index 100%
rename from front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/TitleMultiloc/messages.ts
rename to front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/_deprecated/TitleMultiloc/messages.ts
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/index.ts
index 935c8c5d7777..ebd61a046151 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/index.ts
@@ -1,11 +1,12 @@
-// report builder widgets
-
-// shared widgets
 import WhiteSpace from 'components/admin/ContentBuilder/Widgets/WhiteSpace';
 import whiteSpaceMessages from 'components/admin/ContentBuilder/Widgets/WhiteSpace/messages';
 
 import { MessageDescriptor } from 'utils/cl-intl';
 
+import SurveyResultsWidget, {
+  surveyResultsTitle,
+} from './_deprecated/SurveyResultsWidget';
+import TitleMultiloc, { titleMultilocTitle } from './_deprecated/TitleMultiloc';
 import AboutReportWidget, { aboutReportTitle } from './AboutReportWidget';
 import ActiveUsersWidget, {
   activeUsersTitle,
@@ -33,19 +34,15 @@ import SingleIdeaWidget, { singleIdeaTitle } from './SingleIdeaWidget';
 import SurveyQuestionResultWidget, {
   surveyQuestionResultTitle,
 } from './SurveyQuestionResultWidget';
-import SurveyResultsWidget, { surveyResultsTitle } from './SurveyResultsWidget';
 import TextMultiloc, { textMultilocTitle } from './TextMultiloc';
-import TitleMultiloc, { titleMultilocTitle } from './TitleMultiloc';
 import TwoColumn, { twoColumnTitle } from './TwoColumn';
 
 export const WIDGETS = {
   TwoColumn,
-  TitleMultiloc, // TODO: remove this widget (TAN-1022)
   TextMultiloc,
   ImageMultiloc,
   WhiteSpace,
   AboutReportWidget,
-  SurveyResultsWidget, // TODO: remove this widget (TAN-1022)
   SurveyQuestionResultWidget,
   VisitorsWidget,
   VisitorsTrafficSourcesWidget,
@@ -57,6 +54,9 @@ export const WIDGETS = {
   PostsByTimeWidget,
   CommentsByTimeWidget,
   ReactionsByTimeWidget,
+
+  TitleMultiloc, // TODO: remove this widget (TAN-1022)
+  SurveyResultsWidget, // TODO: remove this widget (TAN-1022)
 };
 
 type WidgetName = keyof typeof WIDGETS;
@@ -65,10 +65,8 @@ export const WIDGET_TITLES: Record<WidgetName, MessageDescriptor> = {
   WhiteSpace: whiteSpaceMessages.whiteSpace,
   TextMultiloc: textMultilocTitle,
   TwoColumn: twoColumnTitle,
-  TitleMultiloc: titleMultilocTitle,
   ImageMultiloc: imageMultilocTitle,
   AboutReportWidget: aboutReportTitle,
-  SurveyResultsWidget: surveyResultsTitle,
   SurveyQuestionResultWidget: surveyQuestionResultTitle,
   MostReactedIdeasWidget: mostReactedIdeasTitle,
   SingleIdeaWidget: singleIdeaTitle,
@@ -80,6 +78,10 @@ export const WIDGET_TITLES: Record<WidgetName, MessageDescriptor> = {
   PostsByTimeWidget: postsByTimeTitle,
   CommentsByTimeWidget: commentsByTimeTitle,
   ReactionsByTimeWidget: reactionsByTimeTitle,
+
+  // Deprecated
+  TitleMultiloc: titleMultilocTitle,
+  SurveyResultsWidget: surveyResultsTitle,
 };
 
 const WIDGETS_WITH_CHILDREN = new Set<string>([
@@ -99,8 +101,10 @@ const WIDGETS_WITHOUT_POINTER_EVENTS = new Set<string>([
   'ReactionsByTimeWidget',
   'VisitorsTrafficSourcesWidget',
   'VisitorsWidget',
-  'SurveyResultsWidget',
   'SurveyQuestionResultWidget',
+
+  // Deprecated
+  'SurveyResultsWidget',
 ] satisfies WidgetName[]);
 
 export const hasNoPointerEvents = (nodeName: string) => {
diff --git a/front/package-lock.json b/front/package-lock.json
index 527e953dc935..67ffa021a05f 100644
--- a/front/package-lock.json
+++ b/front/package-lock.json
@@ -165,6 +165,7 @@
         "dependency-cruiser": "^12.12.1",
         "esbuild-loader": "^4.0.2",
         "eslint": "^8.35.0",
+        "eslint-plugin-deprecation": "^2.0.0",
         "eslint-plugin-import": "^2.29.1",
         "eslint-plugin-jsx-a11y": "^6.7.1",
         "eslint-plugin-prettier": "^4.2.1",
@@ -17888,6 +17889,160 @@
         "ms": "^2.1.1"
       }
     },
+    "node_modules/eslint-plugin-deprecation": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-2.0.0.tgz",
+      "integrity": "sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/utils": "^6.0.0",
+        "tslib": "^2.3.1",
+        "tsutils": "^3.21.0"
+      },
+      "peerDependencies": {
+        "eslint": "^7.0.0 || ^8.0.0",
+        "typescript": "^4.2.4 || ^5.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/scope-manager": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
+      "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "6.21.0",
+        "@typescript-eslint/visitor-keys": "6.21.0"
+      },
+      "engines": {
+        "node": "^16.0.0 || >=18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/types": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
+      "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
+      "dev": true,
+      "engines": {
+        "node": "^16.0.0 || >=18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/typescript-estree": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
+      "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "6.21.0",
+        "@typescript-eslint/visitor-keys": "6.21.0",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "minimatch": "9.0.3",
+        "semver": "^7.5.4",
+        "ts-api-utils": "^1.0.1"
+      },
+      "engines": {
+        "node": "^16.0.0 || >=18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/utils": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
+      "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
+      "dev": true,
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.4.0",
+        "@types/json-schema": "^7.0.12",
+        "@types/semver": "^7.5.0",
+        "@typescript-eslint/scope-manager": "6.21.0",
+        "@typescript-eslint/types": "6.21.0",
+        "@typescript-eslint/typescript-estree": "6.21.0",
+        "semver": "^7.5.4"
+      },
+      "engines": {
+        "node": "^16.0.0 || >=18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/visitor-keys": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
+      "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "6.21.0",
+        "eslint-visitor-keys": "^3.4.1"
+      },
+      "engines": {
+        "node": "^16.0.0 || >=18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/eslint-plugin-deprecation/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-deprecation/node_modules/minimatch": {
+      "version": "9.0.3",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+      "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/eslint-plugin-deprecation/node_modules/semver": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/eslint-plugin-import": {
       "version": "2.29.1",
       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
@@ -44076,6 +44231,103 @@
         }
       }
     },
+    "eslint-plugin-deprecation": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-2.0.0.tgz",
+      "integrity": "sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/utils": "^6.0.0",
+        "tslib": "^2.3.1",
+        "tsutils": "^3.21.0"
+      },
+      "dependencies": {
+        "@typescript-eslint/scope-manager": {
+          "version": "6.21.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
+          "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "6.21.0",
+            "@typescript-eslint/visitor-keys": "6.21.0"
+          }
+        },
+        "@typescript-eslint/types": {
+          "version": "6.21.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
+          "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
+          "dev": true
+        },
+        "@typescript-eslint/typescript-estree": {
+          "version": "6.21.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
+          "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "6.21.0",
+            "@typescript-eslint/visitor-keys": "6.21.0",
+            "debug": "^4.3.4",
+            "globby": "^11.1.0",
+            "is-glob": "^4.0.3",
+            "minimatch": "9.0.3",
+            "semver": "^7.5.4",
+            "ts-api-utils": "^1.0.1"
+          }
+        },
+        "@typescript-eslint/utils": {
+          "version": "6.21.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
+          "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
+          "dev": true,
+          "requires": {
+            "@eslint-community/eslint-utils": "^4.4.0",
+            "@types/json-schema": "^7.0.12",
+            "@types/semver": "^7.5.0",
+            "@typescript-eslint/scope-manager": "6.21.0",
+            "@typescript-eslint/types": "6.21.0",
+            "@typescript-eslint/typescript-estree": "6.21.0",
+            "semver": "^7.5.4"
+          }
+        },
+        "@typescript-eslint/visitor-keys": {
+          "version": "6.21.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
+          "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "6.21.0",
+            "eslint-visitor-keys": "^3.4.1"
+          }
+        },
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+          "dev": true,
+          "requires": {
+            "balanced-match": "^1.0.0"
+          }
+        },
+        "minimatch": {
+          "version": "9.0.3",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+          "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        },
+        "semver": {
+          "version": "7.6.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+          "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        }
+      }
+    },
     "eslint-plugin-import": {
       "version": "2.29.1",
       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
diff --git a/front/package.json b/front/package.json
index 2a3b61c6200c..d9af4406e37f 100644
--- a/front/package.json
+++ b/front/package.json
@@ -206,6 +206,7 @@
     "dependency-cruiser": "^12.12.1",
     "esbuild-loader": "^4.0.2",
     "eslint": "^8.35.0",
+    "eslint-plugin-deprecation": "^2.0.0",
     "eslint-plugin-import": "^2.29.1",
     "eslint-plugin-jsx-a11y": "^6.7.1",
     "eslint-plugin-prettier": "^4.2.1",

From ead7dbd944eb83ece303fc7d08a2fcb39f903ccd Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 8 Mar 2024 13:32:40 +0100
Subject: [PATCH 216/282] [TAN-1276] Fix reactions_by_time_widget.cy.ts

---
 .../widgets/reactions_by_time_widget.cy.ts           | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts b/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts
index ea26b8b48e31..90e48c0f41e7 100644
--- a/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts
+++ b/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts
@@ -71,6 +71,9 @@ describe('Report builder Reactions By Time widget', () => {
       cy.intercept('PATCH', `/web_api/v1/reports/${reportId}`).as(
         'saveReportLayout'
       );
+      cy.intercept('GET', `/web_api/v1/reports/${reportId}`).as(
+        'getReportLayout'
+      );
       cy.visit(`/admin/reporting/report-builder/${reportId}/editor`);
     });
   });
@@ -124,6 +127,15 @@ describe('Report builder Reactions By Time widget', () => {
     cy.wait(1000);
     cy.get('#e2e-content-builder-topbar-save').click();
     cy.wait('@saveReportLayout');
+    // Wait for reportLayout.attributes.craftjs_json update.
+    //
+    // The delete happens so quickly after save, that at the time
+    // `onNodesChange` is called, reportLayout.attributes.craftjs_json
+    // still has the initial value before save (empty).
+    // After the delete, the actual state is also empty.
+    // And so, the `saved` state is not properly updated.
+    cy.wait('@getReportLayout');
+    cy.wait(500);
 
     cy.get('#e2e-draggable-reactions-by-time-widget').should('exist');
     cy.get('#e2e-draggable-reactions-by-time-widget')

From 0a01e77d6437e2ca48f54a3cb9f46288cd56a503 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 8 Mar 2024 12:52:08 +0000
Subject: [PATCH 217/282] Remove rule so that linter doesnt fail

---
 front/.eslintrc.js                                               | 1 -
 .../Admin/reporting/components/ReportBuilder/Widgets/index.ts    | 1 +
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/.eslintrc.js b/front/.eslintrc.js
index abb0c6a96c1d..e969c6b66387 100644
--- a/front/.eslintrc.js
+++ b/front/.eslintrc.js
@@ -217,7 +217,6 @@ module.exports = {
         markers: ['/'],
       },
     ],
-    'deprecation/deprecation': 'warn',
   },
   ignorePatterns: [
     '.eslintrc.js',
diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/index.ts b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/index.ts
index ebd61a046151..fd075d722ffa 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/index.ts
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Widgets/index.ts
@@ -55,6 +55,7 @@ export const WIDGETS = {
   CommentsByTimeWidget,
   ReactionsByTimeWidget,
 
+  // Deprecated
   TitleMultiloc, // TODO: remove this widget (TAN-1022)
   SurveyResultsWidget, // TODO: remove this widget (TAN-1022)
 };

From 4eb55eebe90124788fe6e7119dbe3c82e461cb0a Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 8 Mar 2024 13:56:58 +0100
Subject: [PATCH 218/282] [TAN-1276] Make posts_by_time_widget.cy.ts similar to
 reactions_by_time_widget.cy.ts

---
 .../containers/ReportBuilder/index.tsx        |  2 ++
 .../widgets/posts_by_time_widget.cy.ts        | 20 ++++++++++++-------
 .../widgets/reactions_by_time_widget.cy.ts    |  2 ++
 3 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index 7d6cebb8f847..a682a0e1b8dc 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -113,6 +113,8 @@ const ReportBuilder = ({
             // areCraftjsObjectsEqual may still return false, because the default text may not have
             // a wrapping <p> tag, which is added as soon as you start typing.
             // But it's good enough for now.
+            // Also, see reactions_by_time_widget.cy.ts#getReportLayout
+            // for the current pitfalls of the `saved` state.
             setSaved(
               areCraftjsObjectsEqual(
                 query.getSerializedNodes(),
diff --git a/front/cypress/e2e/report_builder/widgets/posts_by_time_widget.cy.ts b/front/cypress/e2e/report_builder/widgets/posts_by_time_widget.cy.ts
index 8c437e7615e8..42e3b7b93f68 100644
--- a/front/cypress/e2e/report_builder/widgets/posts_by_time_widget.cy.ts
+++ b/front/cypress/e2e/report_builder/widgets/posts_by_time_widget.cy.ts
@@ -67,6 +67,9 @@ describe('Report builder Posts By Time widget', () => {
       cy.intercept('PATCH', `/web_api/v1/reports/${reportId}`).as(
         'saveReportLayout'
       );
+      cy.intercept('GET', `/web_api/v1/reports/${reportId}`).as(
+        'getReportLayout'
+      );
       cy.visit(`/admin/reporting/report-builder/${reportId}/editor`);
     });
   });
@@ -120,21 +123,24 @@ describe('Report builder Posts By Time widget', () => {
     cy.wait(1000);
     cy.get('#e2e-content-builder-topbar-save').click();
     cy.wait('@saveReportLayout');
+    // Wait for reportLayout.attributes.craftjs_json update.
+    //
+    // The delete happens so quickly after save, that at the time
+    // `onNodesChange` is called, reportLayout.attributes.craftjs_json
+    // still has the initial value before save (empty).
+    // After the delete, the actual state is also empty.
+    // And so, the `saved` state is not properly updated.
+    // Also, see reactions_by_time_widget.cy.ts
+    cy.wait('@getReportLayout');
+    cy.wait(500);
 
     cy.get('#e2e-draggable-posts-by-time-widget').should('exist');
     cy.get('#e2e-draggable-posts-by-time-widget')
       .parent()
       .click({ force: true });
 
-    cy.wait(1000);
-
     cy.get('#e2e-delete-button').click();
 
-    cy.wait(1000);
-
-    cy.intercept('PATCH', `/web_api/v1/reports/${reportId}`).as(
-      'saveReportLayout'
-    );
     cy.get('#e2e-content-builder-topbar-save').click();
     cy.wait('@saveReportLayout');
 
diff --git a/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts b/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts
index 90e48c0f41e7..b22ec4b30cae 100644
--- a/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts
+++ b/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts
@@ -134,6 +134,7 @@ describe('Report builder Reactions By Time widget', () => {
     // still has the initial value before save (empty).
     // After the delete, the actual state is also empty.
     // And so, the `saved` state is not properly updated.
+    // Also, see posts_by_time_widget.cy.ts
     cy.wait('@getReportLayout');
     cy.wait(500);
 
@@ -141,6 +142,7 @@ describe('Report builder Reactions By Time widget', () => {
     cy.get('#e2e-draggable-reactions-by-time-widget')
       .parent()
       .click({ force: true });
+
     cy.get('#e2e-delete-button').click();
     cy.get('#e2e-content-builder-topbar-save').click();
     cy.wait('@saveReportLayout');

From d8bbed32bf8b46276537853fb032dd34520ab2a2 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 8 Mar 2024 14:07:12 +0100
Subject: [PATCH 219/282] [TAN-1276] Add more comments

---
 .../Admin/reporting/containers/ReportBuilder/index.tsx   | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
index a682a0e1b8dc..a547b36895f9 100644
--- a/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
+++ b/front/app/containers/Admin/reporting/containers/ReportBuilder/index.tsx
@@ -115,6 +115,15 @@ const ReportBuilder = ({
             // But it's good enough for now.
             // Also, see reactions_by_time_widget.cy.ts#getReportLayout
             // for the current pitfalls of the `saved` state.
+            //
+            // Ideally, we should detected this `saved` state in only one way.
+            // Either always via areCraftjsObjectsEqual (probably,
+            // storing `currentNodes` state instead or `saved` state)
+            // or always via setSaved(true) (and then without detecting
+            // when nodes were changed and then changed back w/o saving).
+            // Also, we could move the states from ContentBuilderTopBar
+            // here to manage the entire state in one place and get rid of
+            // `setInterval`.
             setSaved(
               areCraftjsObjectsEqual(
                 query.getSerializedNodes(),

From c3bd3f1dd416e5b47c39cccea9abe499fbe6bf47 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Fri, 8 Mar 2024 14:38:39 +0100
Subject: [PATCH 220/282] [TAN-1276] Fix comments_by_time_widget.cy.ts

---
 .../widgets/comments_by_time_widget.cy.ts     | 22 +++++++++++--------
 .../widgets/reactions_by_time_widget.cy.ts    |  2 +-
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/front/cypress/e2e/report_builder/widgets/comments_by_time_widget.cy.ts b/front/cypress/e2e/report_builder/widgets/comments_by_time_widget.cy.ts
index 194acee93ff0..c6606dd7e923 100644
--- a/front/cypress/e2e/report_builder/widgets/comments_by_time_widget.cy.ts
+++ b/front/cypress/e2e/report_builder/widgets/comments_by_time_widget.cy.ts
@@ -61,10 +61,12 @@ describe('Report builder Comments By Time widget', () => {
     cy.setAdminLoginCookie();
     cy.apiCreateReportBuilder(phaseId).then((report) => {
       reportId = report.body.data.id;
-
       cy.intercept('PATCH', `/web_api/v1/reports/${reportId}`).as(
         'saveReportLayout'
       );
+      cy.intercept('GET', `/web_api/v1/reports/${reportId}`).as(
+        'getReportLayout'
+      );
       cy.visit(`/admin/reporting/report-builder/${reportId}/editor`);
     });
   });
@@ -119,21 +121,23 @@ describe('Report builder Comments By Time widget', () => {
 
     cy.get('#e2e-content-builder-topbar-save').click();
     cy.wait('@saveReportLayout');
+    // Wait for reportLayout.attributes.craftjs_json update.
+    //
+    // The delete happens so quickly after save, that at the time
+    // `onNodesChange` is called, reportLayout.attributes.craftjs_json
+    // still has the initial value before save (empty).
+    // After the delete, the actual state is also empty.
+    // And so, the `saved` state is not properly updated.
+    // Also, see posts_by_time_widget.cy.ts and reactions_by_time_widget.cy.ts
+    cy.wait('@getReportLayout');
+    cy.wait(500);
 
     cy.get('.e2e-comments-by-time-widget').should('exist');
     cy.get('.e2e-comments-by-time-widget').parent().click({ force: true });
 
-    cy.wait(1000);
-
     cy.get('#e2e-delete-button').click();
 
     cy.get('.e2e-comments-by-time-widget').should('not.exist');
-
-    cy.wait(1000);
-
-    cy.intercept('PATCH', `/web_api/v1/reports/${reportId}`).as(
-      'saveReportLayout'
-    );
     cy.get('#e2e-content-builder-topbar-save').click();
     cy.wait('@saveReportLayout');
 
diff --git a/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts b/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts
index b22ec4b30cae..cc5431b35bf3 100644
--- a/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts
+++ b/front/cypress/e2e/report_builder/widgets/reactions_by_time_widget.cy.ts
@@ -134,7 +134,7 @@ describe('Report builder Reactions By Time widget', () => {
     // still has the initial value before save (empty).
     // After the delete, the actual state is also empty.
     // And so, the `saved` state is not properly updated.
-    // Also, see posts_by_time_widget.cy.ts
+    // Also, see posts_by_time_widget.cy.ts and comments_by_time_widget.cy.ts
     cy.wait('@getReportLayout');
     cy.wait(500);
 

From 0a8fae355cd111d1be68cede543e5c1bbce6e66f Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 8 Mar 2024 13:44:54 +0000
Subject: [PATCH 221/282] _

---
 front/.eslintrc.js      |   1 -
 front/package-lock.json | 252 ----------------------------------------
 front/package.json      |   1 -
 3 files changed, 254 deletions(-)

diff --git a/front/.eslintrc.js b/front/.eslintrc.js
index e969c6b66387..eb89c39fcfa4 100644
--- a/front/.eslintrc.js
+++ b/front/.eslintrc.js
@@ -25,7 +25,6 @@ module.exports = {
     '@typescript-eslint',
     'unused-imports',
     'import',
-    'deprecation',
   ],
   rules: {
     '@typescript-eslint/member-delimiter-style': ['warn'],
diff --git a/front/package-lock.json b/front/package-lock.json
index 67ffa021a05f..527e953dc935 100644
--- a/front/package-lock.json
+++ b/front/package-lock.json
@@ -165,7 +165,6 @@
         "dependency-cruiser": "^12.12.1",
         "esbuild-loader": "^4.0.2",
         "eslint": "^8.35.0",
-        "eslint-plugin-deprecation": "^2.0.0",
         "eslint-plugin-import": "^2.29.1",
         "eslint-plugin-jsx-a11y": "^6.7.1",
         "eslint-plugin-prettier": "^4.2.1",
@@ -17889,160 +17888,6 @@
         "ms": "^2.1.1"
       }
     },
-    "node_modules/eslint-plugin-deprecation": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-2.0.0.tgz",
-      "integrity": "sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/utils": "^6.0.0",
-        "tslib": "^2.3.1",
-        "tsutils": "^3.21.0"
-      },
-      "peerDependencies": {
-        "eslint": "^7.0.0 || ^8.0.0",
-        "typescript": "^4.2.4 || ^5.0.0"
-      }
-    },
-    "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/scope-manager": {
-      "version": "6.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
-      "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "6.21.0",
-        "@typescript-eslint/visitor-keys": "6.21.0"
-      },
-      "engines": {
-        "node": "^16.0.0 || >=18.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/types": {
-      "version": "6.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
-      "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
-      "dev": true,
-      "engines": {
-        "node": "^16.0.0 || >=18.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/typescript-estree": {
-      "version": "6.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
-      "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "6.21.0",
-        "@typescript-eslint/visitor-keys": "6.21.0",
-        "debug": "^4.3.4",
-        "globby": "^11.1.0",
-        "is-glob": "^4.0.3",
-        "minimatch": "9.0.3",
-        "semver": "^7.5.4",
-        "ts-api-utils": "^1.0.1"
-      },
-      "engines": {
-        "node": "^16.0.0 || >=18.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/utils": {
-      "version": "6.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
-      "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
-      "dev": true,
-      "dependencies": {
-        "@eslint-community/eslint-utils": "^4.4.0",
-        "@types/json-schema": "^7.0.12",
-        "@types/semver": "^7.5.0",
-        "@typescript-eslint/scope-manager": "6.21.0",
-        "@typescript-eslint/types": "6.21.0",
-        "@typescript-eslint/typescript-estree": "6.21.0",
-        "semver": "^7.5.4"
-      },
-      "engines": {
-        "node": "^16.0.0 || >=18.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^7.0.0 || ^8.0.0"
-      }
-    },
-    "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/visitor-keys": {
-      "version": "6.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
-      "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "6.21.0",
-        "eslint-visitor-keys": "^3.4.1"
-      },
-      "engines": {
-        "node": "^16.0.0 || >=18.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/eslint-plugin-deprecation/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/eslint-plugin-deprecation/node_modules/minimatch": {
-      "version": "9.0.3",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
-      "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/eslint-plugin-deprecation/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/eslint-plugin-import": {
       "version": "2.29.1",
       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
@@ -44231,103 +44076,6 @@
         }
       }
     },
-    "eslint-plugin-deprecation": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-2.0.0.tgz",
-      "integrity": "sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ==",
-      "dev": true,
-      "requires": {
-        "@typescript-eslint/utils": "^6.0.0",
-        "tslib": "^2.3.1",
-        "tsutils": "^3.21.0"
-      },
-      "dependencies": {
-        "@typescript-eslint/scope-manager": {
-          "version": "6.21.0",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
-          "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
-          "dev": true,
-          "requires": {
-            "@typescript-eslint/types": "6.21.0",
-            "@typescript-eslint/visitor-keys": "6.21.0"
-          }
-        },
-        "@typescript-eslint/types": {
-          "version": "6.21.0",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
-          "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
-          "dev": true
-        },
-        "@typescript-eslint/typescript-estree": {
-          "version": "6.21.0",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
-          "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
-          "dev": true,
-          "requires": {
-            "@typescript-eslint/types": "6.21.0",
-            "@typescript-eslint/visitor-keys": "6.21.0",
-            "debug": "^4.3.4",
-            "globby": "^11.1.0",
-            "is-glob": "^4.0.3",
-            "minimatch": "9.0.3",
-            "semver": "^7.5.4",
-            "ts-api-utils": "^1.0.1"
-          }
-        },
-        "@typescript-eslint/utils": {
-          "version": "6.21.0",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
-          "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
-          "dev": true,
-          "requires": {
-            "@eslint-community/eslint-utils": "^4.4.0",
-            "@types/json-schema": "^7.0.12",
-            "@types/semver": "^7.5.0",
-            "@typescript-eslint/scope-manager": "6.21.0",
-            "@typescript-eslint/types": "6.21.0",
-            "@typescript-eslint/typescript-estree": "6.21.0",
-            "semver": "^7.5.4"
-          }
-        },
-        "@typescript-eslint/visitor-keys": {
-          "version": "6.21.0",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
-          "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
-          "dev": true,
-          "requires": {
-            "@typescript-eslint/types": "6.21.0",
-            "eslint-visitor-keys": "^3.4.1"
-          }
-        },
-        "brace-expansion": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0"
-          }
-        },
-        "minimatch": {
-          "version": "9.0.3",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
-          "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^2.0.1"
-          }
-        },
-        "semver": {
-          "version": "7.6.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-          "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
     "eslint-plugin-import": {
       "version": "2.29.1",
       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
diff --git a/front/package.json b/front/package.json
index d9af4406e37f..2a3b61c6200c 100644
--- a/front/package.json
+++ b/front/package.json
@@ -206,7 +206,6 @@
     "dependency-cruiser": "^12.12.1",
     "esbuild-loader": "^4.0.2",
     "eslint": "^8.35.0",
-    "eslint-plugin-deprecation": "^2.0.0",
     "eslint-plugin-import": "^2.29.1",
     "eslint-plugin-jsx-a11y": "^6.7.1",
     "eslint-plugin-prettier": "^4.2.1",

From bc4a48debea24a174f64bb6ef1b71779e419b956 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 8 Mar 2024 14:46:53 +0000
Subject: [PATCH 222/282] _

---
 front/app/api/project_images/__mocks__/_mockServer.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/front/app/api/project_images/__mocks__/_mockServer.ts b/front/app/api/project_images/__mocks__/_mockServer.ts
index c1bacbc6138e..4db8c8955539 100644
--- a/front/app/api/project_images/__mocks__/_mockServer.ts
+++ b/front/app/api/project_images/__mocks__/_mockServer.ts
@@ -1,6 +1,7 @@
 import { rest } from 'msw';
 
 import { API_PATH } from 'containers/App/constants';
+
 import { getOrigin } from 'utils/storybook/getOrigin';
 
 const image = `${getOrigin()}/images/image16.png`;

From 9afda92c59540ea6de3df3630e6f305c2195d496 Mon Sep 17 00:00:00 2001
From: jamesspeake <james@speake.org>
Date: Fri, 8 Mar 2024 15:45:44 +0000
Subject: [PATCH 223/282] [TAN-1249] PR fixes

---
 .../IdeasNewPage/components/SurveyNotActiveNotice.tsx      | 7 +++++--
 front/app/containers/IdeasNewPage/index.tsx                | 4 ++--
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/front/app/containers/IdeasNewPage/components/SurveyNotActiveNotice.tsx b/front/app/containers/IdeasNewPage/components/SurveyNotActiveNotice.tsx
index ef2026e1b6f5..f6e37b2975e6 100644
--- a/front/app/containers/IdeasNewPage/components/SurveyNotActiveNotice.tsx
+++ b/front/app/containers/IdeasNewPage/components/SurveyNotActiveNotice.tsx
@@ -8,17 +8,20 @@ import {
   Title,
   useBreakpoint,
 } from '@citizenlab/cl2-component-library';
+
+import { IProjectData } from 'api/projects/types';
+
 import PageContainer from 'components/UI/PageContainer';
 
 // intl
 import { useIntl } from 'utils/cl-intl';
+import clHistory from 'utils/cl-router/history';
+
 import messages from './messages';
 
 // util
-import clHistory from 'utils/cl-router/history';
 
 // types
-import { IProjectData } from 'api/projects/types';
 
 type Props = {
   project: IProjectData;
diff --git a/front/app/containers/IdeasNewPage/index.tsx b/front/app/containers/IdeasNewPage/index.tsx
index 600cca756d29..5e4914fa4dea 100644
--- a/front/app/containers/IdeasNewPage/index.tsx
+++ b/front/app/containers/IdeasNewPage/index.tsx
@@ -20,12 +20,12 @@ import { getIdeaPostingRules } from 'utils/actionTakingRules';
 import { getParticipationMethod } from 'utils/configs/participationMethodConfig';
 import { isUnauthorizedRQ } from 'utils/errorUtils';
 import { isNilOrError } from 'utils/helperUtils';
+import { canModerateProject } from 'utils/permissions/rules/projectPermissions';
 
-import SurveySubmittedNotice from './components/SurveySubmittedNotice';
 import SurveyNotActiveNotice from './components/SurveyNotActiveNotice';
+import SurveySubmittedNotice from './components/SurveySubmittedNotice';
 import IdeasNewIdeationForm from './IdeasNewIdeationForm';
 import IdeasNewSurveyForm from './IdeasNewSurveyForm';
-import { canModerateProject } from 'utils/permissions/rules/projectPermissions';
 
 const NewIdeaPage = () => {
   const { slug } = useParams();

From b630f818dc3945237e9274c452a4591bbde09eed Mon Sep 17 00:00:00 2001
From: jamesspeake <james@speake.org>
Date: Fri, 8 Mar 2024 15:52:12 +0000
Subject: [PATCH 224/282] [TAN-1249] Merged some changed from duplicated PR

---
 front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx b/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
index 19d9b4beca20..83fe8c34ed36 100644
--- a/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
+++ b/front/app/containers/IdeasNewPage/IdeasNewSurveyForm/index.tsx
@@ -159,7 +159,7 @@ const IdeasNewSurveyForm = ({ project }: Props) => {
     const requestBody = {
       ...data,
       project_id: project.data.id,
-      phase_ids: userIsModerator ? [phaseId] : [],
+      ...(userIsModerator ? { phase_ids: [phaseId] } : {}), // Moderators can submit survey responses for inactive phases, in which case the backend cannot infer the correct phase (the current phase).
       publication_status: data.publication_status || 'published',
     };
 

From fc3a520632d31913471fe06da8a479ebc6f96bb0 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:21:48 +0100
Subject: [PATCH 225/282] New translations en.json (French)

---
 front/app/translations/fr-FR.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/fr-FR.json b/front/app/translations/fr-FR.json
index 122bb7cf7eba..460f9d9e7506 100644
--- a/front/app/translations/fr-FR.json
+++ b/front/app/translations/fr-FR.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Par défaut, vos soumissions seront associées à votre profil, sauf si vous sélectionnez cette option.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Publier anonymement",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Visibilité du profil",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Cette enquête n'est actuellement pas ouverte aux réponses. Veuillez vous référer au projet pour davantage d'informations.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Cette enquête n'est pas actuellement active.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Retour au projet",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Vous avez déjà répondu à cette enquête.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Enquête soumise",

From 8226147fc2eb0e67a05d7694729687d60cfe8717 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:21:50 +0100
Subject: [PATCH 226/282] New translations en.json (Spanish)

---
 front/app/translations/es-ES.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/es-ES.json b/front/app/translations/es-ES.json
index 9a837359832b..b3f42542874b 100644
--- a/front/app/translations/es-ES.json
+++ b/front/app/translations/es-ES.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Por defecto, tus aportes se asociarán a tu perfil, a menos que selecciones esta opción.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Publicar anónimamente",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Visibilidad del perfil",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Esta encuesta no está actualmente abierta a respuestas. Por favor, vuelve al proyecto para obtener más información.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Esta encuesta no está activa actualmente.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Volver al proyecto",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Ya has completado esta encuesta.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Encuesta enviada",

From 800a2010043ff9642600f37e22c07cbc96efcacd Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:21:51 +0100
Subject: [PATCH 227/282] New translations en.json (Arabic)

---
 front/app/translations/ar-SA.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/ar-SA.json b/front/app/translations/ar-SA.json
index a9a1991044af..21796c1b8b4e 100644
--- a/front/app/translations/ar-SA.json
+++ b/front/app/translations/ar-SA.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "بشكل افتراضي ، سيتم ربط عمليات الإرسال الخاصة بك بملف التعريف الخاص بك ، ما لم تحدد هذا الخيار.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "انشر بشكل مجهول",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "رؤية الملف الشخصي",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "هذا الاستطلاع غير مفتوح حاليا للردود. يرجى العودة إلى المشروع لمزيد من المعلومات.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "هذا الاستطلاع غير نشط حاليا.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "العودة إلى المشروع",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "لقد أنجزت بالفعل هذا الاستطلاع.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "تم إرسال الاستطلاع",

From 95d1c3a0dd936d84c61e7392020ab2c33779f363 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:21:52 +0100
Subject: [PATCH 228/282] New translations en.json (Catalan)

---
 front/app/translations/ca-ES.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/ca-ES.json b/front/app/translations/ca-ES.json
index 5d251a7d9b77..77655a2af7b5 100644
--- a/front/app/translations/ca-ES.json
+++ b/front/app/translations/ca-ES.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "De manera predeterminada, els vostres enviaments s'associaran al vostre perfil, tret que seleccioneu aquesta opció.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Publica de manera anònima",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Visibilitat del perfil",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Aquesta enquesta no està oberta a respostes actualment. Si us plau, torneu al projecte per obtenir més informació.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Aquesta enquesta no està activa actualment.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Tornar al projecte",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Ja heu completat aquesta enquesta.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Enquesta enviada",

From d14ac60336b0757f4d356e5d46c278d39d44aaab Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:21:54 +0100
Subject: [PATCH 229/282] New translations en.json (Danish)

---
 front/app/translations/da-DK.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/da-DK.json b/front/app/translations/da-DK.json
index 8b97cdc4d582..313674594761 100644
--- a/front/app/translations/da-DK.json
+++ b/front/app/translations/da-DK.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Som standard vil dine indlæg være knyttet til din profil, medmindre du vælger denne mulighed.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Indlæg anonymt",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Profil synlighed",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Denne undersøgelse er ikke åben for svar i øjeblikket. Vend venligst tilbage til projektet for mere information.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Denne undersøgelse er ikke aktiv i øjeblikket.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Tilbage til projektet",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Du har allerede gennemført denne undersøgelse.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Undersøgelse indsendt",

From 4a933b868dc9008887d5c57732103c02c357e0f0 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:21:55 +0100
Subject: [PATCH 230/282] New translations en.json (German)

---
 front/app/translations/de-DE.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/de-DE.json b/front/app/translations/de-DE.json
index af7f6e6ce010..876bd09cc820 100644
--- a/front/app/translations/de-DE.json
+++ b/front/app/translations/de-DE.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Standardmäßig werden Ihre Beiträge mit Ihrem Profil verknüpft, es sei denn, Sie wählen diese Option.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Anonym teilnehmen",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Sichtbarkeit des Profils",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Diese Umfrage ist derzeit nicht für Antworten geöffnet. Bitte kehren Sie zum Projekt zurück, um weitere Informationen zu erhalten.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Diese Umfrage ist derzeit nicht aktiv.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Zurück zum Projekt",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Sie haben diese Umfrage bereits ausgefüllt.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Umfrage eingereicht",

From 3358d9e9c9a9ef2f77008a96f30296359443a916 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:21:57 +0100
Subject: [PATCH 231/282] New translations en.json (Greek)

---
 front/app/translations/el-GR.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/el-GR.json b/front/app/translations/el-GR.json
index 6ebf9241e3ad..6f15c9f1dc70 100644
--- a/front/app/translations/el-GR.json
+++ b/front/app/translations/el-GR.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Από προεπιλογή, οι υποβολές σας θα συσχετίζονται με το προφίλ σας, εκτός αν επιλέξετε αυτή την επιλογή.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Δημοσιεύστε ανώνυμα",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Ορατότητα προφίλ",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Αυτή η έρευνα δεν είναι επί του παρόντος ανοικτή για απαντήσεις. Παρακαλείστε να επιστρέψετε στο έργο για περισσότερες πληροφορίες.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Αυτή η έρευνα δεν είναι επί του παρόντος ενεργή.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Επιστροφή στο έργο",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Έχετε ήδη ολοκληρώσει αυτή την έρευνα.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Υποβληθείσα έρευνα",

From f0c0e9676685f067f6b96514307fae78e18a9cb4 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:21:58 +0100
Subject: [PATCH 232/282] New translations en.json (Finnish)

---
 front/app/translations/fi-FI.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/fi-FI.json b/front/app/translations/fi-FI.json
index 14b9d061389a..f6a4a26a7b01 100644
--- a/front/app/translations/fi-FI.json
+++ b/front/app/translations/fi-FI.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Oletuksena lähetyksesi liitetään profiiliisi, ellet valitse tätä vaihtoehtoa.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Postaa nimettömänä",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Profiilin näkyvyys",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Tämä kysely ei ole tällä hetkellä avoin vastausta varten. Palaa projektiin saadaksesi lisätietoja.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Tämä kysely ei ole tällä hetkellä aktiivinen.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Paluu projektiin",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Olet jo suorittanut tämän kyselyn.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Kysely lähetetty",

From e76545107a58f55321a967ddacd6c5c6dc4cb99b Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:00 +0100
Subject: [PATCH 233/282] New translations en.json (Italian)

---
 front/app/translations/it-IT.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/it-IT.json b/front/app/translations/it-IT.json
index d6cf539a1206..13f843429dfa 100644
--- a/front/app/translations/it-IT.json
+++ b/front/app/translations/it-IT.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Per impostazione predefinita i tuoi invii saranno associati al tuo profilo, a meno che tu non selezioni questa opzione.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Pubblica in forma anonima",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Visibilità del profilo",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Questo sondaggio non è attualmente aperto alle risposte. Ti invitiamo a tornare al progetto per maggiori informazioni.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Questo sondaggio non è attualmente attivo.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Torna al progetto",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Hai già completato questo sondaggio.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Sondaggio inviato",

From 253097a71ce2928d414cf87bf36c70d074b40c83 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:02 +0100
Subject: [PATCH 234/282] New translations en.json (Dutch)

---
 front/app/translations/nl-NL.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/nl-NL.json b/front/app/translations/nl-NL.json
index a3ad4ccc3212..a30b6b097360 100644
--- a/front/app/translations/nl-NL.json
+++ b/front/app/translations/nl-NL.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Je inzendingen worden standaard aan je profiel gekoppeld, tenzij je deze optie selecteert.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Anoniem plaatsen",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Zichtbaarheid van het profiel",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Deze vragenlijst is momenteel niet open voor reacties. Ga terug naar het project voor meer informatie.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Deze vragenlijst is momenteel niet actief.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Terug naar project",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Je hebt deze vragenlijst al ingevuld.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Vragenlijst ingediend",

From fa97ba5ea0b930798a827b79db24dcec2f609e3a Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:03 +0100
Subject: [PATCH 235/282] New translations en.json (Norwegian)

---
 front/app/translations/nb-NO.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/nb-NO.json b/front/app/translations/nb-NO.json
index a9bf36b6ee47..b503753f42c1 100644
--- a/front/app/translations/nb-NO.json
+++ b/front/app/translations/nb-NO.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Som standard vil bidragene dine være knyttet til profilen din, med mindre du velger dette alternativet.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Post anonymt",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Profilsynlighet",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Denne undersøkelsen er foreløpig ikke åpen for svar. Gå tilbake til prosjektet for mer informasjon.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Denne undersøkelsen er ikke aktiv for øyeblikket.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Gå tilbake til prosjektet",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Du har allerede fullført denne undersøkelsen.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Undersøkelse sendt inn",

From 3b2f7932416f72ca82565f5507a097fd364dc0b6 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:04 +0100
Subject: [PATCH 236/282] New translations en.json (Polish)

---
 front/app/translations/pl-PL.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/pl-PL.json b/front/app/translations/pl-PL.json
index a95e3252dd46..d31259e4940a 100644
--- a/front/app/translations/pl-PL.json
+++ b/front/app/translations/pl-PL.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Domyślnie Twoje zgłoszenia będą powiązane z Twoim profilem, chyba że wybierzesz tę opcję.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Publikuj anonimowo",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Widoczność profilu",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Ta ankieta nie jest obecnie otwarta dla odpowiedzi. Wróć do projektu, aby uzyskać więcej informacji.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Ta ankieta nie jest obecnie aktywna.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Wróć do projektu",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Wypełniłeś już tę ankietę.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Przesłana ankieta",

From 9e44e550f7efd5dec0028fa4b438fb418b13553c Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:06 +0100
Subject: [PATCH 237/282] New translations en.json (Serbian (Cyrillic))

---
 front/app/translations/sr-SP.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/sr-SP.json b/front/app/translations/sr-SP.json
index 4abd461f2758..29a7e9d6e7fa 100644
--- a/front/app/translations/sr-SP.json
+++ b/front/app/translations/sr-SP.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Подразумевано, ваши поднесци ће бити повезани са вашим профилом, осим ако не изаберете ову опцију.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Објавите анонимно",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Видљивост профила",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "This survey is not currently open for responses. Please return to the project for more information.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "This survey is not currently active.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Вратите се на пројекат",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Већ сте попунили ову анкету.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Анкета је послата",

From 75ff00dc3314f1a279cce764793995a5c3351a85 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:07 +0100
Subject: [PATCH 238/282] New translations en.json (Swedish)

---
 front/app/translations/sv-SE.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/sv-SE.json b/front/app/translations/sv-SE.json
index 453d13b69e81..f41604e10f9b 100644
--- a/front/app/translations/sv-SE.json
+++ b/front/app/translations/sv-SE.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Som standard kommer dina inlägg att kopplas till din profil, om du inte väljer det här alternativet.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Skicka anonymt",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Profilens synlighet",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Denna undersökning är för närvarande inte öppen för svar. Vänligen återkom till projektet för mer information.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Denna undersökning är för närvarande inte aktiv.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Återgå till projektet",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Du har redan besvarat denna enkät.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Undersökning inlämnad",

From 6456c01647c265cd0e7a0e88dd8703940d9f2acc Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:09 +0100
Subject: [PATCH 239/282] New translations en.json (Turkish)

---
 front/app/translations/tr-TR.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/tr-TR.json b/front/app/translations/tr-TR.json
index a03315c81adb..e8730e7718f1 100644
--- a/front/app/translations/tr-TR.json
+++ b/front/app/translations/tr-TR.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Bu seçeneği seçmediğiniz sürece varsayılan olarak gönderimleriniz profilinizle ilişkilendirilecektir.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "İsimsiz olarak gönder",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Profil görünürlüğü",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Bu anket şu anda yanıtlara açık değildir. Daha fazla bilgi için lütfen projeye geri dönün.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Bu anket şu anda aktif değildir.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Projeye geri dön",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Bu anketi zaten tamamladınız.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Anket gönderildi",

From cb0291043e6626e21ba64daae4a62b14465d1c94 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:10 +0100
Subject: [PATCH 240/282] New translations en.json (Portuguese, Brazilian)

---
 front/app/translations/pt-BR.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/pt-BR.json b/front/app/translations/pt-BR.json
index dde0ec7308da..4332e3f637f2 100644
--- a/front/app/translations/pt-BR.json
+++ b/front/app/translations/pt-BR.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Por padrão, seus envios serão associados ao seu perfil, a menos que você selecione esta opção.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Publicar anonimamente",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Visibilidade do perfil",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Esta pesquisa não está aberta para respostas no momento. Volte ao projeto para obter mais informações.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Essa pesquisa não está ativa no momento.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Retornar ao projeto",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Você já concluiu esta pesquisa.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Pesquisa enviada",

From 3dbd145d2476520d92584e6923b32d3ca6c0d83e Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:11 +0100
Subject: [PATCH 241/282] New translations en.json (Spanish, Chile)

---
 front/app/translations/es-CL.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/es-CL.json b/front/app/translations/es-CL.json
index 1d9239e0b2ad..21013fbf3d10 100644
--- a/front/app/translations/es-CL.json
+++ b/front/app/translations/es-CL.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Por defecto, tus aportes se asociarán a tu perfil, a menos que selecciones esta opción.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Publicar anónimamente",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Visibilidad del perfil",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Esta encuesta no está actualmente abierta a respuestas. Por favor, vuelve al proyecto para obtener más información.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Esta encuesta no está activa actualmente.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Volver al proyecto",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Ya has completado esta encuesta.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Encuesta enviada",

From 508186c02445435dae152f0e62d84df99bbc955a Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:13 +0100
Subject: [PATCH 242/282] New translations en.json (Croatian)

---
 front/app/translations/hr-HR.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/hr-HR.json b/front/app/translations/hr-HR.json
index d4f55d6935b6..df632ec9d6c4 100644
--- a/front/app/translations/hr-HR.json
+++ b/front/app/translations/hr-HR.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Prema zadanim postavkama vaši podnesci bit će povezani s vašim profilom, osim ako ne odaberete ovu opciju.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Objavite anonimno",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Vidljivost profila",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Ova anketa trenutno nije otvorena za odgovore. Vratite se na projekt za više informacija.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Ova anketa trenutno nije aktivna.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Povratak na projekt",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Već ste ispunili ovu anketu.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Anketa poslana",

From 45c999cf0f67543c5f8230fcac6bafe3a3724348 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:14 +0100
Subject: [PATCH 243/282] New translations en.json (Latvian)

---
 front/app/translations/lv-LV.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/lv-LV.json b/front/app/translations/lv-LV.json
index 4f8c7f7c9ba6..4720f8171625 100644
--- a/front/app/translations/lv-LV.json
+++ b/front/app/translations/lv-LV.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Pēc noklusējuma jūsu iesniegumi tiks saistīti ar jūsu profilu, ja vien neizvēlaties šo opciju.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Sūtīt anonīmi",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Profila redzamība",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Pašlaik atbildes uz šo apsekojumu nav pieejamas. Lūdzu, atgriezieties pie projekta, lai iegūtu vairāk informācijas.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Šis apsekojums pašlaik nav aktīvs.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Atgriezties pie projekta",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Jūs jau esat aizpildījis šo aptauju.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Iesniegtais apsekojums",

From bb4d96c1d28e24e2ec67a53259d3cb71e975cda7 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:15 +0100
Subject: [PATCH 244/282] New translations en.json (English, Canada)

---
 front/app/translations/en-CA.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/en-CA.json b/front/app/translations/en-CA.json
index 116e4c01e688..61ee6e32b6bb 100644
--- a/front/app/translations/en-CA.json
+++ b/front/app/translations/en-CA.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "By default your submissions will be associated with your profile, unless you select this option.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Post anonymously",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Profile visibility",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "This survey is not currently open for responses. Please return to the project for more information.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "This survey is not currently active.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Return to project",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "You have already completed this survey.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Survey submitted",

From 9a7c36f943867a7e922575cf16ea667952ac5608 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:17 +0100
Subject: [PATCH 245/282] New translations en.json (English, United Kingdom)

---
 front/app/translations/en-GB.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/en-GB.json b/front/app/translations/en-GB.json
index d7c6047e90c4..be102f516264 100644
--- a/front/app/translations/en-GB.json
+++ b/front/app/translations/en-GB.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "By default your submissions will be associated with your profile, unless you select this option.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Post anonymously",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Profile visibility",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "This survey is not currently open for responses. Please return to the project for more information.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "This survey is not currently active.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Return to project",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "You have already completed this survey.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Survey submitted",

From 138c853cbbb73aab1f4a93762d67cdf13d9f1f09 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:18 +0100
Subject: [PATCH 246/282] New translations en.json (Luxembourgish)

---
 front/app/translations/lb-LU.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/lb-LU.json b/front/app/translations/lb-LU.json
index dff8261bec79..facf9fe9c6f0 100644
--- a/front/app/translations/lb-LU.json
+++ b/front/app/translations/lb-LU.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Par défaut ginn Är Soumissioun mat Ärem Profil verbonnen, ausser Dir wielt dës Optioun.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Post anonym",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Profil Visibilitéit",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Dës Ëmfro ass de Moment net op fir Äntwerten. Weg zréck op de Projet fir méi Informatiounen.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Dës Ëmfro ass am Moment net aktiv.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Zréck op de Projet",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Dir hutt dës Ëmfro schonn ofgeschloss.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Ëmfro presentéiert",

From 7274a512736ec3b0fa1fdfabe962e54911f6615f Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:19 +0100
Subject: [PATCH 247/282] New translations en.json (Dutch, Belgium)

---
 front/app/translations/nl-BE.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/nl-BE.json b/front/app/translations/nl-BE.json
index bf637b8ac3d9..1d11cab0f5ab 100644
--- a/front/app/translations/nl-BE.json
+++ b/front/app/translations/nl-BE.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Je inzendingen worden standaard aan je profiel gekoppeld, tenzij je deze optie selecteert.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Anoniem plaatsen",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Zichtbaarheid van het profiel",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Deze vragenlijst is momenteel niet open voor reacties. Ga terug naar het project voor meer informatie.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Deze vragenlijst is momenteel niet actief.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Terug naar project",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Je hebt deze vragenlijst al ingevuld.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Vragenlijst ingediend",

From 1aa548662c240e4e5076564f14b7df240e88824c Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:21 +0100
Subject: [PATCH 248/282] New translations en.json (French, Belgium)

---
 front/app/translations/fr-BE.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/fr-BE.json b/front/app/translations/fr-BE.json
index 00f697d15ddd..e858c1818c1e 100644
--- a/front/app/translations/fr-BE.json
+++ b/front/app/translations/fr-BE.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Par défaut, vos soumissions seront associées à votre profil, sauf si vous sélectionnez cette option.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Publier anonymement",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Visibilité du profil",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "Cette enquête n'est actuellement pas ouverte aux réponses. Veuillez vous référer au projet pour davantage d'informations.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "Cette enquête n'est pas actuellement active.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Retour au projet",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "Vous avez déjà répondu à cette enquête.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Enquête soumise",

From fdec95908225feba5d17deba97ae9ad24ea0e146 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:22 +0100
Subject: [PATCH 249/282] New translations en.json (Moroccan Arabic)

---
 front/app/translations/ar-MA.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/ar-MA.json b/front/app/translations/ar-MA.json
index 4fbb9bcb277f..0fea94af4966 100644
--- a/front/app/translations/ar-MA.json
+++ b/front/app/translations/ar-MA.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "بشكل افتراضي ، سيتم ربط عمليات الإرسال الخاصة بك بملف التعريف الخاص بك ، ما لم تحدد هذا الخيار.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "انشر بشكل مجهول",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "رؤية الملف الشخصي",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "هذا الاستطلاع غير مفتوح حاليا للردود. يرجى العودة إلى المشروع لمزيد من المعلومات.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "هذا الاستطلاع غير نشط حاليا.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "العودة إلى المشروع",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "لقد أنجزت بالفعل هذا الاستطلاع.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "تم إرسال الاستطلاع",

From 32a96ccd9f7e9acb7b6adc20d86fb0f34e0f80ca Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:24 +0100
Subject: [PATCH 250/282] New translations en.json (Serbian (Latin))

---
 front/app/translations/sr-Latn.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/sr-Latn.json b/front/app/translations/sr-Latn.json
index 4666bbb76d34..a4864220bf6f 100644
--- a/front/app/translations/sr-Latn.json
+++ b/front/app/translations/sr-Latn.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "Подразумевано, ваши поднесци ће бити повезани са вашим профилом, осим ако не изаберете ову опцију.",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "Објавите анонимно",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "Видљивост профила",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "This survey is not currently open for responses. Please return to the project for more information.",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "This survey is not currently active.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "Return to project",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "You have already completed this survey.",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "Survey submitted",

From bc34ab9e49d5fc4dee2687728fac79bb20c73f3c Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Fri, 8 Mar 2024 17:22:25 +0100
Subject: [PATCH 251/282] New translations en.json (Acholi)

---
 front/app/translations/ach-UG.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/front/app/translations/ach-UG.json b/front/app/translations/ach-UG.json
index bde66dcb6160..f57b51f456c4 100644
--- a/front/app/translations/ach-UG.json
+++ b/front/app/translations/ach-UG.json
@@ -964,6 +964,8 @@
   "app.containers.IdeasNewPage.IdeasNewForm.inputsAssociatedWithProfile1": "crwdns604469:0crwdne604469:0",
   "app.containers.IdeasNewPage.IdeasNewForm.postAnonymously": "crwdns604471:0crwdne604471:0",
   "app.containers.IdeasNewPage.IdeasNewForm.profileVisibility": "crwdns604473:0crwdne604473:0",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveDescription": "crwdns1919660:0crwdne1919660:0",
+  "app.containers.IdeasNewPage.SurveyNotActiveNotice.surveyNotActiveTitle": "crwdns1919662:0crwdne1919662:0",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.returnToProject": "crwdns1326154:0crwdne1326154:0",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedDescription": "crwdns1326156:0crwdne1326156:0",
   "app.containers.IdeasNewPage.SurveySubmittedNotice.surveySubmittedTitle": "crwdns1326158:0crwdne1326158:0",

From bb4a627cabb7f5b4c1f7b2542b7163ae9b3e19d4 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 8 Mar 2024 17:20:36 +0000
Subject: [PATCH 252/282] Rename storybook to chromatic in circleci config

---
 .circleci/config.yml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index f72f4c5c16ec..0af780df9bd7 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -60,7 +60,7 @@ parameters:
     type: boolean
     default: false
 
-  storybook:
+  chromatic:
     type: boolean
     default: false
 
@@ -672,7 +672,7 @@ jobs:
           path: /tmp/report.html
           destination: lighthouse
 
-  front-storybook:
+  front-chromatic:
     docker:
       - image: citizenlabdotco/cl2-devops-front-buildenv
     resource_class: medium
@@ -1322,15 +1322,15 @@ workflows:
             - "US West"
       #     - "UK"
 
-  manual-storybook:
-    when: << pipeline.parameters.storybook >>
+  manual-chromatic:
+    when: << pipeline.parameters.chromatic >>
     jobs:
-      - front-storybook:
+      - front-chromatic:
           context:
             - docker-hub-access
             - chromatic
 
-  weekly-storybook:
+  weekly-chromatic:
     triggers:
       - schedule:
           cron: 0 5 * * 1 # Every Monday at 5am: https://crontab.guru/
@@ -1339,7 +1339,7 @@ workflows:
               only:
                 - master
     jobs:
-      - front-storybook:
+      - front-chromatic:
           context:
             - docker-hub-access
             - chromatic
\ No newline at end of file

From 1a91531a1de3d61ea453368cd2a09edd8be19988 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 8 Mar 2024 17:41:06 +0000
Subject: [PATCH 253/282] Fix builds and remove broken stories that magically
 came back for some reason

---
 front/.storybook/mockModules.ts               |  2 +-
 front/app/api/phases/__mocks__/_mockServer.ts |  1 +
 .../components/UI/Button/Button.stories.tsx   | 28 ----------
 .../PrintReport/PrintReport.stories.tsx       | 38 -------------
 .../Authentication/Authentication.stories.tsx | 55 -------------------
 front/app/utils/__mocks__/locale.ts           |  4 ++
 6 files changed, 6 insertions(+), 122 deletions(-)
 delete mode 100644 front/app/components/UI/Button/Button.stories.tsx
 delete mode 100644 front/app/containers/Admin/reporting/containers/PrintReport/PrintReport.stories.tsx
 delete mode 100644 front/app/containers/Authentication/Authentication.stories.tsx

diff --git a/front/.storybook/mockModules.ts b/front/.storybook/mockModules.ts
index 6b1f7c621560..8ae99b57121a 100644
--- a/front/.storybook/mockModules.ts
+++ b/front/.storybook/mockModules.ts
@@ -4,7 +4,7 @@ const appFolder = path.join(process.cwd(), 'app');
 const rel = (...args: string[]) => path.resolve(path.join(appFolder, ...args));
 
 const mockModules = {
-  'utils/locale': rel('utils', '__mocks__', 'locale2'),
+  'utils/locale': rel('utils', '__mocks__', 'locale'),
   modules: rel('modules', '__mocks__', 'index'),
   'utils/cl-router/Link': rel('utils', 'cl-router', '__mocks__', 'Link'),
   '@researchgate/react-intersection-observer': path.join(
diff --git a/front/app/api/phases/__mocks__/_mockServer.ts b/front/app/api/phases/__mocks__/_mockServer.ts
index 6304207c8c03..1d4fb01bafda 100644
--- a/front/app/api/phases/__mocks__/_mockServer.ts
+++ b/front/app/api/phases/__mocks__/_mockServer.ts
@@ -382,6 +382,7 @@ const votingPhase: IPhaseData = {
       'da-DK': 'afstemninger',
     },
     votes_count: 0,
+    report_public: false,
   },
   relationships: {
     permissions: {
diff --git a/front/app/components/UI/Button/Button.stories.tsx b/front/app/components/UI/Button/Button.stories.tsx
deleted file mode 100644
index 57f830f5f3a4..000000000000
--- a/front/app/components/UI/Button/Button.stories.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import Button from '.';
-
-import type { Meta, StoryObj } from '@storybook/react';
-
-// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
-const meta = {
-  title: 'Example/Button',
-  component: Button,
-  parameters: {
-    // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/react/configure/story-layout
-    layout: 'centered',
-  },
-  // More on argTypes: https://storybook.js.org/docs/react/api/argtypes
-  argTypes: {
-    bgColor: { control: 'color' },
-  },
-  args: {
-    children: 'Button text',
-  },
-} satisfies Meta<typeof Button>;
-
-export default meta;
-type Story = StoryObj<typeof meta>;
-
-// More on writing stories with args: https://storybook.js.org/docs/react/writing-stories/args
-export const Primary: Story = {
-  args: {},
-};
diff --git a/front/app/containers/Admin/reporting/containers/PrintReport/PrintReport.stories.tsx b/front/app/containers/Admin/reporting/containers/PrintReport/PrintReport.stories.tsx
deleted file mode 100644
index def40ca0d5af..000000000000
--- a/front/app/containers/Admin/reporting/containers/PrintReport/PrintReport.stories.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { surveyReportHandler } from 'api/report_layout/__mocks__/_mockServer';
-
-import mockEndpoints from 'utils/storybook/mockEndpoints';
-
-import { PrintReport } from '.';
-
-import type { Meta, StoryObj } from '@storybook/react';
-
-const meta = {
-  title: 'Example/PrintReport',
-  component: PrintReport,
-  parameters: {
-    layout: 'centered',
-  },
-} satisfies Meta<typeof PrintReport>;
-
-export default meta;
-type Story = StoryObj<typeof meta>;
-
-export const Ideation: Story = {
-  args: {
-    reportId: '1',
-    _print: false,
-  },
-  parameters: {},
-};
-
-export const Survey: Story = {
-  args: {
-    reportId: '1',
-    _print: false,
-  },
-  parameters: {
-    msw: mockEndpoints({
-      'GET reports/:id/layout': surveyReportHandler,
-    }),
-  },
-};
diff --git a/front/app/containers/Authentication/Authentication.stories.tsx b/front/app/containers/Authentication/Authentication.stories.tsx
deleted file mode 100644
index 46d3958b247c..000000000000
--- a/front/app/containers/Authentication/Authentication.stories.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import React from 'react';
-
-// mocking
-import { loggedOutHandler } from 'api/me/__mocks__/_mockServer';
-
-import mockEndpoints from 'utils/storybook/mockEndpoints';
-
-// component
-import { triggerAuthenticationFlow } from './events';
-
-import Authentication from '.';
-
-import type { Meta, StoryObj } from '@storybook/react';
-
-const noop = () => {};
-
-// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
-const meta = {
-  title: 'Example/Authentication',
-  render: (props) => {
-    return (
-      <>
-        <button
-          style={{
-            backgroundColor: '#d3d3d3',
-            padding: '12px',
-            cursor: 'pointer',
-          }}
-          data-testid="open-modal-button"
-          onClick={() => triggerAuthenticationFlow()}
-        >
-          Open auth modal
-        </button>
-        <Authentication {...props} />
-      </>
-    );
-  },
-  parameters: {
-    layout: 'centered',
-  },
-  args: {
-    setModalOpen: noop,
-  },
-} satisfies Meta<typeof Authentication>;
-
-export default meta;
-type Story = StoryObj<typeof meta>;
-
-export const SignUp: Story = {
-  parameters: {
-    msw: mockEndpoints({
-      'GET users/me': loggedOutHandler,
-    }),
-  },
-};
diff --git a/front/app/utils/__mocks__/locale.ts b/front/app/utils/__mocks__/locale.ts
index 7702844c4579..e65b75b198b1 100644
--- a/front/app/utils/__mocks__/locale.ts
+++ b/front/app/utils/__mocks__/locale.ts
@@ -20,3 +20,7 @@ export function removeUrlLocale(pathname: string): string {
   }
   return urlSegments.length === 1 ? '/' : urlSegments.join('/');
 }
+
+export function hasTextInSpecifiedLocale() {
+  return true;
+}

From a423d7cf06aff707a87a1901382330dbbec3ffd1 Mon Sep 17 00:00:00 2001
From: Luuc van der Zee <luuc_v_d_zee@hotmail.com>
Date: Fri, 8 Mar 2024 18:07:20 +0000
Subject: [PATCH 254/282] Improve current stories

---
 front/app/components/InitiativeCard/InitiativeCard.stories.tsx | 2 +-
 front/app/components/ProjectCard/ProjectCard.stories.tsx       | 3 +--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/front/app/components/InitiativeCard/InitiativeCard.stories.tsx b/front/app/components/InitiativeCard/InitiativeCard.stories.tsx
index 1bf35c1827df..49d7ea583dd0 100644
--- a/front/app/components/InitiativeCard/InitiativeCard.stories.tsx
+++ b/front/app/components/InitiativeCard/InitiativeCard.stories.tsx
@@ -7,7 +7,7 @@ import type { Meta, StoryObj } from '@storybook/react';
 const meta = {
   title: 'Example/InitiativeCard',
   render: (props) => (
-    <div style={{ maxWidth: '500px' }}>
+    <div style={{ width: '400px', height: '300px' }}>
       <InitiativeCard {...props} />
     </div>
   ),
diff --git a/front/app/components/ProjectCard/ProjectCard.stories.tsx b/front/app/components/ProjectCard/ProjectCard.stories.tsx
index bfe55a9d611c..84c4b4c54411 100644
--- a/front/app/components/ProjectCard/ProjectCard.stories.tsx
+++ b/front/app/components/ProjectCard/ProjectCard.stories.tsx
@@ -7,7 +7,7 @@ import type { Meta, StoryObj } from '@storybook/react';
 const meta = {
   title: 'Example/ProjectCard',
   render: (props) => (
-    <div style={{ maxWidth: '700px' }}>
+    <div style={{ width: '700px' }}>
       <ProjectCard {...props} />
     </div>
   ),
@@ -23,6 +23,5 @@ export const Large: Story = {
   args: {
     projectId: '2',
     size: 'large',
-    layout: 'dynamic',
   },
 };

From 725b407b8f13c99d20f459af443d9787ae837c59 Mon Sep 17 00:00:00 2001
From: Amanda Anderson <anderson_amanda@mail.com>
Date: Mon, 11 Mar 2024 09:54:16 +0100
Subject: [PATCH 255/282] Disable tooltip for now until Esri released

---
 .../LayerConfiguration/MapLayersList.tsx      | 22 ++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/MapLayersList.tsx b/front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/MapLayersList.tsx
index e1703e39d7d8..02e6cf885c41 100644
--- a/front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/MapLayersList.tsx
+++ b/front/app/containers/Admin/ProjectCustomMapConfigPage/LayerConfiguration/MapLayersList.tsx
@@ -150,16 +150,18 @@ const MapLayersList = memo<Props & WrappedComponentProps & InjectedLocalized>(
       <Container className={className || ''}>
         <SubSectionTitle>
           <FormattedMessage {...messages.mapData} />
-          <StyledIconTooltip
-            content={
-              <FormattedMessage
-                {...messages.layersTooltip}
-                values={{
-                  supportArticle: supportArticleLink,
-                }}
-              />
-            }
-          />
+          {isEsriIntegrationEnabled && ( // TODO: Remove once Esri integration is released
+            <StyledIconTooltip
+              content={
+                <FormattedMessage
+                  {...messages.layersTooltip}
+                  values={{
+                    supportArticle: supportArticleLink,
+                  }}
+                />
+              }
+            />
+          )}
         </SubSectionTitle>
         {layersWithOrdering && (
           <StyledSortableList

From ba08d371139358785e07bb2a6dd0d5d354782e87 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:31:14 +0100
Subject: [PATCH 256/282] New translations en.json (French)

---
 front/app/translations/admin/fr-FR.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index 32901a67c6dd..800f9c797cd8 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Compte des réactions :",
   "app.components.admin.PostManager.PostPreview.save": "Enregistrer",
   "app.components.admin.PostManager.PostPreview.submitError": "Erreur",
+  "app.components.admin.PostManager.addFeatureLayer": "Ajouter une couche d'entités",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Copiez l'URL de la couche d'entités hébergée sur ArcGIS Online et collez-la dans le champ ci-dessous :",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Ajoutez une nouvelle couche d'entités à la carte",
+  "app.components.admin.PostManager.addWebMap": "Ajouter une Web Map",
+  "app.components.admin.PostManager.addWebMapInstruction": "Copiez l'ID de portail de votre Web Map depuis ArcGIS Online et collez-le dans le champ ci-dessous :",
   "app.components.admin.PostManager.allPhases": "Toutes les phases",
   "app.components.admin.PostManager.allProjects": "Tous les projets",
   "app.components.admin.PostManager.allStatuses": "Tous les statuts",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Attribué à moi",
   "app.components.admin.PostManager.assignee": "Responsable",
+  "app.components.admin.PostManager.authenticationError": "Une erreur d'authentification s'est produite lors de la récupération de cette couche. Veuillez vérifier l'URL et assurez-vous que votre clé API Esri a accès à cette couche.",
   "app.components.admin.PostManager.automatic": "(automatique)",
   "app.components.admin.PostManager.bodyTitle": "Description",
+  "app.components.admin.PostManager.cancel2": "Annuler",
   "app.components.admin.PostManager.changeStatusModalTitle": "Modifier le statut de cette proposition",
   "app.components.admin.PostManager.comments": "Commentaires",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Cela signifie que vous perdrez toutes les données associées à ces propositions, comme les commentaires et les votes. Cette action ne peut pas être annulée.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Latitude par défaut",
   "app.components.admin.PostManager.currentLng": "Longitude par défaut",
   "app.components.admin.PostManager.currentZoomLevel": "Niveau de zoom actuel",
+  "app.components.admin.PostManager.defaultEsriError": "Une erreur s'est produite lors de la récupération de cette couche. Veuillez vérifier l'URL ainsi que votre connexion réseau.",
   "app.components.admin.PostManager.delete": "Supprimer",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Supprimer {count} proposition(s) sélectionnée(s)",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Supprimer {count} contributions",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Modifier les statuts",
   "app.components.admin.PostManager.editTags": "Modifier les étiquettes",
   "app.components.admin.PostManager.editedPostSave": "Enregistrer",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "L'import de données depuis Esri ArcGIS Online fait partie d'une extension. Adressez-vous à votre GovSuccess Manager pour l'activer.",
+  "app.components.admin.PostManager.esriSideError": "Une erreur s'est produite avec l'application ArcGIS. Veuillez réessayer dans quelques minutes.",
+  "app.components.admin.PostManager.esriWebMap": "Web Map Esri",
   "app.components.admin.PostManager.exportAllInputs": "Exportez toutes les contributions (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Exporter tous les commentaires (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Exporter tous les commentaires pour ce project (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Exportez les contributions sélectionnées (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Exportez les commentaires pour les contributions sélectionnées (.xslx)",
   "app.components.admin.PostManager.exports": "Exports",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Pour l'import des données cartographiques, vous devez choisir entre les couches GeoJSON ou l'import depuis ArcGIS Online. Veuillez supprimer toutes les couches GeoJSON existantes si vous souhaitez ajouter une couche d'entités depuis ArcGIS.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Vous pouvez trouver l'URL de la couche d'entités sur la page d'élément correspondante sur ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Choisissez comment les autres voient votre nom",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Expliquez ce changement de statut",
   "app.components.admin.PostManager.fileUploadError": "Un ou plusieurs fichiers n'ont pas pu être téléversés. Veuillez vérifier la taille et le format du fichier et réessayer.",
   "app.components.admin.PostManager.formTitle": "Modifier l'idée",
+  "app.components.admin.PostManager.generalApiError2": "Une erreur s'est produite lors de la récupération de cet élément. Veuillez vérifier que l'URL et l'ID de portail sont corrects et que vous avez accès à cet élément.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Pour l'import des données cartographiques, vous devez choisir entre les couches GeoJSON ou l'import depuis ArcGIS Online. Veuillez supprimer toutes les données ArcGIS existantes si vous souhaitez ajouter une couche GeoJSON.",
   "app.components.admin.PostManager.goToDefaultMapView": "Aller à la centralisation et au niveau de zoom par défaut",
   "app.components.admin.PostManager.hiddenFieldsLink": "champ caché",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Conseil : ajoutez un {hiddenFieldsLink} lors de la configuration de votre enquête Typeform pour savoir qui y a répondu.",
+  "app.components.admin.PostManager.import2": "Importer",
   "app.components.admin.PostManager.importError": "Le fichier sélectionné n'a pas pu être importé car il ne s'agit pas d'un fichier GeoJSON valide",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Importer une couche d'entités Esri",
+  "app.components.admin.PostManager.importEsriWebMap": "Importer une Web Map Esri",
   "app.components.admin.PostManager.imported": "Importé",
   "app.components.admin.PostManager.initiatives": "propositions",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "propositions_commentaires",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Afficher uniquement les contributions nécessitant un retour",
   "app.components.admin.PostManager.issueFormTitle": "Modifiez le problème",
   "app.components.admin.PostManager.latestFeedbackMode": "Utiliser la dernière mise à jour comme explication",
+  "app.components.admin.PostManager.layerAdded": "Couche ajoutée",
   "app.components.admin.PostManager.likes": "Pour",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Si vous déplacez cette entrée hors de son projet actuel, vous perdrez les informations sur les phases qui lui ont été attribuées. Voulez-vous continuer ?",
+  "app.components.admin.PostManager.mapData": "Données cartographiques",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} propositions",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} contributions",
   "app.components.admin.PostManager.newFeedbackMode": "Écrivez une nouvelle mise à jour pour expliquer ce changement",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Ajoutez des étiquettes à une contribution en les glissant vers l'étiquette de votre choix.",
   "app.components.admin.PostManager.view": "Voir",
   "app.components.admin.PostManager.votes": "Votes",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Vous ne pouvez utiliser qu'une seule Web Map à la fois. Veuillez supprimer la Web Map actuelle pour en importer une autre.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Pour l'import des données cartographiques, vous devez choisir entre les couches GeoJSON ou l'import depuis ArcGIS Online. Veuillez supprimer toutes les couches GeoJSON existantes si vous souhaitez importer une Web Map.",
+  "app.components.admin.PostManager.webMapTooltip": "Vous pouvez trouver l'ID de portail de votre Web Map sur la page d'élément correspondante sur ArcGIS Online.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Moins d'un jour restant} one {Un jour restant} other {# jours restants}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de ",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "groupe",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "L'intégration Esri est un add-on. Contactez votre responsable GovSuccess si vous souhaitez plus d'informations à ce sujet.",
   "app.containers.Admin.tools.esriIntegration2": "Intégration Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Activer Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Connectez votre compte Esri et importez vos couches cartographiques depuis ArcGIS Online directement dans vos projets.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logo Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Ajoutez votre clé API Esri pour permettre l'importation de vos couches cartographiques depuis ArcGIS Online depuis l'onglet \"Carte\" de vos projets.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Clé API Esri",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Information de la couche",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Ce texte s'affiche comme bulle d'information lors du survol des éléments de la couche sur la carte",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Couches",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Nous supportons actuellement les fichiers GeoJSON. Lisez cet {supportArticle} pour obtenir des conseils sur la manière de convertir et de paramétrer des couches cartographiques.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Longitude par défaut",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centralisation et niveau de zoom par défaut de la carte",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "La centralisation et le niveau de zoom par défaut de la carte. Ajustez manuellement les valeurs ci-dessous, ou cliquez sur le bouton {button} dans le coin supérieur gauche de la carte pour enregistrer la centralisation et le niveau de zoom actuels de la carte comme valeurs par défaut.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Supprimer la couche",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Enregistrer",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "article de support",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/fr/articles/7022129-collecte-de-commentaires-et-de-reactions-liste-et-vue-cartographique",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Niveau de zoom par défaut",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Définissez le niveau de zoom de la carte par défaut. Choisissez une valeur entre 0 et 20, où 0 est entièrement dézoomé (le monde entier est visible) et 20 est entièrement zoomé (les blocs d'habitations et les bâtiments sont visibles)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymiser toutes les données des utilisateurs",

From fb1f7d6c57be975991d1b6ecf2a0ec912abe54f1 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:31:18 +0100
Subject: [PATCH 257/282] New translations en.json (Spanish)

---
 front/app/translations/admin/es-ES.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index 2bc425a007f0..abf4bef8c638 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Contador de reacciones:",
   "app.components.admin.PostManager.PostPreview.save": "Guardar",
   "app.components.admin.PostManager.PostPreview.submitError": "Error",
+  "app.components.admin.PostManager.addFeatureLayer": "Añadir capa de características",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Copia la URL de la capa de características alojada en ArcGIS Online y pégala en la siguiente entrada:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Añade una nueva capa de características al mapa",
+  "app.components.admin.PostManager.addWebMap": "Añadir Mapa Web",
+  "app.components.admin.PostManager.addWebMapInstruction": "Copia el ID del portal de tu Mapa Web de ArcGIS Online y pégalo en la entrada de abajo:",
   "app.components.admin.PostManager.allPhases": "Todas las fases",
   "app.components.admin.PostManager.allProjects": "Todos los proyectos",
   "app.components.admin.PostManager.allStatuses": "Todos los estatus",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Asignado a mí",
   "app.components.admin.PostManager.assignee": "Asignado",
+  "app.components.admin.PostManager.authenticationError": "Se ha producido un error de autenticación al intentar obtener esta capa. Comprueba la URL y que tu clave API de Esri tiene acceso a esta capa.",
   "app.components.admin.PostManager.automatic": "(automático)",
   "app.components.admin.PostManager.bodyTitle": "Descripción",
+  "app.components.admin.PostManager.cancel2": "Cancelar",
   "app.components.admin.PostManager.changeStatusModalTitle": "Cambiar el estado de esta propuesta",
   "app.components.admin.PostManager.comments": "Comentarios",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Esto significa que perderás todos los datos asociados a estas iniciativas, como comentarios y votos. Esta acción no puede deshacerse.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Latitud actual",
   "app.components.admin.PostManager.currentLng": "Longitud actual",
   "app.components.admin.PostManager.currentZoomLevel": "Nivel de zoom actual",
+  "app.components.admin.PostManager.defaultEsriError": "Se ha producido un error al intentar obtener esta capa. Comprueba tu conexión de red y que la URL es correcta.",
   "app.components.admin.PostManager.delete": "Eliminar",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Eliminar {count} propuestas seleccionadas",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Eliminar {count} entradas",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Editar estados",
   "app.components.admin.PostManager.editTags": "Editar etiquetas",
   "app.components.admin.PostManager.editedPostSave": "Guardar",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "La importación de datos de Esri ArcGIS Online es una función adicional. Habla con tu gestor de GS para desbloquearla.",
+  "app.components.admin.PostManager.esriSideError": "Se ha producido un error en la aplicación ArcGIS. Espera unos minutos y vuelve a intentarlo más tarde.",
+  "app.components.admin.PostManager.esriWebMap": "Mapa Web Esri",
   "app.components.admin.PostManager.exportAllInputs": "Exportar todos los aportes (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Exportar todos los comentarios (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Exportar todos los comentarios a este proyecto",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Exportar los aportes seleccionados (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Exportar los comentarios para los aportes seleccionados(.xslx)",
   "app.components.admin.PostManager.exports": "Exportar",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Sólo puedes cargar datos cartográficos como capas GeoJSON o importándolos de ArcGIS Online. Elimina cualquier capa GeoJSON actual si deseas añadir una capa de características.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Puedes encontrar la URL de la capa de características en la parte derecha de la página del elemento en ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Elige cómo la gente verá tu nombre",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Explica este cambio de estado",
   "app.components.admin.PostManager.fileUploadError": "No se han podido subir uno o varios archivos. Compruebe el tamaño y el formato del archivo e inténtelo de nuevo.",
   "app.components.admin.PostManager.formTitle": "Editar idea",
+  "app.components.admin.PostManager.generalApiError2": "Se ha producido un error al intentar obtener este elemento. Por favor, comprueba que la URL o el ID del Portal son correctos y que tienes acceso a este artículo.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Sólo puedes subir datos de mapas como capas GeoJSON o importándolos de ArcGIS Online. Elimina cualquier dato de ArcGIS si deseas cargar una capa GeoJSON.",
   "app.components.admin.PostManager.goToDefaultMapView": "Ir al centro del mapa por defecto y hacer zoom",
   "app.components.admin.PostManager.hiddenFieldsLink": "campos ocultos",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Sugerencia: añadir {hiddenFieldsLink} al configurar su encuesta Typeform para llevar un registro de quién ha respondido a su encuesta.",
+  "app.components.admin.PostManager.import2": "Importar",
   "app.components.admin.PostManager.importError": "El archivo seleccionado no pudo ser importado porque no es un archivo GeoJSON válido",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Importar capa de características de Esri",
+  "app.components.admin.PostManager.importEsriWebMap": "Importar Mapa Web Esri",
   "app.components.admin.PostManager.imported": "Importado",
   "app.components.admin.PostManager.initiatives": "propuestas",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "comentarios_propuestas",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Mostrar solo entradas que necesiten comentarios",
   "app.components.admin.PostManager.issueFormTitle": "Editar problema",
   "app.components.admin.PostManager.latestFeedbackMode": "Utilice la actualización más reciente como explicación",
+  "app.components.admin.PostManager.layerAdded": "Capa añadida correctamente",
   "app.components.admin.PostManager.likes": "Me gusta",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Al mover esta información fuera de su proyecto actual se perderá la información sobre sus fases asignadas. ¿Desea continuar?",
+  "app.components.admin.PostManager.mapData": "Datos del mapa",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} propuestas",
   "app.components.admin.PostManager.multipleInputs": "Entradas de {ideaCount}",
   "app.components.admin.PostManager.newFeedbackMode": "Escribir una nueva actualización para explicar este cambio",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Agrega temas a una entrada usando arrastrar y soltar.",
   "app.components.admin.PostManager.view": "Ver",
   "app.components.admin.PostManager.votes": "Votos",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Sólo puedes añadir un Mapa Web cada vez. Elimina el actual para importar uno diferente.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Sólo puedes cargar datos de mapas como capas GeoJSON o importándolos de ArcGIS Online. Elimina cualquier capa GeoJSON actual si deseas conectar un Mapa Web.",
+  "app.components.admin.PostManager.webMapTooltip": "Puedes encontrar el ID del portal Mapa Web en tu página de elementos de ArcGIS Online, a la derecha.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural,=0 {Queda menos de un día} one {Queda un día} other {Quedan # días}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "grupo",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "La integración con Esri es una función adicional. Ponte en contacto con tu Gestor de GovSuccess si deseas más información al respecto.",
   "app.containers.Admin.tools.esriIntegration2": "Integración con Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Activar Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Conecta tu cuenta Esri e importa datos de ArcGIS Online directamente a tus proyectos cartográficos.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logotipo de Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Añade tu clave API de Esri para poder importar tus capas de mapas desde ArcGIS Online en las pestañas de mapas de los proyectos.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Clave API de Esri",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Información sobre la capa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Este texto se muestra como información de la herramienta al pasar por encima de las características de la capa en el mapa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Capas",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Actualmente soportamos archivos GeoJSON. Lea el {supportArticle} para obtener consejos sobre cómo convertir y ajustar el estilo de capas de los mapas.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centro y zoom del mapa por defecto",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Punto central y nivel de zoom por defecto del mapa. Ajuste manualmente los valores que aparecen a continuación, o haga clic en el botón {button} de la esquina superior derecha del mapa para guardar el punto central y el nivel de zoom actuales como valores predeterminados.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Eliminar la capa",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Guardar",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "artículo de apoyo",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-viewhttps://support.citizenlab.co/es/articles/7025887-crear-un-proyecto-de-encuesta-externa",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nivel de zoom por defecto",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Establece el grado de ampliación del mapa por defecto. Elige un valor entre 0 y 20, donde 0 es un alejamiento total (todo el mundo es visible) y 20 es un acercamiento total (los bloques y edificios son visibles)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizar todos los datos de los usuarios",

From 446a22de7d69c8eff941eb7022082b078b3d091d Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:31:23 +0100
Subject: [PATCH 258/282] New translations en.json (Arabic)

---
 front/app/translations/admin/ar-SA.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index 247bd2385c10..1d730cf0ac78 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "يحسب رد الفعل:",
   "app.components.admin.PostManager.PostPreview.save": "حفظ",
   "app.components.admin.PostManager.PostPreview.submitError": "خطأ",
+  "app.components.admin.PostManager.addFeatureLayer": "أضف طبقة مميزة",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "انسخ عنوان URL لطبقة المعالم المستضافة على ArcGIS Online والصقه في الإدخال أدناه:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "أضف طبقة معالم جديدة إلى الخريطة",
+  "app.components.admin.PostManager.addWebMap": "إضافة خريطة الويب",
+  "app.components.admin.PostManager.addWebMapInstruction": "انسخ معرف البوابة الإلكترونية لخريطة الويب الخاصة بك من ArcGIS Online والصقه في الإدخال أدناه:",
   "app.components.admin.PostManager.allPhases": "جميع المراحل",
   "app.components.admin.PostManager.allProjects": "جميع المشاريع",
   "app.components.admin.PostManager.allStatuses": "جميع الحالات",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "معيّن إلي",
   "app.components.admin.PostManager.assignee": "المعيّن إليه",
+  "app.components.admin.PostManager.authenticationError": "حدث خطأ في المصادقة أثناء محاولة جلب هذه الطبقة. يرجى التحقق من عنوان URL ومن أن مفتاح Esri API الخاص بك لديه حق الوصول إلى هذه الطبقة.",
   "app.components.admin.PostManager.automatic": "(تلقائي)",
   "app.components.admin.PostManager.bodyTitle": "وصف",
+  "app.components.admin.PostManager.cancel2": "يلغي",
   "app.components.admin.PostManager.changeStatusModalTitle": "غيّر حالة هذا المُقترح",
   "app.components.admin.PostManager.comments": "التعليقات",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "وهذا يعني أنك ستفقد كافة البيانات المرتبطة بهذه المبادرات، مثل التعليقات والتصويتات. لا يمكن التراجع عن هذا الإجراء.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "دائرة العرض المركزية",
   "app.components.admin.PostManager.currentLng": "خط الطول المركزي",
   "app.components.admin.PostManager.currentZoomLevel": "مستوى التكبير/التصغير",
+  "app.components.admin.PostManager.defaultEsriError": "حدث خطأ أثناء محاولة جلب هذه الطبقة. يرجى التحقق من اتصال الشبكة لديك ومن صحة عنوان URL.",
   "app.components.admin.PostManager.delete": "حذف",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "احذف {count} مُقترحات محددة",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "حذف {count} مُدخلات",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "تحرير الحالات",
   "app.components.admin.PostManager.editTags": "تعديل العلامات",
   "app.components.admin.PostManager.editedPostSave": "يحفظ",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "يعد استيراد البيانات من Esri ArcGIS Online ميزة إضافية. تحدث إلى مدير GS الخاص بك لفتحه.",
+  "app.components.admin.PostManager.esriSideError": "حدث خطأ في تطبيق ArcGIS. يرجى الانتظار بضع دقائق ثم حاول مرة أخرى لاحقًا.",
+  "app.components.admin.PostManager.esriWebMap": "خريطة ويب إزري",
   "app.components.admin.PostManager.exportAllInputs": "استكشف جميع المُدخلات (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "تصدير جميع التعليقات (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "تصدير جميع التعليقات لهذا المشروع (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "استكشف المُدخلات المُختارة (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "استكشف التعليقات للمُدخلات المُختارة (.xslx)",
   "app.components.admin.PostManager.exports": "التصديرات",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "لا يجوز لك تحميل بيانات الخريطة إلا كطبقات GeoJSON أو الاستيراد من ArcGIS Online. برجاء إزالة أي طبقات GeoJSON حالية إذا كنت ترغب في إضافة طبقة معالم.",
+  "app.components.admin.PostManager.featureLayerTooltop": "يمكنك العثور على عنوان URL لطبقة المعالم على الجانب الأيمن من صفحة العنصر في ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "اختر كيف يمكن للآخرين رؤية اسمك",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "فسّر سبب تغيير هذه الحالة",
   "app.components.admin.PostManager.fileUploadError": "فشل تحميل ملف أو أكثر. يرجى التحقق من حجم الملف وتنسيقه وحاول مرة أخرى.",
   "app.components.admin.PostManager.formTitle": "تحرير الفكرة",
+  "app.components.admin.PostManager.generalApiError2": "حدث خطأ أثناء محاولة جلب هذا العنصر. يرجى التحقق من صحة عنوان URL أو معرف البوابة وأن لديك حق الوصول إلى هذا العنصر.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "لا يجوز لك تحميل بيانات الخريطة إلا كطبقات GeoJSON أو الاستيراد من ArcGIS Online. يرجى إزالة أي بيانات ArcGIS إذا كنت ترغب في تحميل طبقة GeoJSON.",
   "app.components.admin.PostManager.goToDefaultMapView": "انتقال إلى مركز الخريطة الافتراضي",
   "app.components.admin.PostManager.hiddenFieldsLink": "حقول مخفية",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "نصيحة: أضِف {hiddenFieldsLink} عند إعداد استبيان Typeform لمعرفة من أجاب عليه.",
+  "app.components.admin.PostManager.import2": "يستورد",
   "app.components.admin.PostManager.importError": "تعذر استيراد الملف المحدد؛ لأنه ليس ملف GeoJSON صالحًا",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "استيراد طبقة ميزات Esri",
+  "app.components.admin.PostManager.importEsriWebMap": "استيراد خريطة ويب Esri",
   "app.components.admin.PostManager.imported": "مستورد",
   "app.components.admin.PostManager.initiatives": "مُقترحات",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "proposal_comments",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "اعرض المُدخلات التي تحتاج إلي آراء ومقترحات تقييمية فقط",
   "app.components.admin.PostManager.issueFormTitle": "تحرير القضية",
   "app.components.admin.PostManager.latestFeedbackMode": "استخدم أحدث تحديث رسمي",
+  "app.components.admin.PostManager.layerAdded": "تمت إضافة الطبقة بنجاح",
   "app.components.admin.PostManager.likes": "الإعجابات",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "سيؤدي نقل هذا الإدخال من مشروعه الحالي إلى فقدان المعلومات عن مرحلته المعيَّنة، فهل تريد المتابعة؟",
+  "app.components.admin.PostManager.mapData": "بيانات الخريطة",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} مُقترحات",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} مُدخلات",
   "app.components.admin.PostManager.newFeedbackMode": "اكتب تحديثًا جديدًا لتفسير هذا التغيير",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "قُم بإضافة مواضيع إلى مُدخل باستخدام السحب والإسقاط. ",
   "app.components.admin.PostManager.view": "منظر",
   "app.components.admin.PostManager.votes": "الأصوات",
+  "app.components.admin.PostManager.webMapAlreadyExists": "يمكنك إضافة خريطة ويب واحدة فقط في كل مرة. قم بإزالة الملف الحالي لاستيراد ملف مختلف.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "لا يجوز لك تحميل بيانات الخريطة إلا كطبقات GeoJSON أو الاستيراد من ArcGIS Online. برجاء إزالة أي طبقات GeoJSON حالية إذا كنت ترغب في توصيل خريطة الويب.",
+  "app.components.admin.PostManager.webMapTooltip": "يمكنك العثور على معرف بوابة خريطة الويب في صفحة عنصر ArcGIS Online، على الجانب الأيمن.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {اقل من يوم} one {يوم واحد} other {# أيام}} غادر",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "من",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "مجموعة",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "يعد تكامل Esri ميزة إضافية. اتصل بمدير GovSuccess الخاص بك إذا كنت تريد المزيد من المعلومات حول هذا الأمر.",
   "app.containers.Admin.tools.esriIntegration2": "التكامل إسري",
   "app.containers.Admin.tools.esriIntegrationButton": "تمكين إزري",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "قم بتوصيل حساب Esri الخاص بك واستورد البيانات من ArcGIS Online مباشرة إلى مشاريع رسم الخرائط الخاصة بك.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "شعار إسري",
   "app.containers.Admin.tools.esriKeyInputDescription": "أضف مفتاح Esri API الخاص بك للسماح باستيراد طبقات الخريطة من ArcGIS Online في علامات تبويب الخريطة في المشروعات.",
   "app.containers.Admin.tools.esriKeyInputLabel": "مفتاح Esri API",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "تلميح أداة الطبقة",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "يظهر هذا النص على هيئة تلميح أداة عند تمرير مؤشر الماوس فوق ميزات الطبقة على الخريطة",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "طبقات الخريطة",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "ندعم ملفات GeoJSON في الوقت الحالي. اقرأ {supportArticle} للاطلاع على تلميحات بشأن كيفية تحويل طبقات خريطة وتصميمها.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "خط الطول الافتراضي",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "المركز ومستوى التكبير/التصغير الافتراضيان للخريطة",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "المركز ومستوى التكبير/التصغير الافتراضيان للخريطة. اضبط القيم أدناه يدويًا أو انقر على الزر {button} في الركن العلوي الأيمن من الخريطة لحفظ نقطة المركز ومستوى التكبير/التصغير الحاليين للخريطة باعتبارهما قيمتين افتراضيتين.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "إزالة طبقة",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "حفظ",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "مقالة دعم",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "مستوى تكبير/تصغير الخريطة",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "مستوى التكبير/التصغير الافتراضي للخريطة. يمكن قبول قيمة بين 1 و17، حيث تشير 1 إلى التصغير الكامل (إمكانية رؤية العالم بكامله) و17 إلى التكبير الكامل (إمكانية رؤية المربعات السكنية والمباني)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "إخفاء هوية جميع بيانات المستخدم",

From 8e9513807a262c78e63828e29112e9c0b3e29635 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:31:29 +0100
Subject: [PATCH 259/282] New translations en.json (Danish)

---
 front/app/translations/admin/da-DK.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 0510048eac46..fd329cf17cc7 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Stemmer tæller:",
   "app.components.admin.PostManager.PostPreview.save": "Gem",
   "app.components.admin.PostManager.PostPreview.submitError": "Fejl",
+  "app.components.admin.PostManager.addFeatureLayer": "Tilføj funktionslag",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Kopier URL'en til funktionslaget, der er hostet på ArcGIS Online, og indsæt den i inputfeltet nedenfor:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Tilføj et nyt funktionslag til kortet",
+  "app.components.admin.PostManager.addWebMap": "Tilføj webkort",
+  "app.components.admin.PostManager.addWebMapInstruction": "Kopier portal-ID'et for dit webkort fra ArcGIS Online, og indsæt det i feltet nedenfor:",
   "app.components.admin.PostManager.allPhases": "Alle faser",
   "app.components.admin.PostManager.allProjects": "Alle projekter",
   "app.components.admin.PostManager.allStatuses": "Alle status",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "Tildelt til {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Tildelt til mig",
   "app.components.admin.PostManager.assignee": "Modtager",
+  "app.components.admin.PostManager.authenticationError": "Der opstod en godkendelsesfejl under forsøget på at hente dette lag. Tjek venligst URL'en, og at din Esri API-nøgle har adgang til dette lag.",
   "app.components.admin.PostManager.automatic": "(automatisk)",
   "app.components.admin.PostManager.bodyTitle": "Beskrivelse",
+  "app.components.admin.PostManager.cancel2": "Afbryd",
   "app.components.admin.PostManager.changeStatusModalTitle": "Ændre dette forslags status",
   "app.components.admin.PostManager.comments": "Kommentarer",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Det betyder, at du mister alle data, der er forbundet med disse forslag, såsom kommentarer og stemmer. Denne handling kan ikke fortrydes.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Centrer breddegrad",
   "app.components.admin.PostManager.currentLng": "Midterste længdegrad",
   "app.components.admin.PostManager.currentZoomLevel": "Zoomniveau",
+  "app.components.admin.PostManager.defaultEsriError": "Der opstod en fejl under forsøget på at hente dette lag. Tjek venligst din netværksforbindelse, og at URL'en er korrekt.",
   "app.components.admin.PostManager.delete": "Slet",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Slet {count} ududvalgtee forslag",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Slet {count} indlæg",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Rediger statusser",
   "app.components.admin.PostManager.editTags": "Rediger tags",
   "app.components.admin.PostManager.editedPostSave": "Gem",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Import af data fra Esri ArcGIS Online er en add-on-funktion. Tal med din GS-manager for at låse den op.",
+  "app.components.admin.PostManager.esriSideError": "Der opstod en fejl i ArcGIS-applikationen. Vent venligst et par minutter og prøv igen senere.",
+  "app.components.admin.PostManager.esriWebMap": "Esri-webkort",
   "app.components.admin.PostManager.exportAllInputs": "Eksporter alle indlæg (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Eksporter alle kommentarer (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Eksporter kommentarer til dette projekt (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Eksportér de valgte input (.xlsx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Eksporter kommentarer fra de valgte input (.xlsx)",
   "app.components.admin.PostManager.exports": "Eksport",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Du må kun uploade kortdata som enten GeoJSON-lag eller import fra ArcGIS Online. Fjern venligst alle nuværende GeoJSON-lag, hvis du ønsker at tilføje et funktionslag.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Du kan finde URL'en til funktionslaget i højre side af elementets side på ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Udvalgt, hvordan deltagere vil se din navn",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Forklar denne statusændring",
   "app.components.admin.PostManager.fileUploadError": "En eller flere filer blev ikke uploadet. Kontroller venligst filstørrelsen og formatet og prøv igen.",
   "app.components.admin.PostManager.formTitle": "Rediger idé",
+  "app.components.admin.PostManager.generalApiError2": "Der opstod en fejl under forsøget på at hente dette element. Tjek venligst, at URL'en eller portal-ID'et er korrekt, og at du har adgang til dette element.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Du kan kun uploade kortdata som enten GeoJSON-lag eller import fra ArcGIS Online. Fjern venligst alle ArcGIS-data, hvis du ønsker at uploade et GeoJSON-lag.",
   "app.components.admin.PostManager.goToDefaultMapView": "Gå til standardkortcenter",
   "app.components.admin.PostManager.hiddenFieldsLink": "skjulte felter",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Tip: Hvis du bruger Typeform, kan du tilføje {hiddenFieldsLink} for at holde styr på, hvem der har svaret på din undersøgelse.",
+  "app.components.admin.PostManager.import2": "Import",
   "app.components.admin.PostManager.importError": "Den ududvalgte fil kunne ikke importeres, fordi det ikke er en gyldig GeoJSON-fil",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Import af Esri-funktionslag",
+  "app.components.admin.PostManager.importEsriWebMap": "Import af Esri-webkort",
   "app.components.admin.PostManager.imported": "Importeret",
   "app.components.admin.PostManager.initiatives": "forslag",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "forslag_kommentarer",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Vis kun input, der har brug for feedback",
   "app.components.admin.PostManager.issueFormTitle": "Rediger spørgsmål",
   "app.components.admin.PostManager.latestFeedbackMode": "Brug den seneste eksisterende officielle opdatering som en forklaring",
+  "app.components.admin.PostManager.layerAdded": "Lag tilføjet med succes",
   "app.components.admin.PostManager.likes": "Likes",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Hvis du flytter dette input væk fra det aktuelle projekt, vil oplysningerne om de tildelte faser gå tabt. Ønsker du at fortsætte?",
+  "app.components.admin.PostManager.mapData": "Kortdata",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} forslag",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} input",
   "app.components.admin.PostManager.newFeedbackMode": "Skriv en ny opdatering for at forklare denne ændring",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Føj emner til et input ved hjælp af træk og slip.",
   "app.components.admin.PostManager.view": "Se",
   "app.components.admin.PostManager.votes": "Stemmer",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Du kan kun tilføje ét webkort ad gangen. Fjern det aktuelle for at importere et andet.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Du må kun uploade kortdata som enten GeoJSON-lag eller import fra ArcGIS Online. Fjern venligst alle nuværende GeoJSON-lag, hvis du ønsker at forbinde et webkort.",
+  "app.components.admin.PostManager.webMapTooltip": "Du kan finde webkortportalens ID på din ArcGIS Online-emneside i højre side.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mindre end en dag} one {En dag} other {# dage}} tilbage",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "fra",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "gruppe",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "Esri-integrationen er en add-on-funktion. Kontakt Søren Kielgast (soren@citizenlab.dk), hvis du vil have flere oplysninger om dette.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Aktivér Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Forbind din Esri-konto, og importer data fra ArcGIS Online direkte til dine kortlægningsprojekter.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Tilføj din Esri API-nøgle for at tillade import af dine kortlag fra ArcGIS Online i kortfanerne i projekter.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API-nøgle",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Lag tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Denne tekst vises som et værktøjstip, når du holder musen over lagfunktionerne på kortet",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Kortlag",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Vi understøtter i øjeblikket GeoJSON-filer. Læs {supportArticle} for at få tips om, hvordan du konverterer og stiliserer kortlag.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standardlængde",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Kortets standardcenter og -zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Kortets standardcenterpunkt og zoomniveau. Juster værdierne nedenfor manuelt, eller klik på knappen {button} toppen til højre på kortet for at gemme kortets aktuelle centerpunkt og zoomniveau som standardværdier.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Fjern lag",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Gem",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "støtteartikel",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "{tenantName, select,  {https://matomo.org/} other {https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view}}",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Kortets zoomniveau",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Standardzoomniveauet for kortet. Accepterer en værdi mellem 1 og 17, hvor 1 er fuldt udzoomet (hele verden er synlig) og 17 er fuldt indzoomet (blokke og bygninger er synlige)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymisering af alle brugerdata",

From 94f076499a36291b4294e5083048d707cadea12b Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:31:33 +0100
Subject: [PATCH 260/282] New translations en.json (German)

---
 front/app/translations/admin/de-DE.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index 255e474a0393..9ea5bf42a510 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Anzahl Reaktionen:",
   "app.components.admin.PostManager.PostPreview.save": "Speichern",
   "app.components.admin.PostManager.PostPreview.submitError": "Fehler",
+  "app.components.admin.PostManager.addFeatureLayer": "Feature-Layer hinzufügen",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Kopieren Sie die URL des Feature Layers, der auf ArcGIS Online gehostet wird, und fügen Sie sie hier ein:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Fügen Sie der Karte eine neue Funktionsebene hinzu",
+  "app.components.admin.PostManager.addWebMap": "Webkarte hinzufügen",
+  "app.components.admin.PostManager.addWebMapInstruction": "Kopieren Sie die Portal-ID Ihrer Webkarte aus ArcGIS Online und fügen Sie sie hier ein:",
   "app.components.admin.PostManager.allPhases": "Alle Phasen",
   "app.components.admin.PostManager.allProjects": "{orgName, select, München {Alle Bezirke oder Projekte} other {Alle Projekte}}",
   "app.components.admin.PostManager.allStatuses": "Alle Status",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "Zugewiesen an {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Mir zugewiesen",
   "app.components.admin.PostManager.assignee": "Zugewiesen an",
+  "app.components.admin.PostManager.authenticationError": "Beim Versuch, diese Ebene abzurufen, ist ein Authentifizierungsfehler aufgetreten. Bitte überprüfen Sie die URL und stellen Sie sicher, dass Ihr Esri API-Schlüssel Zugriff auf diese Ebene hat.",
   "app.components.admin.PostManager.automatic": "(automatisch)",
   "app.components.admin.PostManager.bodyTitle": "Beschreibung",
+  "app.components.admin.PostManager.cancel2": "Abbrechen",
   "app.components.admin.PostManager.changeStatusModalTitle": "Den Status dieses Vorschlags ändern",
   "app.components.admin.PostManager.comments": "Kommentare",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Das bedeutet, dass Sie alle Daten, die mit diesen Initiativen verbunden sind, wie Kommentare und Abstimmungen, verlieren. Diese Aktion kann nicht rückgängig gemacht werden.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Längengrad Mitte",
   "app.components.admin.PostManager.currentLng": "Längengrad Mitte",
   "app.components.admin.PostManager.currentZoomLevel": "Zoom-Level",
+  "app.components.admin.PostManager.defaultEsriError": "Beim Versuch, diese Ebene abzurufen, ist ein Fehler aufgetreten. Bitte überprüfen Sie Ihre Netzwerkverbindung und ob die URL korrekt ist.",
   "app.components.admin.PostManager.delete": "Löschen",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "{count} ausgewählte Vorschläge löschen",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "{count} Beiträge löschen",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Status bearbeiten",
   "app.components.admin.PostManager.editTags": "Tags bearbeiten",
   "app.components.admin.PostManager.editedPostSave": "Speichern",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Der Import von Daten aus Esri ArcGIS Online ist eine kostenpflichtige Zusatzfunktion. Sprechen Sie mit Ihrer Kundenbetreuerin, um sie freizuschalten.",
+  "app.components.admin.PostManager.esriSideError": "In der ArcGIS-Anwendung ist ein Fehler aufgetreten. Bitte warten Sie ein paar Minuten und versuchen Sie es später noch einmal.",
+  "app.components.admin.PostManager.esriWebMap": "Esri-Webkarte",
   "app.components.admin.PostManager.exportAllInputs": "Alle Beiträge exportieren (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Alle Kommentare exportieren (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Kommentare für dieses Projekt exportieren (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Ausgewählte Beiträge exportieren (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Kommentare der ausgewählten Beiträge exportieren (.xslx)",
   "app.components.admin.PostManager.exports": "Exportieren",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Sie können Kartendaten nur entweder als GeoJSON-Ebenen hochladen oder aus ArcGIS Online importieren. Bitte entfernen Sie alle aktuellen GeoJSON-Layer, wenn Sie einen Feature-Layer hinzufügen möchten.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Die URL des Feature Layers finden Sie auf der rechten Seite der Artikelseite in ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Wählen Sie, wie Ihr Name angezeigt werden soll",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Erklären Sie diese Statusänderung",
   "app.components.admin.PostManager.fileUploadError": "Eine oder mehrere Dateien konnten nicht hochgeladen werden. Bitte überprüfen Sie die Dateigröße und das Format und versuchen Sie es erneut.",
   "app.components.admin.PostManager.formTitle": "Idee bearbeiten",
+  "app.components.admin.PostManager.generalApiError2": "Beim Versuch, dieses Element abzurufen, ist ein Fehler aufgetreten. Bitte überprüfen Sie, ob die URL oder Portal-ID korrekt ist und Sie Zugriff auf dieses Element haben.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Sie können nur Kartendaten hochladen, die entweder als GeoJSON-Layer vorliegen oder aus ArcGIS Online importiert wurden. Bitte entfernen Sie alle ArcGIS-Daten, wenn Sie einen GeoJSON-Layer hochladen möchten.",
   "app.components.admin.PostManager.goToDefaultMapView": "Zum Standard-Kartenzentrum",
   "app.components.admin.PostManager.hiddenFieldsLink": "ausgeblendete Felder",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/de/articles/7042707-einbetten-einer-typeform-umfrage-in-ihr-projekt",
   "app.components.admin.PostManager.hiddenFieldsTip": "Tipp: Fügen Sie {hiddenFieldsLink} hinzu, wenn Sie Ihre Typeform-Umfrage einrichten, um den Überblick zu behalten, wer auf Ihre Umfrage geantwortet hat.",
+  "app.components.admin.PostManager.import2": "Importieren",
   "app.components.admin.PostManager.importError": "Die ausgewählte Datei konnte nicht importiert werden, da es sich nicht um eine gültige GeoJSON-Datei handelt",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Esri Feature Layer importieren",
+  "app.components.admin.PostManager.importEsriWebMap": "Esri-Webkarte importieren",
   "app.components.admin.PostManager.imported": "Importiert",
   "app.components.admin.PostManager.initiatives": "vorschläge",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "proposal_comments",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Nur Beiträge anzeigen, die eine Rückmeldung erfordern",
   "app.components.admin.PostManager.issueFormTitle": "Thema bearbeiten",
   "app.components.admin.PostManager.latestFeedbackMode": "Verwenden Sie das letzte vorhandene offizielle Update als Erklärung",
+  "app.components.admin.PostManager.layerAdded": "Ebene erfolgreich hinzugefügt",
   "app.components.admin.PostManager.likes": "Gefällt mir",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Wenn Sie diesen Beitrag von ihrem aktuellen Projekt wegbewegen, gehen die Informationen über die ihm zugewiesenen Phasen verloren. Möchten Sie fortfahren?",
+  "app.components.admin.PostManager.mapData": "Kartendaten",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} Vorschläge",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} Beiträge",
   "app.components.admin.PostManager.newFeedbackMode": "Schreiben Sie ein neues Update, um diese Änderung zu erklären",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Fügen Sie Themen per Drag & Drop zu einem Eintrag hinzu.",
   "app.components.admin.PostManager.view": "Vorschau",
   "app.components.admin.PostManager.votes": "Stimmen",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Sie können jeweils nur eine Webkarte hinzufügen. Entfernen Sie die aktuelle Karte, um eine andere Karte zu importieren.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Sie können Kartendaten nur entweder als GeoJSON-Ebenen hochladen oder aus ArcGIS Online importieren. Bitte entfernen Sie alle aktuellen GeoJSON-Ebenen, wenn Sie eine Webkarte hinzufügen möchten.",
+  "app.components.admin.PostManager.webMapTooltip": "Sie finden die Webkarten-Portal-ID auf Ihrer ArcGIS Online-Elementseite auf der rechten Seite.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Weniger als ein Tag} one {Ein Tag} other {# Tage}} verbleibend",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "von",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "gruppe",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "Die Esri-Integration ist eine Zusatzfunktion. Wenden Sie sich an Ihre Kundenbetreuerin, wenn Sie weitere Informationen dazu wünschen.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-Integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Esri aktivieren",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Verbinden Sie Ihr Esri-Konto und importieren Sie Daten aus ArcGIS Online direkt in Ihre Kartierungsprojekte.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-Logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Fügen Sie Ihren Esri API-Schlüssel hinzu, um den Import Ihrer Kartenebenen aus ArcGIS Online in die Kartenregisterkarten in Projekten zu ermöglichen.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API-Schlüssel",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer-Tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Dieser Text wird als QuickInfo angezeigt, wenn Sie den Mauszeiger über die Ebenenmerkmale in der Karte bewegen",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Kartenebenen",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Wir unterstützen derzeit GeoJSON-Dateien. Lesen Sie den {supportArticle} für Tipps zum Konvertieren und Gestalten von Kartenebenen.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standard-Längengrad",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Standard-Kartenmittelpunkt und -Zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Der Standard-Mittelpunkt und die Standard-Zoomstufe der Karte. Passen Sie die Werte unten manuell an, oder klicken Sie auf den Button {button} in der oberen rechten Ecke der Karte, um den aktuellen Mittelpunkt und die Zoomstufe der Karte als Standardwerte zu speichern.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Ebene entfernen",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Speichern",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "Support-Artikel",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/de/articles/7022129-sammeln-von-input-und-feedback-listen-und-kartenansicht",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Zoomstufe der Karte",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Die Standard-Zoomstufe der Karte. Akzeptiert einen Wert zwischen 1 und 17, wobei 1 vollständig herausgezoomt ist (die gesamte Welt ist sichtbar) und 17 vollständig hineingezoomt ist (Häuserblöcke und Gebäude sind sichtbar)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymisierung aller Nutzer*innendaten",

From 0246ce18d5e7d4c158b74ee294a24992018f9e6c Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:31:40 +0100
Subject: [PATCH 261/282] New translations en.json (Finnish)

---
 front/app/translations/admin/fi-FI.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index 8a5fb369ee68..3a45fa5782cd 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Reaktiomäärät:",
   "app.components.admin.PostManager.PostPreview.save": "Tallentaa",
   "app.components.admin.PostManager.PostPreview.submitError": "Virhe",
+  "app.components.admin.PostManager.addFeatureLayer": "Lisää ominaisuustaso",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Kopioi ArcGIS Onlinessa isännöidyn ominaisuuskerroksen URL-osoite ja liitä se alla olevaan syötteeseen:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Lisää karttaan uusi ominaisuustaso",
+  "app.components.admin.PostManager.addWebMap": "Lisää verkkokartta",
+  "app.components.admin.PostManager.addWebMapInstruction": "Kopioi verkkokarttasi portaalitunnus ArcGIS Onlinesta ja liitä se alla olevaan syötteeseen:",
   "app.components.admin.PostManager.allPhases": "Kaikki vaiheet",
   "app.components.admin.PostManager.allProjects": "Kaikki projektit",
   "app.components.admin.PostManager.allStatuses": "Kaikki tilat",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "Osoitettu {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Minulle määrätty",
   "app.components.admin.PostManager.assignee": "Valtuutettu",
+  "app.components.admin.PostManager.authenticationError": "Tätä tasoa haettaessa tapahtui todennusvirhe. Tarkista URL-osoite ja että Esri API -avaimellasi on pääsy tähän tasoon.",
   "app.components.admin.PostManager.automatic": "(Automaattinen)",
   "app.components.admin.PostManager.bodyTitle": "Kuvaus",
+  "app.components.admin.PostManager.cancel2": "Peruuttaa",
   "app.components.admin.PostManager.changeStatusModalTitle": "Muuta tämän ehdotuksen tilaa",
   "app.components.admin.PostManager.comments": "Kommentit",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Tämä tarkoittaa, että menetät kaikki näihin aloitteisiin liittyvät tiedot, kuten kommentit ja äänet. Tätä toimintoa ei voi kumota.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Keskileveysaste",
   "app.components.admin.PostManager.currentLng": "Keskipituusaste",
   "app.components.admin.PostManager.currentZoomLevel": "Zoomaustaso",
+  "app.components.admin.PostManager.defaultEsriError": "Tämän kerroksen noutamisessa tapahtui virhe. Tarkista verkkoyhteytesi ja että URL-osoite on oikea.",
   "app.components.admin.PostManager.delete": "Poistaa",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Poista {count} valitut ehdotukset",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Poista {count} viestit",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Muokkaa tiloja",
   "app.components.admin.PostManager.editTags": "Muokkaa tunnisteita",
   "app.components.admin.PostManager.editedPostSave": "Tallentaa",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Tietojen tuonti Esri ArcGIS Onlinesta on lisäominaisuus. Keskustele GS-päällikön kanssa avataksesi sen.",
+  "app.components.admin.PostManager.esriSideError": "ArcGIS-sovelluksessa tapahtui virhe. Odota muutama minuutti ja yritä myöhemmin uudelleen.",
+  "app.components.admin.PostManager.esriWebMap": "Esri Web Map",
   "app.components.admin.PostManager.exportAllInputs": "Vie kaikki viestit (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Vie kaikki kommentit (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Vie tämän projektin kommentit (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Vie valitut viestit (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Vie valittujen viestien kommentit (.xslx)",
   "app.components.admin.PostManager.exports": "Vienti",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Voit ladata karttatietoja vain joko GeoJSON-tasoina tai tuomalla ArcGIS Onlinesta. Poista kaikki nykyiset GeoJSON-tasot, jos haluat lisätä ominaisuuskerroksen.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Löydät ominaisuuskerroksen URL-osoitteen ArcGIS Onlinen tuotesivun oikealta puolelta.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Valitse, miten ihmiset näkevät nimesi",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Selitä tämä tilamuutos",
   "app.components.admin.PostManager.fileUploadError": "Yhden tai useamman tiedoston lataaminen epäonnistui. Tarkista tiedoston koko ja muoto ja yritä uudelleen.",
   "app.components.admin.PostManager.formTitle": "Muokkaa ideaa",
+  "app.components.admin.PostManager.generalApiError2": "Tätä kohdetta haettaessa tapahtui virhe. Tarkista, että URL-osoite tai portaalin tunnus on oikea ja että sinulla on pääsy tähän kohteeseen.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Voit ladata karttatietoja vain joko GeoJSON-tasoina tai tuomalla ArcGIS Onlinesta. Poista kaikki ArcGIS-tiedot, jos haluat ladata GeoJSON-kerroksen.",
   "app.components.admin.PostManager.goToDefaultMapView": "Siirry oletuskarttakeskukseen",
   "app.components.admin.PostManager.hiddenFieldsLink": "piilotetut kentät",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Vinkki: Jos käytät Typeformia, lisää {hiddenFieldsLink} seurataksesi kyselyysi vastanneista.",
+  "app.components.admin.PostManager.import2": "Tuonti",
   "app.components.admin.PostManager.importError": "Valittua tiedostoa ei voitu tuoda, koska se ei ole kelvollinen GeoJSON-tiedosto",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Tuo Esri Feature Layer",
+  "app.components.admin.PostManager.importEsriWebMap": "Tuo Esri Web Map",
   "app.components.admin.PostManager.imported": "Tuotu",
   "app.components.admin.PostManager.initiatives": "ehdotuksia",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "ehdotus_kommentit",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Näytä vain viestit, jotka tarvitsevat palautetta",
   "app.components.admin.PostManager.issueFormTitle": "Muokkaa ongelmaa",
   "app.components.admin.PostManager.latestFeedbackMode": "Käytä viimeisintä olemassa olevaa virallista päivitystä selityksenä",
+  "app.components.admin.PostManager.layerAdded": "Taso lisätty onnistuneesti",
   "app.components.admin.PostManager.likes": "Tykkää",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Tämän syötteen siirtäminen pois nykyisestä projektista menettää tiedot sille osoitetuista vaiheista. Haluatko edetä?",
+  "app.components.admin.PostManager.mapData": "Karttatiedot",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} ehdotuksia",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} viestiä",
   "app.components.admin.PostManager.newFeedbackMode": "Kirjoita uusi päivitys selittääksesi tämän muutoksen",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Lisää tunnisteita syötteeseen vetämällä ja pudottamalla.",
   "app.components.admin.PostManager.view": "Näytä",
   "app.components.admin.PostManager.votes": "Äänet",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Voit lisätä vain yhden verkkokartan kerrallaan. Poista nykyinen tuodaksesi toisen.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Voit ladata karttatietoja vain joko GeoJSON-tasoina tai tuomalla ArcGIS Onlinesta. Poista kaikki nykyiset GeoJSON-tasot, jos haluat yhdistää verkkokartan.",
+  "app.components.admin.PostManager.webMapTooltip": "Löydät Web Map -portaalin tunnuksen ArcGIS Online -kohdesivultasi oikealta.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Alle päivä} one {Yksi päivä} other {# päivää}} jäljellä",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "alkaen",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "ryhmä",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "Esri-integraatio on lisäominaisuus. Ota yhteyttä GovSuccess Manageriin, jos haluat lisätietoja tästä.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-integraatio",
   "app.containers.Admin.tools.esriIntegrationButton": "Ota Esri käyttöön",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Yhdistä Esri-tilisi ja tuo tiedot ArcGIS Onlinesta suoraan karttaprojekteihisi.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Lisää Esri API -avain salliaksesi karttatasosi tuomisen ArcGIS Onlinesta projektien karttavälilehdillä.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API avain",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Tason työkaluvinkki",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Tämä teksti näytetään työkaluvihjeenä, kun hiiren osoitin viedään kartan tasoominaisuuksien päälle",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Karttatasot",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Tuemme tällä hetkellä GeoJSON-tiedostoja. Lue {supportArticle} saadaksesi vinkkejä karttatasojen muuntamiseen ja tyyliin.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Oletuspituusaste",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Kartan oletuskeskus ja zoomaus",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Kartan oletuskeskipiste ja zoomaustaso. Säädä alla olevia arvoja manuaalisesti tai napsauta kartan oikeassa yläkulmassa olevaa {button} -painiketta tallentaaksesi kartan nykyisen keskipisteen ja zoomaustason oletusarvoiksi.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Poista kerros",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Tallentaa",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "tukiartikkeli",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Kartan zoomaustaso",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Kartan oletuszoomaustaso. Hyväksyy arvon väliltä 1–17, jossa 1 on täysin loitonnettu (koko maailma on näkyvissä) ja 17 on täysin zoomattu (korttelin ja rakennukset näkyvät)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymisoi kaikki käyttäjätiedot",

From 7ba48b6ba4cbac2c8f3f0a8f56e7f25bd00a4489 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:31:47 +0100
Subject: [PATCH 262/282] New translations en.json (Dutch)

---
 front/app/translations/admin/nl-NL.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index 1324297c4ed4..02f0bc3d3bab 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Aantal likes/dislikes:",
   "app.components.admin.PostManager.PostPreview.save": "Opslaan",
   "app.components.admin.PostManager.PostPreview.submitError": "Fout",
+  "app.components.admin.PostManager.addFeatureLayer": "Functielaag toevoegen",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Kopieer de URL van de functielaag die gehost wordt op ArcGIS Online en plak deze in het onderstaande veld:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Voeg een nieuwe functielaag toe aan de kaart",
+  "app.components.admin.PostManager.addWebMap": "Webkaart toevoegen",
+  "app.components.admin.PostManager.addWebMapInstruction": "Kopieer de portal ID van je webkaart uit ArcGIS Online en plak deze in het onderstaande veld:",
   "app.components.admin.PostManager.allPhases": "Alle fases",
   "app.components.admin.PostManager.allProjects": "Alle projecten",
   "app.components.admin.PostManager.allStatuses": "Alle statussen",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Toegewezen aan mij",
   "app.components.admin.PostManager.assignee": "Toegewezen aan",
+  "app.components.admin.PostManager.authenticationError": "Er is een authenticatiefout opgetreden tijdens het ophalen van deze laag. Controleer de URL en of je Esri API-sleutel toegang heeft tot deze laag.",
   "app.components.admin.PostManager.automatic": "(automatisch)",
   "app.components.admin.PostManager.bodyTitle": "Beschrijving",
+  "app.components.admin.PostManager.cancel2": "Annuleer",
   "app.components.admin.PostManager.changeStatusModalTitle": "Wijzig de status van dit voorstel",
   "app.components.admin.PostManager.comments": "Reacties",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Dit betekent dat je alle gegevens verliest die bij deze voorstellen horen, zoals reacties en stemmen. Deze actie kan niet ongedaan worden gemaakt.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Huidige breedtegraad",
   "app.components.admin.PostManager.currentLng": "Huidige lengtegraad",
   "app.components.admin.PostManager.currentZoomLevel": "Huidig zoomniveau",
+  "app.components.admin.PostManager.defaultEsriError": "Er is een fout opgetreden tijdens het ophalen van deze laag. Controleer je netwerkverbinding en of de URL correct is.",
   "app.components.admin.PostManager.delete": "Verwijder",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Verwijder {count} geselecteerde voorstellen",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Verwijder {count} bijdragen",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Bewerk statussen",
   "app.components.admin.PostManager.editTags": "Bewerk tags",
   "app.components.admin.PostManager.editedPostSave": "Bewaar",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Het importeren van gegevens uit Esri ArcGIS Online is een add-on functionaliteit. Neem contact op met je Government Success manager om deze functionaliteit te ontgrendelen.",
+  "app.components.admin.PostManager.esriSideError": "Er is een fout opgetreden in de ArcGIS-toepassing. Wacht een paar minuten en probeer het later nog eens.",
+  "app.components.admin.PostManager.esriWebMap": "Esri-webkaart",
   "app.components.admin.PostManager.exportAllInputs": "Alle bijdragen exporteren (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Alle reacties exporteren (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Alle reacties van dit project exporteren (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Geselecteerde bijdragen selecteren (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Opmerkingen voor geselecteerde bijdragen exporteren (.xslx)",
   "app.components.admin.PostManager.exports": "Exporteren",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Je mag alleen kaartgegevens uploaden als GeoJSON laag of als je importeert vanuit ArcGIS Online. Verwijder alle huidige GeoJSON lagen als je een functielaag wilt toevoegen.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Je vindt de URL van de functielaag aan de rechterkant van de itempagina op ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Kies welke naam getoond wordt",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Verklaar deze statuswijziging",
   "app.components.admin.PostManager.fileUploadError": "Een of meer bestanden zijn niet geüpload. Controleer de bestandsgrootte en het formaat en probeer het opnieuw.",
   "app.components.admin.PostManager.formTitle": "Idee bewerken",
+  "app.components.admin.PostManager.generalApiError2": "Er is een fout opgetreden tijdens het ophalen van dit item. Controleer of de URL of Portal ID correct is en of je toegang hebt tot dit item.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Je mag alleen kaartgegevens uploaden als GeoJSON laag of als je importeert vanuit ArcGIS Online. Verwijder alle ArcGIS gegevens als je een GeoJSON laag wilt uploaden.",
   "app.components.admin.PostManager.goToDefaultMapView": "Ga naar het standaard middelpunt en zoom-niveau",
   "app.components.admin.PostManager.hiddenFieldsLink": "verborgen veld",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Tip: voeg {hiddenFieldsLink} toe bij het instellen van je TypeForm-enquête om bij te houden wie er deelnam.",
+  "app.components.admin.PostManager.import2": "Importeren",
   "app.components.admin.PostManager.importError": "Het geselecteerde bestand kon niet worden geïmporteerd omdat het geen geldig GeoJSON-bestand is",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Importeer Esri-functielaag",
+  "app.components.admin.PostManager.importEsriWebMap": "Importeer Esri-webkaart",
   "app.components.admin.PostManager.imported": "Geïmporteerd",
   "app.components.admin.PostManager.initiatives": "voorstellen",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "reacties_op_voorstellen",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Toon alleen bijdragen die feedback nodig hebben",
   "app.components.admin.PostManager.issueFormTitle": "Stelling bewerken",
   "app.components.admin.PostManager.latestFeedbackMode": "Gebruik de laatste officiële update",
+  "app.components.admin.PostManager.layerAdded": "Laag succesvol toegevoegd",
   "app.components.admin.PostManager.likes": "Likes",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Als u deze inputs verwijdert van het huidige project, gaat de informatie over de toegewezen fasen verloren. Wilt u doorgaan?",
+  "app.components.admin.PostManager.mapData": "Kaartgegevens",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} voorstellen",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} bijdragen",
   "app.components.admin.PostManager.newFeedbackMode": "Schrijf een nieuwe update om deze wijziging te verklaren",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Voeg tags toe aan een bijdrage door ze naar daar te verslepen.",
   "app.components.admin.PostManager.view": "Bekijk",
   "app.components.admin.PostManager.votes": "Stemmen",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Je kunt maar één webkaart per keer toevoegen. Verwijder de huidige om een andere te importeren.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Je mag alleen kaartgegevens uploaden als GeoJSON laag of als je importeert vanuit ArcGIS Online. Verwijder alle huidige GeoJSON lagen als je een webkaart wilt koppelen.",
+  "app.components.admin.PostManager.webMapTooltip": "Je kunt de portal-ID van de webkaart vinden op de itempagina van ArcGIS Online, aan de rechterkant.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Minder dan een dag} one {Een dag} other {# dagen}} over",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "van",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "groep",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "De Esri-integratie is een add-on functie. Neem contact op met je Government Success Manager als je hier meer informatie over wilt.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-integratie",
   "app.containers.Admin.tools.esriIntegrationButton": "Esri inschakelen",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Maak verbinding met je Esri-account en importeer gegevens van ArcGIS Online rechtstreeks in je kaartprojecten.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Voeg je Esri API-sleutel toe om het importeren van je kaartlagen uit ArcGIS Online in de kaarttabbladen in projecten mogelijk te maken.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API-sleutel",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Laag tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Deze tekst wordt weergegeven als een tooltip wanneer je met de muis over de onderdelen in de laag op de kaart gaat",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Lagen",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We ondersteunen momenteel GeoJSON-bestanden. Lees het {supportArticle} voor tips over het converteren en stijlen van kaartlagen.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standaard lengtegraad",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Middelpunt en zoom-niveau van de kaart",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Het standaard middelpunt en zoom-niveau van de kaart. Pas de waarden hieronder handmatig aan, of klik op de {button} knop in de linkerbovenhoek van de kaart om het huidige middelpunt en zoom-niveau van de kaart op te slaan als de standaardwaarden.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Laag verwijderen",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Opslaan",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support-artikel",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/nl/articles/7022129-input-en-feedback-verzamelen-lijst-en-kaartweergave",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Standaard zoom-niveau",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Stel in hoe de kaart standaard is ingezoomd. Kies een waarde tussen 0 en 20, waarbij 0 volledig uitgezoomd is (de hele wereld is zichtbaar) en 20 volledig ingezoomd is (blokken en gebouwen zijn zichtbaar)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Alle gebruikersgegevens anonimiseren",

From d95653ff0a88aec9d5b5344cbf7a9ffe889b3f77 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:31:51 +0100
Subject: [PATCH 263/282] New translations en.json (Norwegian)

---
 front/app/translations/admin/nb-NO.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index 7b3624893ef8..2c8da0b75e96 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Antall reaksjoner:",
   "app.components.admin.PostManager.PostPreview.save": "Lagre",
   "app.components.admin.PostManager.PostPreview.submitError": "Feil",
+  "app.components.admin.PostManager.addFeatureLayer": "Legg til funksjonslag",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Kopier URL-en til funksjonslaget som er vert på ArcGIS Online og lim den inn i inndataene nedenfor:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Legg til et nytt funksjonslag på kartet",
+  "app.components.admin.PostManager.addWebMap": "Legg til nettkart",
+  "app.components.admin.PostManager.addWebMapInstruction": "Kopier portal-ID-en til nettkartet ditt fra ArcGIS Online og lim det inn i inndataene nedenfor:",
   "app.components.admin.PostManager.allPhases": "Alle faser",
   "app.components.admin.PostManager.allProjects": "Alle prosjekter",
   "app.components.admin.PostManager.allStatuses": "Alle statuser",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "Tildelt til {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Tildelt til meg",
   "app.components.admin.PostManager.assignee": "Anvist til",
+  "app.components.admin.PostManager.authenticationError": "Det oppstod en autentiseringsfeil under forsøk på å hente dette laget. Vennligst sjekk URL-en og at din Esri API-nøkkel har tilgang til dette laget.",
   "app.components.admin.PostManager.automatic": "(automatisk)",
   "app.components.admin.PostManager.bodyTitle": "Beskrivelse",
+  "app.components.admin.PostManager.cancel2": "Avbryt",
   "app.components.admin.PostManager.changeStatusModalTitle": "Endre status for dette forslaget",
   "app.components.admin.PostManager.comments": "Kommentarer",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Dette betyr at du vil miste all data knyttet til disse initiativene, som kommentarer og stemmer. Denne handlingen kan ikke angres.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Midtre breddegrad",
   "app.components.admin.PostManager.currentLng": "Midtre lengdegrad",
   "app.components.admin.PostManager.currentZoomLevel": "Zoomnivå",
+  "app.components.admin.PostManager.defaultEsriError": "Det oppstod en feil under forsøk på å hente dette laget. Kontroller nettverkstilkoblingen din og at URL-en er riktig.",
   "app.components.admin.PostManager.delete": "Slett",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Slett {count} valgte forslag",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Slett {count} innlegg",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Rediger statuser",
   "app.components.admin.PostManager.editTags": "Rediger tagger",
   "app.components.admin.PostManager.editedPostSave": "Lagre",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Import av data fra Esri ArcGIS Online er en tilleggsfunksjon. Snakk med GS-sjefen din for å låse den opp.",
+  "app.components.admin.PostManager.esriSideError": "Det oppsto en feil i ArcGIS-applikasjonen. Vent noen minutter og prøv igjen senere.",
+  "app.components.admin.PostManager.esriWebMap": "Esri nettkart",
   "app.components.admin.PostManager.exportAllInputs": "Eksporter alle innlegg (.xlsx)",
   "app.components.admin.PostManager.exportIdeasComments": "Eksporter alle kommentarer (.xlsx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Eksporter kommentarer for dette prosjektet (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Eksporter valgte innlegg (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Eksporter kommentarer for valgte innlegg (.xslx)",
   "app.components.admin.PostManager.exports": "Eksporter",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Du kan bare laste opp kartdata som enten GeoJSON-lag eller import fra ArcGIS Online. Vennligst fjern eventuelle gjeldende GeoJSON-lag hvis du ønsker å legge til et funksjonslag.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Du finner funksjonslags-URLen på høyre side av varesiden på ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Velg hvordan andre vil se navnet ditt",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Forklar denne statusendringen",
   "app.components.admin.PostManager.fileUploadError": "Én eller flere filer kunne ikke lastes opp. Kontroller filstørrelsen og formatet og prøv igjen.",
   "app.components.admin.PostManager.formTitle": "Rediger idé",
+  "app.components.admin.PostManager.generalApiError2": "Det oppsto en feil under forsøk på å hente dette elementet. Kontroller at URL-en eller portal-ID-en er riktig og at du har tilgang til dette elementet.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Du kan bare laste opp kartdata som enten GeoJSON-lag eller import fra ArcGIS Online. Vennligst fjern eventuelle ArcGIS-data hvis du ønsker å laste opp et GeoJSON-lag.",
   "app.components.admin.PostManager.goToDefaultMapView": "Gå til standardsenteret for kart",
   "app.components.admin.PostManager.hiddenFieldsLink": "skjulte felt",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Tipp: tilføy {hiddenFieldsLink} når du setter opp din Typeform spørreundersøkelse for å holde oversikt over hvem som har svart på din spørreundersøkelse.",
+  "app.components.admin.PostManager.import2": "Import",
   "app.components.admin.PostManager.importError": "Den valgte filen kan ikke importeres fordi det ikke er en gyldig GeoJSON-fil",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Importer Esri-funksjonslag",
+  "app.components.admin.PostManager.importEsriWebMap": "Importer Esri Web Map",
   "app.components.admin.PostManager.imported": "Importert",
   "app.components.admin.PostManager.initiatives": "forslag",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "proposal_comments",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Vis bare innlegg som trenger tilbakemelding",
   "app.components.admin.PostManager.issueFormTitle": "Rediger problem",
   "app.components.admin.PostManager.latestFeedbackMode": "Bruk den nyeste tilgjengelige offisielle oppdateringen som forklaring",
+  "app.components.admin.PostManager.layerAdded": "Laget ble lagt til",
   "app.components.admin.PostManager.likes": "Liker",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Hvis du flytter dette innspillet fra det gjeldende prosjektet går informasjon om tilordnede faser tapt. Vil du fortsette?",
+  "app.components.admin.PostManager.mapData": "Kartdata",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} forslag",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} innlegg",
   "app.components.admin.PostManager.newFeedbackMode": "Skriv en ny oppdatering for å forklare denne endringen",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Legg til tagger i en oppføring ved å dra og slippe.",
   "app.components.admin.PostManager.view": "Utsikt",
   "app.components.admin.PostManager.votes": "Stemmer",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Du kan bare legge til ett nettkart om gangen. Fjern den gjeldende for å importere en annen.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Du kan bare laste opp kartdata som enten GeoJSON-lag eller import fra ArcGIS Online. Vennligst fjern eventuelle gjeldende GeoJSON-lag hvis du ønsker å koble til et nettkart.",
+  "app.components.admin.PostManager.webMapTooltip": "Du finner webkartportal-ID-en på ArcGIS Online-varesiden din, på høyre side.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mindre enn en dag} one {En dag} other {# dager}} venstre",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "fra",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "gruppe",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "Esri-integrasjonen er en tilleggsfunksjon. Kontakt din GovSuccess Manager hvis du ønsker mer informasjon om dette.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-integrasjon",
   "app.containers.Admin.tools.esriIntegrationButton": "Aktiver Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Koble til Esri-kontoen din og importer data fra ArcGIS Online direkte til kartprosjektene dine.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Legg til Esri API-nøkkelen for å tillate import av kartlagene fra ArcGIS Online i kartfanene i prosjekter.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API-nøkkel",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Verktøytips for lag",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Denne teksten vises som et verktøytips når markøren holdes over lagfunksjonene på kartet",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Kartlag",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Vi støtter for øyeblikket GeoJSON-filer. Les {supportArticle} for tips til hvordan du konverterer og stilsetter kartlag.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standard lengdegrad",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Standardsenter og zoomnivå for kart",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Standard senterpunkt og zoomnivå for kartet. Du kan manuelt justere verdiene nedenfor, eller klikke på knappen {button} øverst til høyre i kartet for å lagre det gjeldende senterpunktet og zoomnivået i kartet som standardverdier.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Fjern lag",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Lagre",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "støtteartikkel",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Kartets zoomnivå",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Standard zoomnivå for kartet. Godtar en verdi mellom 1 og 17, der 1 er helt utzoomet (hele verden er synlig) og 17 er helt innzoomet (kvartaler og bygninger er synlige)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymiser alle brukerdata",

From 6957a9f25cec49db00e47e247d4cc48176908eb7 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:31:55 +0100
Subject: [PATCH 264/282] New translations en.json (Polish)

---
 front/app/translations/admin/pl-PL.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index 74d0c47f9135..079c2c898d82 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Liczy się reakcja:",
   "app.components.admin.PostManager.PostPreview.save": "Zapisz",
   "app.components.admin.PostManager.PostPreview.submitError": "Błąd",
+  "app.components.admin.PostManager.addFeatureLayer": "Dodaj warstwę funkcji",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Skopiuj adres URL warstwy funkcji hostowanej w ArcGIS Online i wklej go w polu poniżej:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Dodaj nową warstwę funkcji do mapy",
+  "app.components.admin.PostManager.addWebMap": "Dodaj mapę internetową",
+  "app.components.admin.PostManager.addWebMapInstruction": "Skopiuj identyfikator portalu swojej mapy internetowej z ArcGIS Online i wklej go w polu poniżej:",
   "app.components.admin.PostManager.allPhases": "Wszystkie etapy",
   "app.components.admin.PostManager.allProjects": "Wszystkie projekty",
   "app.components.admin.PostManager.allStatuses": "Wszystkie statusy",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Przydzielony do mnie",
   "app.components.admin.PostManager.assignee": "Moderator",
+  "app.components.admin.PostManager.authenticationError": "Wystąpił błąd uwierzytelniania podczas próby pobrania tej warstwy. Sprawdź adres URL i czy Twój klucz API Esri ma dostęp do tej warstwy.",
   "app.components.admin.PostManager.automatic": "(automatycznie)",
   "app.components.admin.PostManager.bodyTitle": "Opis",
+  "app.components.admin.PostManager.cancel2": "Anuluj",
   "app.components.admin.PostManager.changeStatusModalTitle": "Zmień status tej propozycji",
   "app.components.admin.PostManager.comments": "Komentarze",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Oznacza to, że utracisz wszystkie dane powiązane z tymi inicjatywami, takie jak komentarze i głosy. Tego działania nie można cofnąć.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Aktualna szerokość geograficzna",
   "app.components.admin.PostManager.currentLng": "Aktualna długość geograficzna",
   "app.components.admin.PostManager.currentZoomLevel": "Aktualny poziom powiększenia",
+  "app.components.admin.PostManager.defaultEsriError": "Wystąpił błąd podczas próby pobrania tej warstwy. Sprawdź połączenie sieciowe i poprawność adresu URL.",
   "app.components.admin.PostManager.delete": "Usuń",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Usuń wybrane propozycje {count}",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Usuń {count} inicjatywy",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Edytuj statusy",
   "app.components.admin.PostManager.editTags": "Edytuj tagi",
   "app.components.admin.PostManager.editedPostSave": "Zapisz",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Importowanie danych z Esri ArcGIS Online jest funkcją dodatkową. Porozmawiaj z menedżerem GS, aby ją odblokować.",
+  "app.components.admin.PostManager.esriSideError": "Wystąpił błąd w aplikacji ArcGIS. Poczekaj kilka minut i spróbuj ponownie później.",
+  "app.components.admin.PostManager.esriWebMap": "Mapa internetowa Esri",
   "app.components.admin.PostManager.exportAllInputs": "Eksport wszystkich inicjatyw (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Eksport wszystkich komentarzy (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Eksport wszystkich komentarzy do tego projektu (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Eksport wybranych inicjatyw (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Eksport komentarzy dla wybranych inicjatyw (.xslx)",
   "app.components.admin.PostManager.exports": "Pobierz",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Możesz przesyłać dane map tylko jako warstwy GeoJSON lub importować je z ArcGIS Online. Usuń wszystkie bieżące warstwy GeoJSON, jeśli chcesz dodać warstwę funkcji.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Możesz znaleźć adres URL warstwy funkcji po prawej stronie strony elementu w ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Wybierz, jak wyświetlane będzie Twoje imię",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Wyjaśnij zmianę statusu",
   "app.components.admin.PostManager.fileUploadError": "Nie udało się załadować jednego lub więcej plików. Proszę sprawdzić rozmiar i format pliku i spróbować ponownie.",
   "app.components.admin.PostManager.formTitle": "Pomysł na edycję",
+  "app.components.admin.PostManager.generalApiError2": "Wystąpił błąd podczas próby pobrania tego elementu. Sprawdź, czy adres URL lub identyfikator portalu jest poprawny i czy masz dostęp do tego elementu.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Możesz przesyłać dane map tylko jako warstwy GeoJSON lub importować je z ArcGIS Online. Jeśli chcesz przesłać warstwę GeoJSON, usuń wszelkie dane ArcGIS.",
   "app.components.admin.PostManager.goToDefaultMapView": "Przejdź do domyślnego wyśrodkowania mapy i powiększenia",
   "app.components.admin.PostManager.hiddenFieldsLink": "ukryte pola",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Podpowiedź: dodaj {hiddenFieldsLink} podczas tworzenia ankiety, aby wiedzieć, kto na nią odpowiedział.",
+  "app.components.admin.PostManager.import2": "Import",
   "app.components.admin.PostManager.importError": "Wybrany plik nie mógł zostać zaimportowany, ponieważ nie jest to poprawny plik GeoJSON",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Importuj warstwę cech Esri",
+  "app.components.admin.PostManager.importEsriWebMap": "Importuj mapę internetową Esri",
   "app.components.admin.PostManager.imported": "Importowane",
   "app.components.admin.PostManager.initiatives": "propozycje",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "propozycje_komentarze",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Pokaż tylko te inicjatywy, które wymagają informacji zwrotnej",
   "app.components.admin.PostManager.issueFormTitle": "Edycja problemu",
   "app.components.admin.PostManager.latestFeedbackMode": "Użyj najnowszej oficjalnej aktualizacji",
+  "app.components.admin.PostManager.layerAdded": "Warstwa dodana pomyślnie",
   "app.components.admin.PostManager.likes": "Lubi",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Przeniesienie tego wkładu poza jego aktualny projekt spowoduje utratę informacji o przypisanych mu etapach. Czy chcesz kontynuować?",
+  "app.components.admin.PostManager.mapData": "Dane mapy",
   "app.components.admin.PostManager.multipleInitiatives": "Ilość propozycji: {initiativesCount}",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} inicjatyw",
   "app.components.admin.PostManager.newFeedbackMode": "Napisz nową aktualizację, aby wyjaśnić tę zmianę",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Dodaj tematy do wkładu za pomocą metody \"przeciągnij i upuść\".",
   "app.components.admin.PostManager.view": "Zobacz",
   "app.components.admin.PostManager.votes": "Głosy",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Jednocześnie możesz dodać tylko jedną mapę sieci Web. Usuń bieżącą mapę, aby zaimportować inną.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Możesz przesyłać dane mapy tylko jako warstwy GeoJSON lub importować je z ArcGIS Online. Jeśli chcesz podłączyć mapę internetową, usuń wszystkie bieżące warstwy GeoJSON.",
+  "app.components.admin.PostManager.webMapTooltip": "Możesz znaleźć identyfikator portalu Web Map na stronie elementu ArcGIS Online, po prawej stronie.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mniej niż jeden dzień} one {Jeden dzień} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "od",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "grupa",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "Integracja z Esri jest funkcją dodatkową. Skontaktuj się ze swoim GovSuccess Managerem, jeśli chcesz uzyskać więcej informacji na ten temat.",
   "app.containers.Admin.tools.esriIntegration2": "Integracja z Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Włącz Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Połącz swoje konto Esri i importuj dane z ArcGIS Online bezpośrednio do swoich projektów mapowania.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logo Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Dodaj swój klucz API Esri, aby umożliwić importowanie warstw map z ArcGIS Online w zakładkach map w projektach.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Klucz API Esri",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Etykieta warstwy",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Ten tekst jest wyświetlany jako podpowiedź podczas najechania kursorem na warstwy na mapie",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Warstwy",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Obecnie obsługujemy pliki GeoJSON. Przeczytaj {supportArticle}, aby dowiedzieć się, jak konwertować i stylizować warstwy mapy.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Domyślna długość geograficzna środka",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Domyślny środek mapy",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Domyślny punkt centralny i poziom powiększenia mapy. Ręcznie dostosuj poniższe wartości lub kliknij na przycisk {button} w prawym górnym rogu mapy, aby zapisać bieżący punkt centralny i poziom powiększenia mapy jako wartości domyślne.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Usuń warstwę",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Zapisz",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "artykuł pomocniczy",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Domyślny poziom powiększenia",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Ustaw, jak bardzo mapa jest domyślnie powiększona. Wybierz wartość pomiędzy 0 a 20, gdzie 0 oznacza całkowite pomniejszenie (cały świat jest widoczny), a 20 oznacza całkowite przybliżenie (bloki i budynki są widoczne)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizuj wszystkie dane użytkownika",

From 511d7a3aa6e4b67a71ba8132a19d5f0812c594ce Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:31:59 +0100
Subject: [PATCH 265/282] New translations en.json (Serbian (Cyrillic))

---
 front/app/translations/admin/sr-SP.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index cf3f127a2edf..f5deef498276 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Реакција се рачуна:",
   "app.components.admin.PostManager.PostPreview.save": "сачувати",
   "app.components.admin.PostManager.PostPreview.submitError": "Грешка",
+  "app.components.admin.PostManager.addFeatureLayer": "Add feature layer",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Copy the URL of the feature layer hosted on ArcGIS Online and paste it in the input below:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Add a new feature layer to the map",
+  "app.components.admin.PostManager.addWebMap": "Add Web Map",
+  "app.components.admin.PostManager.addWebMapInstruction": "Copy the portal ID of your Web Map from ArcGIS Online and paste it in the input below:",
   "app.components.admin.PostManager.allPhases": "Све фазе",
   "app.components.admin.PostManager.allProjects": "Сви пројекти",
   "app.components.admin.PostManager.allStatuses": "Сви статуси",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "Додељено на {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Додељено мени",
   "app.components.admin.PostManager.assignee": "Асигнее",
+  "app.components.admin.PostManager.authenticationError": "An authentication error occured while trying to fetch this layer. Please check the URL and that your Esri API key has access to this layer.",
   "app.components.admin.PostManager.automatic": "(аутоматски)",
   "app.components.admin.PostManager.bodyTitle": "Опис",
+  "app.components.admin.PostManager.cancel2": "Cancel",
   "app.components.admin.PostManager.changeStatusModalTitle": "Промените статус овог предлога",
   "app.components.admin.PostManager.comments": "Коментари",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "То значи да ћете изгубити све податке повезане са овим иницијативама, попут коментара и гласова. Ова радња се не може опозвати.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Централна ширина",
   "app.components.admin.PostManager.currentLng": "Централна географска дужина",
   "app.components.admin.PostManager.currentZoomLevel": "Ниво зумирања",
+  "app.components.admin.PostManager.defaultEsriError": "An error occured while trying to fetch this layer. Please check your network connect and that the URL is correct.",
   "app.components.admin.PostManager.delete": "Избриши",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Избришите {count} изабраних предлога",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Обриши {count} постова",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Уредите статусе",
   "app.components.admin.PostManager.editTags": "Уредите Тема",
   "app.components.admin.PostManager.editedPostSave": "сачувати",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Importing data from Esri ArcGIS Online is an add-on feature. Talk to your GS manager to unlock it.",
+  "app.components.admin.PostManager.esriSideError": "An error occured on the ArcGIS application. Please wait a few minutes and try again later.",
+  "app.components.admin.PostManager.esriWebMap": "Esri Web Map",
   "app.components.admin.PostManager.exportAllInputs": "Извези све постове (.кслк)",
   "app.components.admin.PostManager.exportIdeasComments": "Извези све коментаре (.кслк)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Извези коментаре за овај пројекат (.кслк)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Извези изабране постове (.кслк)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Извези коментаре за изабране постове (.кслк)",
   "app.components.admin.PostManager.exports": "Извоз",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to add a Feature Layer.",
+  "app.components.admin.PostManager.featureLayerTooltop": "You can find the Feature Layer URL on the right hand side of the item page on ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Одаберите како ће људи видети ваше име",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Објасните ову промену статуса",
   "app.components.admin.PostManager.fileUploadError": "Отпремање једне или више датотека није успело. Проверите величину и формат датотеке и покушајте поново.",
   "app.components.admin.PostManager.formTitle": "Уредите идеју",
+  "app.components.admin.PostManager.generalApiError2": "An error occured while trying to fetch this item. Please check that the URL or Portal ID is correct and you have access to this item.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any ArcGIS data if you wish to upload a GeoJSON layer.",
   "app.components.admin.PostManager.goToDefaultMapView": "Идите на подразумевани центар мапе",
   "app.components.admin.PostManager.hiddenFieldsLink": "скривена поља",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "хттпс://суппорт.цитизенлаб.цо/артицлес/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Савет: Ако користите Типеформ, додајте {hiddenFieldsLink} да бисте пратили ко је одговорио на вашу анкету.",
+  "app.components.admin.PostManager.import2": "Import",
   "app.components.admin.PostManager.importError": "Изабрана датотека није могла да се увезе јер није важећа ГеоЈСОН датотека",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Import Esri Feature Layer",
+  "app.components.admin.PostManager.importEsriWebMap": "Import Esri Web Map",
   "app.components.admin.PostManager.imported": "Увезено",
   "app.components.admin.PostManager.initiatives": "предлозима",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "предлог_коментара",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Прикажи само постове којима су потребне повратне информације",
   "app.components.admin.PostManager.issueFormTitle": "Уреди проблем",
   "app.components.admin.PostManager.latestFeedbackMode": "Користите најновије постојеће званично ажурирање као објашњење",
+  "app.components.admin.PostManager.layerAdded": "Layer added successfully",
   "app.components.admin.PostManager.likes": "Свиђа",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Померањем овог уноса даље од његовог тренутног пројекта изгубићете информације о додељеним фазама. Да ли желите да наставите?",
+  "app.components.admin.PostManager.mapData": "Map data",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} предлога",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} постова",
   "app.components.admin.PostManager.newFeedbackMode": "Напишите ново ажурирање да бисте објаснили ову промену",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Додајте ознаке улазу помоћу превлачења и отпуштања.",
   "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Гласови",
+  "app.components.admin.PostManager.webMapAlreadyExists": "You can only add one Web Map at a time. Remove the current one to import a different one.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to connect a Web Map.",
+  "app.components.admin.PostManager.webMapTooltip": "You can find the Web Map portal ID on your ArcGIS Online item page, on the right hand side.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Мање од једног дана} one {Једног дана} other {# дана}} лево",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "из",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "група",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "The Esri integration is an add-on feature. Contact your GovSuccess Manager if you want more information on this.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Enable Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Connect your Esri account and import data from ArcGIS Online directly into your mapping projects.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Add your Esri API key to allow importing your map layers from ArcGIS Online in the map tabs in projects.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API key",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Опис слоја",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Овај текст се приказује као алатка када пређете мишем преко карактеристика слоја на мапи",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Слојеви карте",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Тренутно подржавамо ГеоЈСОН датотеке. Прочитајте {supportArticle} за савете о томе како да конвертујете и стилизујете слојеве карте.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Подразумевана дужина",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Подразумевани центар мапе и зумирање",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Подразумевана централна тачка и ниво зумирања мапе. Ручно подесите вредности испод или кликните на дугме {button} у горњем десном углу карте да бисте сачували тренутну централну тачку и ниво зумирања мапе као подразумеване вредности.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Уклоните слој",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "сачувати",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "чланак подршке",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Ниво зумирања мапе",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Подразумевани ниво зумирања мапе. Прихвата вредност између 1 и 17, где је 1 потпуно умањен (цео свет је видљив), а 17 је потпуно увећан (блокови и зграде су видљиви)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Анонимизирајте све корисничке податке",

From 81dc82ced14caee554797dcc692426fd64992683 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:03 +0100
Subject: [PATCH 266/282] New translations en.json (Swedish)

---
 front/app/translations/admin/sv-SE.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 6c0149a5f8c1..d92c7b93083f 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Reaktionen räknas:",
   "app.components.admin.PostManager.PostPreview.save": "Spara",
   "app.components.admin.PostManager.PostPreview.submitError": "Fel",
+  "app.components.admin.PostManager.addFeatureLayer": "Lägg till funktionslager",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Kopiera URL:en till funktionslagret som finns på ArcGIS Online och klistra in den i inmatningen nedan:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Lägg till ett nytt funktionslager på kartan",
+  "app.components.admin.PostManager.addWebMap": "Lägg till webbkarta",
+  "app.components.admin.PostManager.addWebMapInstruction": "Kopiera portal-ID:t för din webbkarta från ArcGIS Online och klistra in det i inmatningen nedan:",
   "app.components.admin.PostManager.allPhases": "Alla faser",
   "app.components.admin.PostManager.allProjects": "Alla projekt",
   "app.components.admin.PostManager.allStatuses": "Alla statusar",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "Tilldelad till {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Tilldelad till mig",
   "app.components.admin.PostManager.assignee": "Tilldelad person",
+  "app.components.admin.PostManager.authenticationError": "Ett autentiseringsfel uppstod när du försökte hämta det här lagret. Kontrollera webbadressen och att din Esri API-nyckel har åtkomst till det här lagret.",
   "app.components.admin.PostManager.automatic": "(automatisk)",
   "app.components.admin.PostManager.bodyTitle": "Beskrivning",
+  "app.components.admin.PostManager.cancel2": "Avbryt",
   "app.components.admin.PostManager.changeStatusModalTitle": "Ändra det här förslagets status",
   "app.components.admin.PostManager.comments": "Kommentarer",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Det innebär att ni förlorar alla data som är kopplade till dessa initiativ, t.ex. kommentarer och röster. Denna åtgärd kan inte ångras.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Central latitud",
   "app.components.admin.PostManager.currentLng": "Central longitud",
   "app.components.admin.PostManager.currentZoomLevel": "Zoomnivå",
+  "app.components.admin.PostManager.defaultEsriError": "Ett fel uppstod när du försökte hämta detta lager. Kontrollera din nätverksanslutning och att URL:en är korrekt.",
   "app.components.admin.PostManager.delete": "Radera",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Ta bort {count} valda förslag",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Ta bort {count} inlägg",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Redigera statusar",
   "app.components.admin.PostManager.editTags": "Redigera taggar",
   "app.components.admin.PostManager.editedPostSave": "Spara",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Import av data från Esri ArcGIS Online är en tilläggsfunktion. Prata med din GS manager för att låsa upp den.",
+  "app.components.admin.PostManager.esriSideError": "Ett fel uppstod i ArcGIS-applikationen. Vänta några minuter och försök igen senare.",
+  "app.components.admin.PostManager.esriWebMap": "Esri webbkarta",
   "app.components.admin.PostManager.exportAllInputs": "Exportera alla inlägg (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Exportera alla kommentarer (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Exportera kommentarer för det här projektet (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Exportera valda inlägg (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Exportera kommentarer för valda inlägg (.xslx)",
   "app.components.admin.PostManager.exports": "Exporter",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Du får endast ladda upp kartdata som antingen GeoJSON-lager eller importera från ArcGIS Online. Ta bort alla nuvarande GeoJSON-lager om du vill lägga till ett funktionslager.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Du hittar URL-adressen för funktionslagret till höger på objektsidan i ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Välj hur andra personer ska se ditt namn",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Förklara den här statusändringen",
   "app.components.admin.PostManager.fileUploadError": "En eller flera filer kunde inte laddas upp. Kontrollera filstorlek och format och försök igen.",
   "app.components.admin.PostManager.formTitle": "Redigera idé",
+  "app.components.admin.PostManager.generalApiError2": "Ett fel uppstod när du försökte hämta det här objektet. Kontrollera att URL:en eller portal-ID:t är korrekt och att du har tillgång till objektet.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Du kan endast ladda upp kartdata som antingen GeoJSON-lager eller importera från ArcGIS Online. Ta bort all ArcGIS-data om du vill ladda upp ett GeoJSON-lager.",
   "app.components.admin.PostManager.goToDefaultMapView": "Gå till standardkartcentret",
   "app.components.admin.PostManager.hiddenFieldsLink": "dolda fält",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Tips! Om du använder Typeform lägger du till {hiddenFieldsLink} för att hålla reda på vilka som har svarat på din undersökning.",
+  "app.components.admin.PostManager.import2": "Import",
   "app.components.admin.PostManager.importError": "Det gick inte att importera den valda filen eftersom den inte är en giltig GeoJSON-fil",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Importera Esri-funktionslager",
+  "app.components.admin.PostManager.importEsriWebMap": "Importera Esri webbkarta",
   "app.components.admin.PostManager.imported": "Importerad",
   "app.components.admin.PostManager.initiatives": "förslag",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "proposal_comments",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Visa bara inlägg som behöver återkoppling",
   "app.components.admin.PostManager.issueFormTitle": "Redigera frågan",
   "app.components.admin.PostManager.latestFeedbackMode": "Använd den senaste befintliga officiella uppdateringen som en förklaring",
+  "app.components.admin.PostManager.layerAdded": "Lager har lagts till framgångsrikt",
   "app.components.admin.PostManager.likes": "Gillar",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Om du flyttar bort dessa indata från deras aktuella projekt förlorar du informationen om deras tilldelade faser. Vill du fortsätta?",
+  "app.components.admin.PostManager.mapData": "Kartdata",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} förslag",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} inlägg",
   "app.components.admin.PostManager.newFeedbackMode": "Skriv en ny uppdatering för att förklara den här förändringen",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Lägg till ämnen till indata genom att dra och släppa.",
   "app.components.admin.PostManager.view": "Utsikt",
   "app.components.admin.PostManager.votes": "Röster",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Du kan bara lägga till en webbkarta åt gången. Ta bort den aktuella kartan för att importera en annan.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Du får endast ladda upp kartdata som antingen GeoJSON-lager eller importera från ArcGIS Online. Ta bort alla aktuella GeoJSON-lager om du vill ansluta en webbkarta.",
+  "app.components.admin.PostManager.webMapTooltip": "Du hittar portal-ID:t för webbkartan på ArcGIS Online-objektsidan, på höger sida.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mindre än en dag} one {En dag} other {# dagar}} vänster",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "från",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "grupp",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "Integrationen med Esri är en tilläggsfunktion. Kontakta din GovSuccess Manager om du vill ha mer information om detta.",
   "app.containers.Admin.tools.esriIntegration2": "Integration med Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Aktivera Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Anslut ditt Esri-konto och importera data från ArcGIS Online direkt till dina mappningsprojekt.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-logotyp",
   "app.containers.Admin.tools.esriKeyInputDescription": "Lägg till din Esri API-nyckel för att kunna importera dina kartlager från ArcGIS Online i kartflikarna i projekt.",
   "app.containers.Admin.tools.esriKeyInputLabel": "API-nyckel för Esri",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Verktygstips för lager",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Den här texten visas som verktygstips när du håller muspekaren över lagerfunktionerna på kartan",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Kartlager",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Vi stödjer för närvarande GeoJSON-filer. Läs {supportArticle} om du vill få tips om hur du konverterar och formaterar kartlager.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standardlongitud",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Kartans standardmittpunkt och -zoomnivå",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Kartans standardmittpunkt och -zoomnivå. Justera värdena nedan manuellt eller klicka på knappen {button} i kartans övre högra hörn om du vill spara kartans aktuella mittpunkt och zoomnivå som standardvärden.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Ta bort lager",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Spara",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "supportartikel",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Kartans zoomnivå",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Kartans standardzoomnivå. Ett värde mellan 1 och 17 godkänns, där 1 är helt utzoomat (hela världen visas) och 17 är helt inzoomat (kvarter och byggnader visas)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymisera alla användardata",

From 62e8bd0fd1467d530adbf668a7efcc98f8a6baa4 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:07 +0100
Subject: [PATCH 267/282] New translations en.json (Turkish)

---
 front/app/translations/admin/tr-TR.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index bd34e5e74e41..ffc3d96c993a 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Tepki sayılır:",
   "app.components.admin.PostManager.PostPreview.save": "Kaydet",
   "app.components.admin.PostManager.PostPreview.submitError": "Hata",
+  "app.components.admin.PostManager.addFeatureLayer": "Özellik katmanı ekle",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "ArcGIS Online üzerinde barındırılan özellik katmanının URL'sini kopyalayın ve aşağıdaki girişe yapıştırın:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Haritaya yeni bir özellik katmanı ekleyin",
+  "app.components.admin.PostManager.addWebMap": "Web Haritası Ekle",
+  "app.components.admin.PostManager.addWebMapInstruction": "Web Haritanızın portal kimliğini ArcGIS Online'dan kopyalayın ve aşağıdaki girişe yapıştırın:",
   "app.components.admin.PostManager.allPhases": "Tüm aşamalar",
   "app.components.admin.PostManager.allProjects": "Tüm projeler",
   "app.components.admin.PostManager.allStatuses": "Tüm durumlar",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName} adlı kişiye atandı",
   "app.components.admin.PostManager.assignedToMe": "Bana atandı",
   "app.components.admin.PostManager.assignee": "Atanan",
+  "app.components.admin.PostManager.authenticationError": "Bu katmanı getirmeye çalışırken bir kimlik doğrulama hatası oluştu. Lütfen URL'yi ve Esri API anahtarınızın bu katmana erişimi olup olmadığını kontrol edin.",
   "app.components.admin.PostManager.automatic": "(otomatik)",
   "app.components.admin.PostManager.bodyTitle": "Açıklama",
+  "app.components.admin.PostManager.cancel2": "İptal",
   "app.components.admin.PostManager.changeStatusModalTitle": "Bu önerinin durumunu değiştirin",
   "app.components.admin.PostManager.comments": "Yorumlar",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Bu, yorumlar ve oylar gibi bu girişimlerle ilişkili tüm verileri kaybedeceğiniz anlamına gelir. Bu işlem geri alınamaz.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Enlemi ortala",
   "app.components.admin.PostManager.currentLng": "Boylamı ortala",
   "app.components.admin.PostManager.currentZoomLevel": "Yakınlaştırma düzeyi",
+  "app.components.admin.PostManager.defaultEsriError": "Bu katmanı getirmeye çalışırken bir hata oluştu. Lütfen ağ bağlantınızı ve URL'nin doğru olup olmadığını kontrol edin.",
   "app.components.admin.PostManager.delete": "Sil",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Seçilen {count} öneriyi sil",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "{count} yayını sil",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Durumları düzenleme",
   "app.components.admin.PostManager.editTags": "Etiketleri düzenle",
   "app.components.admin.PostManager.editedPostSave": "Kaydet",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Esri ArcGIS Online'dan veri içe aktarma bir eklenti özelliğidir. Kilidini açmak için GS yöneticinizle konuşun.",
+  "app.components.admin.PostManager.esriSideError": "ArcGIS uygulamasında bir hata oluştu. Lütfen birkaç dakika bekleyin ve daha sonra tekrar deneyin.",
+  "app.components.admin.PostManager.esriWebMap": "Esri Web Haritası",
   "app.components.admin.PostManager.exportAllInputs": "Tüm yayınları dışa aktar (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Tüm yorumları dışa aktar (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Bu proje ile ilgili yorumları dışa aktar (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Seçilen yayınları dışa aktar (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Seçilen yayınlarla ilgili yorumları dışa aktar (.xslx)",
   "app.components.admin.PostManager.exports": "Dışa Aktarılanlar",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Harita verilerini yalnızca GeoJSON katmanları olarak veya ArcGIS Online'dan içe aktararak yükleyebilirsiniz. Bir Özellik Katmanı eklemek istiyorsanız lütfen mevcut GeoJSON katmanlarını kaldırın.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Özellik Katmanı URL'sini ArcGIS Online'daki öğe sayfasının sağ tarafında bulabilirsiniz.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "İnsanların adınızı nasıl göreceğini seçin",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Bu durum değişikliğini açıklayın",
   "app.components.admin.PostManager.fileUploadError": "Bir veya daha fazla dosya yüklenemedi. Lütfen dosya boyutunu ve biçimini kontrol edin ve tekrar deneyin.",
   "app.components.admin.PostManager.formTitle": "Fikir düzenleme",
+  "app.components.admin.PostManager.generalApiError2": "Bu öğeyi getirmeye çalışırken bir hata oluştu. Lütfen URL'nin veya Portal Kimliğinin doğru olup olmadığını ve bu öğeye erişiminiz olup olmadığını kontrol edin.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Harita verilerini yalnızca GeoJSON katmanları olarak veya ArcGIS Online'dan içe aktararak yükleyebilirsiniz. Bir GeoJSON katmanı yüklemek istiyorsanız lütfen tüm ArcGIS verilerini kaldırın.",
   "app.components.admin.PostManager.goToDefaultMapView": "Varsayılan harita merkezine git",
   "app.components.admin.PostManager.hiddenFieldsLink": "gizli alanlar",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "İpucu: Typeform kullanıyorsanız, anketinize kimlerin yanıt verdiğinin kaydını tutmak için {hiddenFieldsLink} ekleyin.",
+  "app.components.admin.PostManager.import2": "İthalat",
   "app.components.admin.PostManager.importError": "Seçilen dosya geçerli bir GeoJSON dosyası olmadığı için içe aktarılamadı",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Esri Özellik Katmanını İçe Aktar",
+  "app.components.admin.PostManager.importEsriWebMap": "Esri Web Haritasını İçe Aktar",
   "app.components.admin.PostManager.imported": "İthal",
   "app.components.admin.PostManager.initiatives": "öneriler",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "proposal_comments",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Yalnızca geri bildirim gerektiren yayınları göster",
   "app.components.admin.PostManager.issueFormTitle": "Düzenleme sorunu",
   "app.components.admin.PostManager.latestFeedbackMode": "Açıklama olarak mevcut en son resmi bilgilendirmeyi kullan",
+  "app.components.admin.PostManager.layerAdded": "Katman başarıyla eklendi",
   "app.components.admin.PostManager.likes": "Beğeniler",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Bu girdiyi mevcut projesinden uzaklaştırmak, atanmış aşamaları hakkındaki bilgileri kaybedecektir. Devam etmek istiyor musunuz?",
+  "app.components.admin.PostManager.mapData": "Harita verileri",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} öneri",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} yayın",
   "app.components.admin.PostManager.newFeedbackMode": "Bu değişikliği açıklamak için yeni bir bilgilendirme yazın",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Sürükle ve bırak yöntemini kullanarak bir girdiye etiket ekleyin.",
   "app.components.admin.PostManager.view": "Görünüm",
   "app.components.admin.PostManager.votes": "Oylar",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Bir seferde yalnızca bir Web Haritası ekleyebilirsiniz. Farklı bir tane içe aktarmak için mevcut olanı kaldırın.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Harita verilerini yalnızca GeoJSON katmanları olarak veya ArcGIS Online'dan içe aktararak yükleyebilirsiniz. Bir Web Haritası bağlamak istiyorsanız lütfen mevcut GeoJSON katmanlarını kaldırın.",
+  "app.components.admin.PostManager.webMapTooltip": "Web Haritası portal kimliğini ArcGIS Online öğe sayfanızda, sağ tarafta bulabilirsiniz.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Bir günden az} one {Bir gün} other {# gün}} sol",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "kimden",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "grup",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "Esri entegrasyonu bir eklenti özelliğidir. Bu konuda daha fazla bilgi almak istiyorsanız GovSuccess Yöneticinizle iletişime geçin.",
   "app.containers.Admin.tools.esriIntegration2": "Esri entegrasyonu",
   "app.containers.Admin.tools.esriIntegrationButton": "Esri'yi Etkinleştir",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Esri hesabınızı bağlayın ve ArcGIS Online'dan verileri doğrudan haritalama projelerinize aktarın.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logosu",
   "app.containers.Admin.tools.esriKeyInputDescription": "Projelerdeki harita sekmelerinde ArcGIS Online'dan harita katmanlarınızı içe aktarmaya izin vermek için Esri API anahtarınızı ekleyin.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API anahtarı",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Katman araç ipucu",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Bu metin, harita üzerinde katman özelliklerinin üzerine gelindiğinde bir araç ipucu olarak görüntülenir",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Harita katmanları",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Şu anda GeoJSON dosyalarını destekliyoruz. Harita katmanlarının nasıl dönüştürüleceği ve şekillendirileceği hakkında ipuçları için {supportArticle} okuyun.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Varsayılan boylam",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Harita varsayılan merkezi ve yakınlaştırma düzeyi",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Haritanın varsayılan merkez noktası ve yakınlaştırma düzeyidir. Aşağıdaki değerleri manuel olarak ayarlayın veya haritanın mevcut merkez noktasını ve yakınlaştırma düzeyini varsayılan değerler olarak kaydetmek için haritanın sağ üst köşesindeki {button} düğmesine tıklayın.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Katmanı kaldırın",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Kaydet",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "destek makalesini",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Harita yakınlaştırma düzeyi",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Haritanın varsayılan yakınlaştırma düzeyidir. 1 ile 17 arasında bir değer kabul edilir; burada 1 tamamen uzaklaştırılmış (tüm dünya görünür) ve 17 tamamen yakınlaştırılmış (sokaklar ve binalar görünür) olur",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Tüm kullanıcı verilerini anonimleştirin",

From 66d5f60b618a79b050f72d8f50e32cfbf5bdc2d3 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:11 +0100
Subject: [PATCH 268/282] New translations en.json (Portuguese, Brazilian)

---
 front/app/translations/admin/pt-BR.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index 4a87dad80474..f019756de457 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Contagem de reações:",
   "app.components.admin.PostManager.PostPreview.save": "Salvar",
   "app.components.admin.PostManager.PostPreview.submitError": "Erro",
+  "app.components.admin.PostManager.addFeatureLayer": "Adicionar camada de recurso",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Copie o URL da camada de recurso hospedada no ArcGIS Online e cole-o na entrada abaixo:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Adicionar uma nova camada de recurso ao mapa",
+  "app.components.admin.PostManager.addWebMap": "Adicionar mapa da Web",
+  "app.components.admin.PostManager.addWebMapInstruction": "Copie o ID do portal do seu Web Map do ArcGIS Online e cole-o na entrada abaixo:",
   "app.components.admin.PostManager.allPhases": "Todas as frases",
   "app.components.admin.PostManager.allProjects": "Todos os projetos",
   "app.components.admin.PostManager.allStatuses": "Todos os status",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Atribuído a mim",
   "app.components.admin.PostManager.assignee": "Atribuído",
+  "app.components.admin.PostManager.authenticationError": "Ocorreu um erro de autenticação ao tentar obter esta camada. Verifique o URL e se sua chave de API da Esri tem acesso a essa camada.",
   "app.components.admin.PostManager.automatic": "(automático)",
   "app.components.admin.PostManager.bodyTitle": "Descrição",
+  "app.components.admin.PostManager.cancel2": "Cancelar",
   "app.components.admin.PostManager.changeStatusModalTitle": "Alterar o status desta proposta",
   "app.components.admin.PostManager.comments": "Comentários",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Isto significa que perderá todos os dados associados a estas iniciativas, como comentários e votos. Esta ação não pode ser anulada.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Latitude atual",
   "app.components.admin.PostManager.currentLng": "Longitude atual",
   "app.components.admin.PostManager.currentZoomLevel": "Nível de zoom atual",
+  "app.components.admin.PostManager.defaultEsriError": "Ocorreu um erro ao tentar obter essa camada. Verifique se você está conectado à rede e se o URL está correto.",
   "app.components.admin.PostManager.delete": "Deletar",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Excluir {count} propostas selecionadas",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Excluir {count} entradas",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Editar status",
   "app.components.admin.PostManager.editTags": "Editar tags",
   "app.components.admin.PostManager.editedPostSave": "Guardar",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "A importação de dados do Esri ArcGIS Online é um recurso complementar. Fale com seu gerente de GS para desbloqueá-lo.",
+  "app.components.admin.PostManager.esriSideError": "Ocorreu um erro no aplicativo ArcGIS. Aguarde alguns minutos e tente novamente mais tarde.",
+  "app.components.admin.PostManager.esriWebMap": "Mapa da Web da Esri",
   "app.components.admin.PostManager.exportAllInputs": "Baixar todas as entradas de informações (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Baixar todos os comentários (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Baixar todos os comentários do projeto (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Exportar entradas selecionadas (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Exportar comentários para entradas selecionadas (.xslx)",
   "app.components.admin.PostManager.exports": "Baixar",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Você só pode carregar dados de mapa como camadas GeoJSON ou importando do ArcGIS Online. Remova todas as camadas GeoJSON atuais se você quiser adicionar uma camada de recurso.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Você pode encontrar o URL do Feature Layer no lado direito da página do item no ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Escolha como as pessoas verão seu nome",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Explique essa mudança de status",
   "app.components.admin.PostManager.fileUploadError": "Um ou mais ficheiros não foram carregados. Por favor verifique o tamanho e formato do ficheiro e tente novamente.",
   "app.components.admin.PostManager.formTitle": "Editar ideia",
+  "app.components.admin.PostManager.generalApiError2": "Ocorreu um erro ao tentar buscar este item. Verifique se o URL ou o ID do portal está correto e se você tem acesso a esse item.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Você só pode carregar dados de mapa como camadas GeoJSON ou importando do ArcGIS Online. Remova todos os dados do ArcGIS se você quiser carregar uma camada GeoJSON.",
   "app.components.admin.PostManager.goToDefaultMapView": "Acesse o mapa central e zoom padrão",
   "app.components.admin.PostManager.hiddenFieldsLink": "campo oculto",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Dica: adicione {hiddenFieldsLink} ao configurar seu questionário para acompanhar quem respondeu a pesquisa.",
+  "app.components.admin.PostManager.import2": "Importação",
   "app.components.admin.PostManager.importError": "O arquivo selecionado não pôde ser importado porque não é um GeoJSON válido",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Importar camada de característica Esri",
+  "app.components.admin.PostManager.importEsriWebMap": "Importar o Esri Web Map",
   "app.components.admin.PostManager.imported": "Importado",
   "app.components.admin.PostManager.initiatives": "Propostas",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "comentários_proposta",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Mostrar apenas entradas que precisam de feedback",
   "app.components.admin.PostManager.issueFormTitle": "Editar edição",
   "app.components.admin.PostManager.latestFeedbackMode": "Use a atualização oficial mais recente",
+  "app.components.admin.PostManager.layerAdded": "Camada adicionada com sucesso",
   "app.components.admin.PostManager.likes": "Curtidas",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Afastar este input do seu projeto atual irá perder a informação sobre as suas fases atribuídas. Quer prosseguir?",
+  "app.components.admin.PostManager.mapData": "Dados do mapa",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} propostas",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} entradas",
   "app.components.admin.PostManager.newFeedbackMode": "Escreva uma nova atualização para explicar esta mudança",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Adicione tópicos a uma entrada usando arrastar e soltar.",
   "app.components.admin.PostManager.view": "Ver",
   "app.components.admin.PostManager.votes": "Votos",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Você só pode adicionar um Web Map de cada vez. Remova o atual para importar um diferente.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Você só pode carregar dados de mapa como camadas GeoJSON ou importando do ArcGIS Online. Remova todas as camadas GeoJSON atuais se você desejar conectar um Web Map.",
+  "app.components.admin.PostManager.webMapTooltip": "Você pode encontrar o ID do portal do Web Map na sua página de item do ArcGIS Online, no lado direito.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Menos de um dia} one {Um dia} other {# dias}} restantes",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "De",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "grupo",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "A integração com o Esri é um recurso complementar. Entre em contato com o seu gerente do GovSuccess se você quiser obter mais informações sobre isso.",
   "app.containers.Admin.tools.esriIntegration2": "Integração com o Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Habilitar Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Conecte sua conta Esri e importe dados do ArcGIS Online diretamente para seus projetos de mapeamento.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logotipo da Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Adicione sua chave Esri API para permitir a importação de suas camadas de mapa do ArcGIS Online nas guias de mapa em projetos.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Chave da API da Esri",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Dica de camada",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Este texto é exibido como uma dica de ferramenta ao passar o mouse sobre os recursos da camada no mapa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Camadas",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Atualmente suportamos arquivos GeoJSON. Leia o {supportArticle} para dicas sobre como converter e editar as camadas de mapas.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Longitude predefinida",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centro do mapa & zoom padrão",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "O ponto central e o nível de zoom do mapa padrão. Ajuste manualmente os valores abaixo, ou clique no botão {button} no canto superior direito do mapa para salvar o ponto central atual e o nível de zoom do mapa como os valores padrão.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remover camada",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Salvar",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "artigo de apoio",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nível de zoom predefinido",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Defina o padrão para o zoom do mapa. Escolha um valor entre 0 e 20, em que 0 é totalmente ampliado (o mundo inteiro é visível) e 20 é totalmente focado (blocos e edifícios são visíveis)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Tornar anônimos todos os dados de usuário",

From ada3110ded4058aa5630a2b2ad618d6e89b52f21 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:16 +0100
Subject: [PATCH 269/282] New translations en.json (Spanish, Chile)

---
 front/app/translations/admin/es-CL.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index 3bae32bf5597..a4491e1c26de 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Contador de reacciones:",
   "app.components.admin.PostManager.PostPreview.save": "Guardar",
   "app.components.admin.PostManager.PostPreview.submitError": "Error",
+  "app.components.admin.PostManager.addFeatureLayer": "Añadir capa de características",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Copia la URL de la capa de características alojada en ArcGIS Online y pégala en la siguiente entrada:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Añade una nueva capa de características al mapa",
+  "app.components.admin.PostManager.addWebMap": "Añadir Mapa Web",
+  "app.components.admin.PostManager.addWebMapInstruction": "Copia el ID del portal de tu Mapa Web de ArcGIS Online y pégalo en la entrada de abajo:",
   "app.components.admin.PostManager.allPhases": "Todas las fases",
   "app.components.admin.PostManager.allProjects": "Todos los proyectos",
   "app.components.admin.PostManager.allStatuses": "Todos los estatus",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Asignado a mí",
   "app.components.admin.PostManager.assignee": "Asignado",
+  "app.components.admin.PostManager.authenticationError": "Se ha producido un error de autenticación al intentar obtener esta capa. Comprueba la URL y que tu clave API de Esri tiene acceso a esta capa.",
   "app.components.admin.PostManager.automatic": "(automático)",
   "app.components.admin.PostManager.bodyTitle": "Descripción",
+  "app.components.admin.PostManager.cancel2": "Cancelar",
   "app.components.admin.PostManager.changeStatusModalTitle": "Cambiar el estado de esta propuesta",
   "app.components.admin.PostManager.comments": "Comentarios",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Esto significa que perderás todos los datos asociados a estas iniciativas, como comentarios y votos. Esta acción no puede deshacerse.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Latitud actual",
   "app.components.admin.PostManager.currentLng": "Longitud actual",
   "app.components.admin.PostManager.currentZoomLevel": "Nivel de zoom actual",
+  "app.components.admin.PostManager.defaultEsriError": "Se ha producido un error al intentar obtener esta capa. Comprueba tu conexión de red y que la URL es correcta.",
   "app.components.admin.PostManager.delete": "Eliminar",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Eliminar {count} propuestas seleccionadas",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Eliminar {count} aportes",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Editar estados",
   "app.components.admin.PostManager.editTags": "Editar etiquetas",
   "app.components.admin.PostManager.editedPostSave": "Guardar",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "La importación de datos de Esri ArcGIS Online es una función adicional. Habla con tu gestor de GS para desbloquearla.",
+  "app.components.admin.PostManager.esriSideError": "Se ha producido un error en la aplicación ArcGIS. Espera unos minutos y vuelve a intentarlo más tarde.",
+  "app.components.admin.PostManager.esriWebMap": "Mapa Web Esri",
   "app.components.admin.PostManager.exportAllInputs": "Exportar todos los aportes (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Exportar todos los comentarios (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Exportar todos los comentarios a este proyecto",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Exportar los aportes seleccionados (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Exportar los comentarios de los aportes seleccionados(.xslx)",
   "app.components.admin.PostManager.exports": "Exportar",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Sólo puedes cargar datos cartográficos como capas GeoJSON o importándolos de ArcGIS Online. Elimina cualquier capa GeoJSON actual si deseas añadir una capa de características.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Puedes encontrar la URL de la capa de características en la parte derecha de la página del elemento en ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Elige cómo la gente verá tu nombre",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Explica este cambio de estado",
   "app.components.admin.PostManager.fileUploadError": "No se han podido subir uno o varios archivos. Compruebe el tamaño y el formato del archivo e inténtelo de nuevo.",
   "app.components.admin.PostManager.formTitle": "Editar idea",
+  "app.components.admin.PostManager.generalApiError2": "Se ha producido un error al intentar obtener este elemento. Por favor, comprueba que la URL o el ID del Portal son correctos y que tienes acceso a este artículo.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Sólo puedes subir datos de mapas como capas GeoJSON o importándolos de ArcGIS Online. Elimina cualquier dato de ArcGIS si deseas cargar una capa GeoJSON.",
   "app.components.admin.PostManager.goToDefaultMapView": "Ir al centro del mapa por defecto y hacer zoom",
   "app.components.admin.PostManager.hiddenFieldsLink": "campos ocultos",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Sugerencia: añade {hiddenFieldsLink} al configurar tu encuesta Typeform para llevar un registro de quien la ha respondido.",
+  "app.components.admin.PostManager.import2": "Importar",
   "app.components.admin.PostManager.importError": "El archivo seleccionado no pudo ser importado porque no es un archivo GeoJSON válido",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Importar capa de características de Esri",
+  "app.components.admin.PostManager.importEsriWebMap": "Importar Mapa Web Esri",
   "app.components.admin.PostManager.imported": "Importado",
   "app.components.admin.PostManager.initiatives": "propuestas",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "comentarios_propuestas",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Mostrar solo aportes que necesiten comentarios",
   "app.components.admin.PostManager.issueFormTitle": "Editar problema",
   "app.components.admin.PostManager.latestFeedbackMode": "Utilice la actualización más reciente como explicación",
+  "app.components.admin.PostManager.layerAdded": "Capa añadida correctamente",
   "app.components.admin.PostManager.likes": "Me gusta",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Al mover este aporte fuera del proyecto actual se perderá la información sobre sus fases asignadas. ¿Deseas continuar?",
+  "app.components.admin.PostManager.mapData": "Datos del mapa",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} propuestas",
   "app.components.admin.PostManager.multipleInputs": "Publicaciones de {ideaCount}",
   "app.components.admin.PostManager.newFeedbackMode": "Escribir una nueva actualización para explicar este cambio",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Agrega temas/etiquetas a un aporte usando arrastrar y soltar.",
   "app.components.admin.PostManager.view": "Ver",
   "app.components.admin.PostManager.votes": "Votos",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Sólo puedes añadir un Mapa Web cada vez. Elimina el actual para importar uno diferente.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Sólo puedes cargar datos de mapas como capas GeoJSON o importándolos de ArcGIS Online. Elimina cualquier capa GeoJSON actual si deseas conectar un Mapa Web.",
+  "app.components.admin.PostManager.webMapTooltip": "Puedes encontrar el ID del portal Mapa Web en tu página de elementos de ArcGIS Online, a la derecha.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural,=0 {Queda menos de un día} one {Queda un día} other {Quedan # días}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "grupo",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "La integración con Esri es una función adicional. Ponte en contacto con tu Gestor de GovSuccess si deseas más información al respecto.",
   "app.containers.Admin.tools.esriIntegration2": "Integración con Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Activar Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Conecta tu cuenta Esri e importa datos de ArcGIS Online directamente a tus proyectos cartográficos.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logotipo de Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Añade tu clave API de Esri para poder importar tus capas de mapas desde ArcGIS Online en las pestañas de mapas de los proyectos.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Clave API de Esri",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Información sobre la capa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Este texto se muestra como información sobre la herramienta cuando se desliza sobre las características de la capa en el mapa",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Capas",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Actualmente soportamos archivos GeoJSON. Lea el {supportArticle} para obtener consejos sobre cómo convertir y ajustar el estilo de las capas del mapa.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Longitud por defecto",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centro del mapa y zoom por defecto",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "El punto central y el nivel de zoom por defecto del mapa. Ajuste manualmente los valores que aparecen a continuación, o haga clic en el botón {button} de la esquina superior derecha del mapa para guardar el punto central y el nivel de zoom actuales del mapa como valores predeterminados.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Eliminar la capa",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Guardar",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "artículo de soporte",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-viewhttps://support.citizenlab.co/es/articles/7025887-crear-un-proyecto-de-encuesta-externa",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nivel de zoom por defecto",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Establece el grado de ampliación del mapa por defecto. Elige un valor entre 0 y 20, donde 0 es un alejamiento total (todo el mundo es visible) y 20 es un acercamiento total (los bloques y edificios son visibles)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizar todos los datos del usuario",

From b3386ec672f49823091a9d0ed04bdedcb8ade662 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:20 +0100
Subject: [PATCH 270/282] New translations en.json (Croatian)

---
 front/app/translations/admin/hr-HR.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index ae8ede2c46ce..42e32d2e6790 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Reakcija se broji:",
   "app.components.admin.PostManager.PostPreview.save": "Spremi",
   "app.components.admin.PostManager.PostPreview.submitError": "Pogreška",
+  "app.components.admin.PostManager.addFeatureLayer": "Dodajte sloj značajki",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Kopirajte URL sloja značajki koji se nalazi na ArcGIS Online i zalijepite ga u unos ispod:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Dodajte novi sloj značajki na kartu",
+  "app.components.admin.PostManager.addWebMap": "Dodajte web kartu",
+  "app.components.admin.PostManager.addWebMapInstruction": "Kopirajte ID portala vaše web karte s ArcGIS Online i zalijepite ga u unos ispod:",
   "app.components.admin.PostManager.allPhases": "Sve faze",
   "app.components.admin.PostManager.allProjects": "Svi projekti",
   "app.components.admin.PostManager.allStatuses": "Svi statusi",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "Dodijeljeno korisniku {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Dodijeljeni meni",
   "app.components.admin.PostManager.assignee": "Opunomoćenik",
+  "app.components.admin.PostManager.authenticationError": "Došlo je do pogreške pri autentifikaciji prilikom pokušaja dohvaćanja ovog sloja. Provjerite URL i ima li vaš Esri API ključ pristup ovom sloju.",
   "app.components.admin.PostManager.automatic": "(automatski)",
   "app.components.admin.PostManager.bodyTitle": "Opis",
+  "app.components.admin.PostManager.cancel2": "Otkazati",
   "app.components.admin.PostManager.changeStatusModalTitle": "Promijenite status ovog prijedloga",
   "app.components.admin.PostManager.comments": "Komentari",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "To znači da ćete izgubiti sve podatke povezane s tim inicijativama, poput komentara i glasova. Ova se radnja ne može poništiti.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Središnja geografska širina",
   "app.components.admin.PostManager.currentLng": "Središnja geografska duljina",
   "app.components.admin.PostManager.currentZoomLevel": "Razina zumiranja",
+  "app.components.admin.PostManager.defaultEsriError": "Došlo je do pogreške prilikom pokušaja dohvaćanja ovog sloja. Provjerite svoju mrežnu vezu i je li URL točan.",
   "app.components.admin.PostManager.delete": "Izbriši",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Obriši {count} odabranih prijedloga",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Izbriši {count} objava",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Uredite statuse",
   "app.components.admin.PostManager.editTags": "Uredite oznake",
   "app.components.admin.PostManager.editedPostSave": "Uštedjeti",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Uvoz podataka iz Esri ArcGIS Online značajka je dodatka. Razgovarajte sa svojim GS upraviteljem da ga otključate.",
+  "app.components.admin.PostManager.esriSideError": "Došlo je do greške u aplikaciji ArcGIS. Pričekajte nekoliko minuta i pokušajte ponovno kasnije.",
+  "app.components.admin.PostManager.esriWebMap": "Esri web karta",
   "app.components.admin.PostManager.exportAllInputs": "Izvezi sve objave (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Izvezi sve komentare (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Izvezi komentare iz ovog projekta (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Izvezi odabrane objave (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Izvezi komentare iz odabranih objava (.xslx)",
   "app.components.admin.PostManager.exports": "Izvozi",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Kartografske podatke možete učitati samo kao GeoJSON slojeve ili kao uvoz iz ArcGIS Online. Uklonite sve trenutne GeoJSON slojeve ako želite dodati Feature Layer.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Možete pronaći URL sloja značajki na desnoj strani stranice stavke na ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Odaberite kako drugi vide vaše ime",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Objasnite promjenu ovog statusa",
   "app.components.admin.PostManager.fileUploadError": "Prijenos jedne ili više datoteka nije uspio. Provjerite veličinu i format datoteke i pokušajte ponovno.",
   "app.components.admin.PostManager.formTitle": "Uredi ideju",
+  "app.components.admin.PostManager.generalApiError2": "Došlo je do pogreške prilikom pokušaja dohvaćanja ove stavke. Provjerite je li URL ili ID portala točan i imate li pristup ovoj stavci.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Kartografske podatke možete učitati samo kao GeoJSON slojeve ili kao uvoz iz ArcGIS Online. Uklonite sve ArcGIS podatke ako želite prenijeti GeoJSON sloj.",
   "app.components.admin.PostManager.goToDefaultMapView": "Idite na zadano središte mape",
   "app.components.admin.PostManager.hiddenFieldsLink": "skrivena polja",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Savjet: ako koristite Typeform, dodajte {hiddenFieldsLink} kako biste mogli pratiti tko je odgovorio na upitnik.",
+  "app.components.admin.PostManager.import2": "Uvoz",
   "app.components.admin.PostManager.importError": "Odabrana datoteka nije mogla biti uvezena jer nije valjana GeoJSON datoteka",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Uvezi Eri Feature Layer",
+  "app.components.admin.PostManager.importEsriWebMap": "Uvezi Eri web kartu",
   "app.components.admin.PostManager.imported": "Uvozni",
   "app.components.admin.PostManager.initiatives": "prijedlozi",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "proposal_comments",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Prikaži samo objave za koje su potrebne povratne informacije",
   "app.components.admin.PostManager.issueFormTitle": "Uredi problem",
   "app.components.admin.PostManager.latestFeedbackMode": "Iskoristite posljednju službenu obavijest kao objašnjenje",
+  "app.components.admin.PostManager.layerAdded": "Sloj je uspješno dodan",
   "app.components.admin.PostManager.likes": "Sviđa mi se",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Premještanjem ovog unosa iz trenutnog projekta izgubit ćete informacije o dodijeljenim fazama. Želite li nastaviti?",
+  "app.components.admin.PostManager.mapData": "Podaci karte",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} prijedloga",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} objava",
   "app.components.admin.PostManager.newFeedbackMode": "Napišite obavijest kako biste objasnili ovu promjenu",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Povucite i ispustite kako biste dodali oznake ovom unosu.",
   "app.components.admin.PostManager.view": "Pogled",
   "app.components.admin.PostManager.votes": "Glasovi",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Možete dodati samo jednu web kartu odjednom. Uklonite trenutni da biste uvezli drugi.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Kartografske podatke možete učitati samo kao GeoJSON slojeve ili kao uvoz iz ArcGIS Online. Uklonite sve trenutne GeoJSON slojeve ako želite povezati web kartu.",
+  "app.components.admin.PostManager.webMapTooltip": "Možete pronaći ID portala Web karte na vašoj stranici ArcGIS Online stavke, s desne strane.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Manje od jednog dana} one {Jednog dana} other {# dana}} lijevo",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "od",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "grupa",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "Esri integracija je dodatna značajka. Kontaktirajte svog GovSuccess Managera ako želite više informacija o ovome.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integracija",
   "app.containers.Admin.tools.esriIntegrationButton": "Omogućite Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Povežite svoj Esri račun i uvezite podatke iz ArcGIS Online izravno u svoje projekte mapiranja.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Dodajte svoj Esri API ključ kako biste omogućili uvoz slojeva karte iz ArcGIS Online u kartice karte u projektima.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API ključ",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Opis sloja",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Ovaj tekst prikazuje se kao savjet pri prelasku kursorom preko značajke sloja na mapi",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Slojevi mape",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Trenutno podržavamo GeoJSON datoteke. Pročitajte {supportArticle} za savjete o tome kako da konvertirate i stilizirate slojeve mape.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Zadana geografska dužina",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Zadano središte mape i uvećanje",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Zadana središnja točka i razina zumiranja mape. Podesite donje vrijednosti ili kliknite na gumb {button} u gornjem desnom kutu mape kako biste sačuvali trenutnu središnju točku i razinu zumiranja mape kao zadane vrijednosti.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Ukloni sloj",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Spremi",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "članak podrške",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Razina uvećanja mape",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Zadana razina uvećanja karte. Prihvaća vrijednost između 1 i 17, pri čemu je 1 potpuno umanjena (vidljiv je cijeli svijet), a 17 je potpuno uvećana (vidljivi su blokovi i zgrade)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizirajte sve korisničke podatke",

From 32640297eb9e38eb4b92e03d4d90d2c6d084d411 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:23 +0100
Subject: [PATCH 271/282] New translations en.json (Latvian)

---
 front/app/translations/admin/lv-LV.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index 5e7cd224f15c..d79e829e07a8 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Reakciju skaits:",
   "app.components.admin.PostManager.PostPreview.save": "Saglabāt",
   "app.components.admin.PostManager.PostPreview.submitError": "Kļūda",
+  "app.components.admin.PostManager.addFeatureLayer": "Pievienot funkciju slāni",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Nokopējiet ArcGIS Online izvietotā elementu slāņa URL un ielīmējiet to tālāk norādītajā ievades laukā:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Jaunu elementu slāņa pievienošana kartei",
+  "app.components.admin.PostManager.addWebMap": "Pievienot tīmekļa karti",
+  "app.components.admin.PostManager.addWebMapInstruction": "Nokopējiet savas tīmekļa kartes portāla ID no ArcGIS Online un ielīmējiet to turpmāk norādītajā ievades laukā:",
   "app.components.admin.PostManager.allPhases": "Visi posmi",
   "app.components.admin.PostManager.allProjects": "Visi projekti",
   "app.components.admin.PostManager.allStatuses": "Visi statusi",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "Piešķirts {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Piešķirts man",
   "app.components.admin.PostManager.assignee": "Izpildītājs",
+  "app.components.admin.PostManager.authenticationError": "Mēģinot iegūt šo slāni, radās autentifikācijas kļūda. Lūdzu, pārbaudiet URL un vai jūsu Esri API atslēgai ir piekļuve šim slānim.",
   "app.components.admin.PostManager.automatic": "(automātisks)",
   "app.components.admin.PostManager.bodyTitle": "Apraksts",
+  "app.components.admin.PostManager.cancel2": "Atcelt",
   "app.components.admin.PostManager.changeStatusModalTitle": "Mainīt šī priekšlikuma statusu",
   "app.components.admin.PostManager.comments": "Komentāri",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Tas nozīmē, ka zaudēsiet visus ar šīm iniciatīvām saistītos datus, piemēram, komentārus un balsojumus. Šo darbību nevar atcelt.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Ģeogrāfiskā platuma viduspunkts",
   "app.components.admin.PostManager.currentLng": "Ģeogrāfiskā garuma viduspunkts",
   "app.components.admin.PostManager.currentZoomLevel": "Tālummaiņas līmenis",
+  "app.components.admin.PostManager.defaultEsriError": "Mēģinot iegūt šo slāni, radās kļūda. Lūdzu, pārbaudiet, vai ir izveidots tīkla savienojums un vai URL ir pareizs.",
   "app.components.admin.PostManager.delete": "Dzēst",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Dzēst {count} atlasītos priekšlikumus",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Dzēst {count} ziņas",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Rediģēt statusus",
   "app.components.admin.PostManager.editTags": "Rediģēt tagus",
   "app.components.admin.PostManager.editedPostSave": "Saglabāt",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Datu importēšana no Esri ArcGIS Online ir papildfunkcija. Lai to atbloķētu, sazinieties ar savu GS menedžeri.",
+  "app.components.admin.PostManager.esriSideError": "ArcGIS lietojumprogrammā ir notikusi kļūda. Lūdzu, pagaidiet dažas minūtes un mēģiniet vēlreiz vēlāk.",
+  "app.components.admin.PostManager.esriWebMap": "Esri tīmekļa karte",
   "app.components.admin.PostManager.exportAllInputs": "Eksportēt visas ziņas (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Eksportēt visus komentārus (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Eksportēt komentārus par šo projektu (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Eksportēt atlasītās ziņas (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Eksportēt komentārus par atlasītajām ziņām (.xslx)",
   "app.components.admin.PostManager.exports": "Eksports",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Kartes datus drīkst augšupielādēt tikai kā GeoJSON slāņus vai importēt no ArcGIS Online. Lūdzu, noņemiet visus pašreizējos GeoJSON slāņus, ja vēlaties pievienot funkciju slāni.",
+  "app.components.admin.PostManager.featureLayerTooltop": "ArcGIS Online elementa lapas labajā pusē var atrast elementa slāņa URL.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Izvēlieties, kā cilvēki redzēs jūsu vārdu",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Paskaidrojiet šo statusa maiņu",
   "app.components.admin.PostManager.fileUploadError": "Nav izdevies augšupielādēt vienu vai vairākus failus. Lūdzu, pārbaudiet faila izmēru un formātu un mēģiniet vēlreiz.",
   "app.components.admin.PostManager.formTitle": "Rediģēt ideju",
+  "app.components.admin.PostManager.generalApiError2": "Mēģinot iegūt šo vienumu, radās kļūda. Lūdzu, pārbaudiet, vai URL vai portāla ID ir pareizs un vai jums ir piekļuve šim vienumam.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Kartes datus drīkst augšupielādēt tikai kā GeoJSON slāņus vai importēt no ArcGIS Online. Ja vēlaties augšupielādēt GeoJSON slāni, lūdzu, noņemiet visus ArcGIS datus.",
   "app.components.admin.PostManager.goToDefaultMapView": "Dodieties uz noklusējuma kartes centru",
   "app.components.admin.PostManager.hiddenFieldsLink": "slēptie lauki",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Padoms: ja izmantojat Typeform, pievienojiet {hiddenFieldsLink}, lai redzētu, kas ir atbildējis jūsu apsekojumā.",
+  "app.components.admin.PostManager.import2": "Importēt",
   "app.components.admin.PostManager.importError": "Izvēlēto failu nav iespējams importēt, jo tas nav derīgs GeoJSON fails.",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Esri elementu slāņa importēšana",
+  "app.components.admin.PostManager.importEsriWebMap": "Esri tīmekļa kartes importēšana",
   "app.components.admin.PostManager.imported": "Importēts",
   "app.components.admin.PostManager.initiatives": "priekšlikumi",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "priekšlikuma_komentāri",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Rādīt tikai tos ierakstus, kuriem jāsniedz atgriezeniskā saite",
   "app.components.admin.PostManager.issueFormTitle": "Rediģēt jautājumu",
   "app.components.admin.PostManager.latestFeedbackMode": "Skaidrojumam izmantojiet jaunāko oficiālo atjauninājumu",
+  "app.components.admin.PostManager.layerAdded": "Veiksmīgi pievienots slānis",
   "app.components.admin.PostManager.likes": "Patīk",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Pārvietojot šo ievadi prom no tās pašreizējā projekta, tiks zaudēta informācija par tai piešķirtajām fāzēm. Vai vēlaties turpināt?",
+  "app.components.admin.PostManager.mapData": "Kartes dati",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} priekšlikumi",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} ieraksti",
   "app.components.admin.PostManager.newFeedbackMode": "Uzrakstiet jaunu atjauninājumu, paskaidrojot šīs izmaiņas",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Pievienojiet ievadei tagus, izmantojot funkciju vilkt un nomest.",
   "app.components.admin.PostManager.view": "Skatīt",
   "app.components.admin.PostManager.votes": "Balsis",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Vienlaikus var pievienot tikai vienu tīmekļa karti. Lai importētu citu karti, noņemiet pašreizējo.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Kartes datus drīkst augšupielādēt tikai kā GeoJSON slāņus vai importēt no ArcGIS Online. Lūdzu, noņemiet visus pašreizējos GeoJSON slāņus, ja vēlaties pievienot tīmekļa karti.",
+  "app.components.admin.PostManager.webMapTooltip": "Tīmekļa kartes portāla ID var atrast ArcGIS Online elementu lapā, labajā pusē.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Mazāk nekā diena} one {Viena diena} other {# dienas}} pa kreisi",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "no",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "grupa",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "Esri integrācija ir papildfunkcija. Sazinieties ar savu GovSuccess menedžeri, ja vēlaties saņemt vairāk informācijas par to.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integrācija",
   "app.containers.Admin.tools.esriIntegrationButton": "Iespējot Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Savienojiet savu Esri kontu un importējiet datus no ArcGIS Online tieši savos kartēšanas projektos.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logotips",
   "app.containers.Admin.tools.esriKeyInputDescription": "Pievienojiet savu Esri API atslēgu, lai varētu importēt kartes slāņus no ArcGIS Online projektu karšu cilnēs.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API atslēga",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Slāņa ekrāna padoms",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Šis teksts redzams kā ekrāna padoms, virzoties pāri slāņa elementiem kartē.",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Kartes slāņi",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Šobrīd mēs atbalstām GeoJSON failus. Lasiet {supportArticle}, lai uzzinātu, kā konvertēt un vizuāli pielāgot karšu slāņus.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Noklusējuma garums",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Kartes noklusējuma viduspunkts un tālummaiņa",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Kartes noklusējuma viduspunkta un tālummaiņas līmenis. Manuāli pielāgojiet tālāk norādītās vērtības vai noklikšķiniet uz pogas {poga} kartes augšējā labajā stūrī, lai saglabātu pašreizējo kartes viduspunktu un tālummaiņas līmeni kā noklusējuma vērtības.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Noņemt slāni",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Saglabāt",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "atbalsta raksts",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Kartes tālummaiņas līmenis",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Kartes noklusējuma tālummaiņas līmenis. Pieņem vērtību no 1 līdz 17, kur 1 ir pilnībā attālināta (redzama visa pasaule) un 17 ir pilnībā pietuvināta (redzami bloki un ēkas).",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonimizēt visus lietotāja datus",

From b70a431c49abe4bf781c798746b7a0c2e8b57590 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:26 +0100
Subject: [PATCH 272/282] New translations en.json (English, Canada)

---
 front/app/translations/admin/en-CA.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index f96a2b5124b0..2b276c0f1f7f 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Reaction counts:",
   "app.components.admin.PostManager.PostPreview.save": "Save",
   "app.components.admin.PostManager.PostPreview.submitError": "Error",
+  "app.components.admin.PostManager.addFeatureLayer": "Add feature layer",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Copy the URL of the feature layer hosted on ArcGIS Online and paste it in the input below:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Add a new feature layer to the map",
+  "app.components.admin.PostManager.addWebMap": "Add Web Map",
+  "app.components.admin.PostManager.addWebMapInstruction": "Copy the portal ID of your Web Map from ArcGIS Online and paste it in the input below:",
   "app.components.admin.PostManager.allPhases": "All phases",
   "app.components.admin.PostManager.allProjects": "All projects",
   "app.components.admin.PostManager.allStatuses": "All statuses",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "Assigned to {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Assigned to me",
   "app.components.admin.PostManager.assignee": "Assignee",
+  "app.components.admin.PostManager.authenticationError": "An authentication error occured while trying to fetch this layer. Please check the URL and that your Esri API key has access to this layer.",
   "app.components.admin.PostManager.automatic": "(automatic)",
   "app.components.admin.PostManager.bodyTitle": "Description",
+  "app.components.admin.PostManager.cancel2": "Cancel",
   "app.components.admin.PostManager.changeStatusModalTitle": "Change this proposal's status",
   "app.components.admin.PostManager.comments": "Comments",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "This means you will lose all data associated with these initiatives, like comments and votes. This action cannot be undone.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Center latitude",
   "app.components.admin.PostManager.currentLng": "Center longitude",
   "app.components.admin.PostManager.currentZoomLevel": "Zoom level",
+  "app.components.admin.PostManager.defaultEsriError": "An error occured while trying to fetch this layer. Please check your network connect and that the URL is correct.",
   "app.components.admin.PostManager.delete": "Delete",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Delete {count} selected proposals",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Delete {count} posts",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Edit statuses",
   "app.components.admin.PostManager.editTags": "Edit tags",
   "app.components.admin.PostManager.editedPostSave": "Save",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Importing data from Esri ArcGIS Online is an add-on feature. Talk to your GS manager to unlock it.",
+  "app.components.admin.PostManager.esriSideError": "An error occured on the ArcGIS application. Please wait a few minutes and try again later.",
+  "app.components.admin.PostManager.esriWebMap": "Esri Web Map",
   "app.components.admin.PostManager.exportAllInputs": "Export all posts (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Export all comments (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Export comments for this project (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Export selected posts (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Export comments for selected posts (.xslx)",
   "app.components.admin.PostManager.exports": "Exports",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to add a Feature Layer.",
+  "app.components.admin.PostManager.featureLayerTooltop": "You can find the Feature Layer URL on the right hand side of the item page on ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Choose how people will see your name",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Explain this status change",
   "app.components.admin.PostManager.fileUploadError": "One or more files failed to upload. Please check the file size and format and try again.",
   "app.components.admin.PostManager.formTitle": "Edit idea",
+  "app.components.admin.PostManager.generalApiError2": "An error occured while trying to fetch this item. Please check that the URL or Portal ID is correct and you have access to this item.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any ArcGIS data if you wish to upload a GeoJSON layer.",
   "app.components.admin.PostManager.goToDefaultMapView": "Go to default map center",
   "app.components.admin.PostManager.hiddenFieldsLink": "hidden fields",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Tip: If you're using Typeform, add {hiddenFieldsLink} to keep track of who has responded to your survey.",
+  "app.components.admin.PostManager.import2": "Import",
   "app.components.admin.PostManager.importError": "The selected file could not be imported because it's not a valid GeoJSON file",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Import Esri Feature Layer",
+  "app.components.admin.PostManager.importEsriWebMap": "Import Esri Web Map",
   "app.components.admin.PostManager.imported": "Imported",
   "app.components.admin.PostManager.initiatives": "proposals",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "proposal_comments",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Only show posts that need feedback",
   "app.components.admin.PostManager.issueFormTitle": "Edit issue",
   "app.components.admin.PostManager.latestFeedbackMode": "Use the latest existing official update as an explanation",
+  "app.components.admin.PostManager.layerAdded": "Layer added successfully",
   "app.components.admin.PostManager.likes": "Likes",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Moving this input away from its current project will lose the information about its assigned phases. Do you want to proceed?",
+  "app.components.admin.PostManager.mapData": "Map data",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} proposals",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} posts",
   "app.components.admin.PostManager.newFeedbackMode": "Write a new update to explain this change",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Add tags to an input using drag and drop.",
   "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Votes",
+  "app.components.admin.PostManager.webMapAlreadyExists": "You can only add one Web Map at a time. Remove the current one to import a different one.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to connect a Web Map.",
+  "app.components.admin.PostManager.webMapTooltip": "You can find the Web Map portal ID on your ArcGIS Online item page, on the right hand side.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Less than a day} one {One day} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "from",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "group",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "The Esri integration is an add-on feature. Contact your GovSuccess Manager if you want more information on this.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Enable Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Connect your Esri account and import data from ArcGIS Online directly into your mapping projects.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Add your Esri API key to allow importing your map layers from ArcGIS Online in the map tabs in projects.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API key",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "This text is displayed as a tooltip when hovering over the layer features on the map",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Map layers",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We currently support GeoJSON files and importing Feature Layers and Web Maps from ArcGIS Online. Read the {supportArticle} for tips on how to add, convert and style map layers.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Map default center and zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "The default center point and zoom level of the map. Manually adjust the values below, or click on the {button} button in the top right corner of the map to save the current center point and zoom level of the map as the default values.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remove layer",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support article",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Map zoom level",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "The default zoom level of the map. Accepts a value between 1 and 17, where 1 is fully zoomed out (the entire world is visible) and 17 is fully zoomed in (blocks and buildings are visible)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymize all user data",

From e19d06e0fccd743795e036a8a2c07ad8ab183942 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:29 +0100
Subject: [PATCH 273/282] New translations en.json (English, United Kingdom)

---
 front/app/translations/admin/en-GB.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index fb7534b94551..6825f5235593 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Reaction counts:",
   "app.components.admin.PostManager.PostPreview.save": "Save",
   "app.components.admin.PostManager.PostPreview.submitError": "Error",
+  "app.components.admin.PostManager.addFeatureLayer": "Add feature layer",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Copy the URL of the feature layer hosted on ArcGIS Online and paste it in the input below:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Add a new feature layer to the map",
+  "app.components.admin.PostManager.addWebMap": "Add Web Map",
+  "app.components.admin.PostManager.addWebMapInstruction": "Copy the portal ID of your Web Map from ArcGIS Online and paste it in the input below:",
   "app.components.admin.PostManager.allPhases": "All phases",
   "app.components.admin.PostManager.allProjects": "All projects",
   "app.components.admin.PostManager.allStatuses": "All statuses",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "Assigned to {assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Assigned to me",
   "app.components.admin.PostManager.assignee": "Assignee",
+  "app.components.admin.PostManager.authenticationError": "An authentication error occured while trying to fetch this layer. Please check the URL and that your Esri API key has access to this layer.",
   "app.components.admin.PostManager.automatic": "(automatic)",
   "app.components.admin.PostManager.bodyTitle": "Description",
+  "app.components.admin.PostManager.cancel2": "Cancel",
   "app.components.admin.PostManager.changeStatusModalTitle": "{tenantName, select, stirlingcouncil {Change this petition's status} other {Change this proposal's status}}",
   "app.components.admin.PostManager.comments": "Comments",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "This means you will lose all data associated with these initiatives, like comments and votes. This action cannot be undone.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Center latitude",
   "app.components.admin.PostManager.currentLng": "Center longitude",
   "app.components.admin.PostManager.currentZoomLevel": "Zoom level",
+  "app.components.admin.PostManager.defaultEsriError": "An error occured while trying to fetch this layer. Please check your network connect and that the URL is correct.",
   "app.components.admin.PostManager.delete": "Delete",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "{tenantName, select, stirlingcouncil {Delete {count} selected petitions} other {Delete {count} selected proposals}}",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Delete {count} posts",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Edit statuses",
   "app.components.admin.PostManager.editTags": "Edit tags",
   "app.components.admin.PostManager.editedPostSave": "Save",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Importing data from Esri ArcGIS Online is an add-on feature. Talk to your GS manager to unlock it.",
+  "app.components.admin.PostManager.esriSideError": "An error occured on the ArcGIS application. Please wait a few minutes and try again later.",
+  "app.components.admin.PostManager.esriWebMap": "Esri Web Map",
   "app.components.admin.PostManager.exportAllInputs": "Export all posts (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Export all comments (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Export comments for this project (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Export selected posts (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Export comments for selected posts (.xslx)",
   "app.components.admin.PostManager.exports": "Exports",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to add a Feature Layer.",
+  "app.components.admin.PostManager.featureLayerTooltop": "You can find the Feature Layer URL on the right hand side of the item page on ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Choose how people will see your name",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Explain this status change",
   "app.components.admin.PostManager.fileUploadError": "One or more files failed to upload. Please check the file size and format and try again.",
   "app.components.admin.PostManager.formTitle": "Edit idea",
+  "app.components.admin.PostManager.generalApiError2": "An error occured while trying to fetch this item. Please check that the URL or Portal ID is correct and you have access to this item.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any ArcGIS data if you wish to upload a GeoJSON layer.",
   "app.components.admin.PostManager.goToDefaultMapView": "Go to default map center",
   "app.components.admin.PostManager.hiddenFieldsLink": "hidden fields",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Tip: If you're using Typeform, add {hiddenFieldsLink} to keep track of who has responded to your survey.",
+  "app.components.admin.PostManager.import2": "Import",
   "app.components.admin.PostManager.importError": "The selected file could not be imported because it's not a valid GeoJSON file",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Import Esri Feature Layer",
+  "app.components.admin.PostManager.importEsriWebMap": "Import Esri Web Map",
   "app.components.admin.PostManager.imported": "Imported",
   "app.components.admin.PostManager.initiatives": "{tenantName, select, stirlingcouncil {petitions} other {proposals}}",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "proposal_comments",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Only show posts that need feedback",
   "app.components.admin.PostManager.issueFormTitle": "Edit issue",
   "app.components.admin.PostManager.latestFeedbackMode": "Use the latest existing official update as an explanation",
+  "app.components.admin.PostManager.layerAdded": "Layer added successfully",
   "app.components.admin.PostManager.likes": "Likes",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Moving this input away from its current project will lose the information about its assigned phases. Do you want to proceed?",
+  "app.components.admin.PostManager.mapData": "Map data",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} proposals",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} posts",
   "app.components.admin.PostManager.newFeedbackMode": "Write a new update to explain this change",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Add tags to an input using drag and drop.",
   "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Votes",
+  "app.components.admin.PostManager.webMapAlreadyExists": "You can only add one Web Map at a time. Remove the current one to import a different one.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to connect a Web Map.",
+  "app.components.admin.PostManager.webMapTooltip": "You can find the Web Map portal ID on your ArcGIS Online item page, on the right hand side.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Less than a day} one {One day} other {# days}} left",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "from",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "group",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "The Esri integration is an add-on feature. Contact your GovSuccess Manager if you want more information on this.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Enable Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Connect your Esri account and import data from ArcGIS Online directly into your mapping projects.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Add your Esri API key to allow importing your map layers from ArcGIS Online in the map tabs in projects.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API key",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Layer tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "This text is displayed as a tooltip when hovering over the layer features on the map",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Map layers",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We currently support GeoJSON files. Read the {supportArticle} for tips on how to convert and style map layers.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Default longitude",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Map default center and zoom",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "The default center point and zoom level of the map. Manually adjust the values below, or click on the {button} button in the top right corner of the map to save the current center point and zoom level of the map as the default values.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Remove layer",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Save",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support article",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Map zoom level",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "The default zoom level of the map. Accepts a value between 1 and 17, where 1 is fully zoomed out (the entire world is visible) and 17 is fully zoomed in (blocks and buildings are visible)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymize all user data",

From 15487fdb1c09ab6802958fae998f7a4e6a5bcb36 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:34 +0100
Subject: [PATCH 274/282] New translations en.json (Serbian (Latin))

---
 front/app/translations/admin/sr-Latn.json | 26 +++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index c54be0ff793e..5bfca538004a 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Реакција се рачуна:",
   "app.components.admin.PostManager.PostPreview.save": "Sačuvajte",
   "app.components.admin.PostManager.PostPreview.submitError": "Greška",
+  "app.components.admin.PostManager.addFeatureLayer": "Add feature layer",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Copy the URL of the feature layer hosted on ArcGIS Online and paste it in the input below:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Add a new feature layer to the map",
+  "app.components.admin.PostManager.addWebMap": "Add Web Map",
+  "app.components.admin.PostManager.addWebMapInstruction": "Copy the portal ID of your Web Map from ArcGIS Online and paste it in the input below:",
   "app.components.admin.PostManager.allPhases": "Sve faze",
   "app.components.admin.PostManager.allProjects": "Svi projekti",
   "app.components.admin.PostManager.allStatuses": "Svi statusi",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Dodeljeni meni",
   "app.components.admin.PostManager.assignee": "Zadužena osoba",
+  "app.components.admin.PostManager.authenticationError": "An authentication error occured while trying to fetch this layer. Please check the URL and that your Esri API key has access to this layer.",
   "app.components.admin.PostManager.automatic": "(automatski)",
   "app.components.admin.PostManager.bodyTitle": "Опис",
+  "app.components.admin.PostManager.cancel2": "Cancel",
   "app.components.admin.PostManager.changeStatusModalTitle": "Promenite status ovog predloga",
   "app.components.admin.PostManager.comments": "Komentari",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "This means you will lose all data associated with these initiatives, like comments and votes. This action cannot be undone.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Centralna širina",
   "app.components.admin.PostManager.currentLng": "Centralna dužina",
   "app.components.admin.PostManager.currentZoomLevel": "Nivo zumiranja",
+  "app.components.admin.PostManager.defaultEsriError": "An error occured while trying to fetch this layer. Please check your network connect and that the URL is correct.",
   "app.components.admin.PostManager.delete": "Izbriši",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Obriši {count} odabranih predloga",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Obriši {count} unosa",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Уредите статусе",
   "app.components.admin.PostManager.editTags": "Уредите ознаке",
   "app.components.admin.PostManager.editedPostSave": "сачувати",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Importing data from Esri ArcGIS Online is an add-on feature. Talk to your GS manager to unlock it.",
+  "app.components.admin.PostManager.esriSideError": "An error occured on the ArcGIS application. Please wait a few minutes and try again later.",
+  "app.components.admin.PostManager.esriWebMap": "Esri Web Map",
   "app.components.admin.PostManager.exportAllInputs": "Izvezite sve unose (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Izvezite sve komentare (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Izvezite sve komentare iz ovog projekta (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Izvezite odabrane unose (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Izvezite komentare iz odabranih unosa (.xslx)",
   "app.components.admin.PostManager.exports": "Izvodi",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to add a Feature Layer.",
+  "app.components.admin.PostManager.featureLayerTooltop": "You can find the Feature Layer URL on the right hand side of the item page on ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Odaberite kako će drugi videti vaše ime",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Objasnite promenu ovog statusa",
   "app.components.admin.PostManager.fileUploadError": "Отпремање једне или више датотека није успело. Проверите величину и формат датотеке и покушајте поново.",
   "app.components.admin.PostManager.formTitle": "Уредите идеју",
+  "app.components.admin.PostManager.generalApiError2": "An error occured while trying to fetch this item. Please check that the URL or Portal ID is correct and you have access to this item.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any ArcGIS data if you wish to upload a GeoJSON layer.",
   "app.components.admin.PostManager.goToDefaultMapView": "Idite na podrazumevani centar mape",
   "app.components.admin.PostManager.hiddenFieldsLink": "skrivena polja",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Savet: Dodajte {hiddenFieldsLink} prilikom podešavanja vaše Typeform ankete kako biste mogli da pratite ko je na nju odgovorio.",
+  "app.components.admin.PostManager.import2": "Import",
   "app.components.admin.PostManager.importError": "Odabrana datoteka nije mogla biti uvezena jer nije važeća GeoJSON datoteka",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Import Esri Feature Layer",
+  "app.components.admin.PostManager.importEsriWebMap": "Import Esri Web Map",
   "app.components.admin.PostManager.imported": "Imported",
   "app.components.admin.PostManager.initiatives": "Predlozi",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "proposal_comments",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Prikaži samo unose za koje su potrebne povratne informacije",
   "app.components.admin.PostManager.issueFormTitle": "Уреди проблем",
   "app.components.admin.PostManager.latestFeedbackMode": "Iskoristite poslednje zvanično obaveštenje",
+  "app.components.admin.PostManager.layerAdded": "Layer added successfully",
   "app.components.admin.PostManager.likes": "Likes",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Pomeranje unosa sa trenutnog projekta dovešće do gubitka informacija o dodeljenim fazama. Da li želite da nastavite?",
+  "app.components.admin.PostManager.mapData": "Map data",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} predloga",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} unosa",
   "app.components.admin.PostManager.newFeedbackMode": "Napišite obaveštenje kako biste objasnili ovu promenu",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Kliknite i prevucite kako biste dodali teme ovom unosu.",
   "app.components.admin.PostManager.view": "View",
   "app.components.admin.PostManager.votes": "Glasovi",
+  "app.components.admin.PostManager.webMapAlreadyExists": "You can only add one Web Map at a time. Remove the current one to import a different one.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "You may only upload map data as either GeoJSON layers or importing from ArcGIS Online. Please remove any current GeoJSON layers if you wish to connect a Web Map.",
+  "app.components.admin.PostManager.webMapTooltip": "You can find the Web Map portal ID on your ArcGIS Online item page, on the right hand side.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Мање од једног дана} one {Једног дана} other {# дана}} лево",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "od",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "grupa",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "The Esri integration is an add-on feature. Contact your GovSuccess Manager if you want more information on this.",
   "app.containers.Admin.tools.esriIntegration2": "Esri integration",
   "app.containers.Admin.tools.esriIntegrationButton": "Enable Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Connect your Esri account and import data from ArcGIS Online directly into your mapping projects.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Add your Esri API key to allow importing your map layers from ArcGIS Online in the map tabs in projects.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API key",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Opis sloja",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Ovaj tekst se prikazuje kao savet pri prelasku kursorom preko sloja na mapi",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Slojevi mape",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Trenutno podržavamo GeoJSON datoteke. Pročitajte {supportArticle} za savete o tome kako da konvertujete i stilizujete slojeve mape.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Podrazumevana geografska dužina",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Podrazumevani centar mape i zumiranje",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Podrazumevana centralna tačka i nivo zumiranja mape. Podesite donje vrednosti ili kliknite na dugme {button} u gornjem desnom uglu mape da biste sačuvali trenutnu centralnu tačku i nivo zumiranja mape kao podrazumevane vrednosti.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Uklonite sloj",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Sačuvajte",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "podrška (tekst)",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/en/articles/7022129-collecting-input-and-feedback-list-and-map-view",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Nivo zumiranja mape",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Podrazumevani nivo zumiranja karte. Prihvata vrednost između 1 i 17, pri čemu je 1 potpuno zumirana na gore (čitav svet je vidljiv), a 17 je potpuno zumirana ka tlu (vidljivi su blokovi i zgrade)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Анонимизирајте све корисничке податке",

From 86adadd3e5140c2535dc2d0b4298c25ed7e98a54 Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:45 +0100
Subject: [PATCH 275/282] New translations en.json (Dutch, Belgium)

---
 front/app/translations/admin/nl-BE.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index 6ac49dfe3888..9df7be7f9c3c 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Aantal reacties:",
   "app.components.admin.PostManager.PostPreview.save": "Opslaan",
   "app.components.admin.PostManager.PostPreview.submitError": "Fout",
+  "app.components.admin.PostManager.addFeatureLayer": "Functielaag toevoegen",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Kopieer de URL van de functielaag die gehost wordt op ArcGIS Online en plak deze in het onderstaande veld:",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Voeg een nieuwe functielaag toe aan de kaart",
+  "app.components.admin.PostManager.addWebMap": "Webkaart toevoegen",
+  "app.components.admin.PostManager.addWebMapInstruction": "Kopieer de portal ID van je webkaart uit ArcGIS Online en plak deze in het onderstaande veld:",
   "app.components.admin.PostManager.allPhases": "Alle fases",
   "app.components.admin.PostManager.allProjects": "Alle projecten",
   "app.components.admin.PostManager.allStatuses": "Alle statussen",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Toegewezen aan mij",
   "app.components.admin.PostManager.assignee": "Toegewezen aan",
+  "app.components.admin.PostManager.authenticationError": "Er is een authenticatiefout opgetreden tijdens het ophalen van deze laag. Controleer de URL en of je Esri API-sleutel toegang heeft tot deze laag.",
   "app.components.admin.PostManager.automatic": "(automatisch)",
   "app.components.admin.PostManager.bodyTitle": "Beschrijving",
+  "app.components.admin.PostManager.cancel2": "Annuleer",
   "app.components.admin.PostManager.changeStatusModalTitle": "Wijzig de status van dit voorstel",
   "app.components.admin.PostManager.comments": "Reacties",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Dit betekent dat je alle gegevens verliest die bij deze voorstellen horen, zoals reacties en stemmen. Deze actie kan niet ongedaan worden gemaakt.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Huidige breedtegraad",
   "app.components.admin.PostManager.currentLng": "Huidige lengtegraad",
   "app.components.admin.PostManager.currentZoomLevel": "Huidig zoomniveau",
+  "app.components.admin.PostManager.defaultEsriError": "Er is een fout opgetreden tijdens het ophalen van deze laag. Controleer je netwerkverbinding en of de URL correct is.",
   "app.components.admin.PostManager.delete": "Verwijder",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Verwijder {count} geselecteerde voorstellen",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Verwijder {count} bijdragen",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Bewerk statussen",
   "app.components.admin.PostManager.editTags": "Bewerk tags",
   "app.components.admin.PostManager.editedPostSave": "Bewaar",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "Het importeren van gegevens uit Esri ArcGIS Online is een add-on functionaliteit. Neem contact op met je Government Success manager om deze functionaliteit te ontgrendelen.",
+  "app.components.admin.PostManager.esriSideError": "Er is een fout opgetreden in de ArcGIS-toepassing. Wacht een paar minuten en probeer het later nog eens.",
+  "app.components.admin.PostManager.esriWebMap": "Esri-webkaart",
   "app.components.admin.PostManager.exportAllInputs": "Alle bijdragen exporteren (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Alle reacties exporteren (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Alle reacties van dit project exporteren (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Geselecteerde bijdragen selecteren (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Opmerkingen voor geselecteerde bijdragen exporteren (.xslx)",
   "app.components.admin.PostManager.exports": "Exporteren",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Je mag alleen kaartgegevens uploaden als GeoJSON laag of als je importeert vanuit ArcGIS Online. Verwijder alle huidige GeoJSON lagen als je een functielaag wilt toevoegen.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Je vindt de URL van de functielaag aan de rechterkant van de itempagina op ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Kies welke naam getoond wordt",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Verklaar deze statuswijziging",
   "app.components.admin.PostManager.fileUploadError": "Een of meer bestanden zijn niet geüpload. Controleer de bestandsgrootte en het formaat en probeer het opnieuw.",
   "app.components.admin.PostManager.formTitle": "Idee bewerken",
+  "app.components.admin.PostManager.generalApiError2": "Er is een fout opgetreden tijdens het ophalen van dit item. Controleer of de URL of Portal ID correct is en of je toegang hebt tot dit item.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Je mag alleen kaartgegevens uploaden als GeoJSON laag of als je importeert vanuit ArcGIS Online. Verwijder alle ArcGIS gegevens als je een GeoJSON laag wilt uploaden.",
   "app.components.admin.PostManager.goToDefaultMapView": "Ga naar het standaard middelpunt en zoom-niveau",
   "app.components.admin.PostManager.hiddenFieldsLink": "verborgen veld",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Tip: voeg {hiddenFieldsLink} toe bij het instellen van je TypeForm-enquête om bij te houden wie er deelnam.",
+  "app.components.admin.PostManager.import2": "Importeren",
   "app.components.admin.PostManager.importError": "Het geselecteerde bestand kon niet worden geïmporteerd omdat het geen geldig GeoJSON-bestand is",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Importeer Esri-functielaag",
+  "app.components.admin.PostManager.importEsriWebMap": "Importeer Esri-webkaart",
   "app.components.admin.PostManager.imported": "Geïmporteerd",
   "app.components.admin.PostManager.initiatives": "voorstellen",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "reacties_op_voorstellen",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Toon alleen bijdragen die feedback nodig hebben",
   "app.components.admin.PostManager.issueFormTitle": "Stelling bewerken",
   "app.components.admin.PostManager.latestFeedbackMode": "Gebruik de laatste officiële update",
+  "app.components.admin.PostManager.layerAdded": "Laag succesvol toegevoegd",
   "app.components.admin.PostManager.likes": "Likes",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Als u deze inputs verwijdert van het huidige project, gaat de informatie over de toegewezen fasen verloren. Wilt u doorgaan?",
+  "app.components.admin.PostManager.mapData": "Kaartgegevens",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} voorstellen",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} bijdragen",
   "app.components.admin.PostManager.newFeedbackMode": "Schrijf een nieuwe update om deze wijziging te verklaren",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Voeg tags toe aan een bijdrage door ze naar daar te verslepen.",
   "app.components.admin.PostManager.view": "Bekijk",
   "app.components.admin.PostManager.votes": "Stemmen",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Je kunt maar één webkaart per keer toevoegen. Verwijder de huidige om een andere te importeren.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Je mag alleen kaartgegevens uploaden als GeoJSON laag of als je importeert vanuit ArcGIS Online. Verwijder alle huidige GeoJSON lagen als je een webkaart wilt koppelen.",
+  "app.components.admin.PostManager.webMapTooltip": "Je kunt de portal-ID van de webkaart vinden op de itempagina van ArcGIS Online, aan de rechterkant.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Minder dan een dag} one {Een dag} other {# dagen}} over",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "van",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "groep",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "De Esri-integratie is een add-on functie. Neem contact op met je Government Success Manager als je hier meer informatie over wilt.",
   "app.containers.Admin.tools.esriIntegration2": "Esri-integratie",
   "app.containers.Admin.tools.esriIntegrationButton": "Esri inschakelen",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Maak verbinding met je Esri-account en importeer gegevens van ArcGIS Online rechtstreeks in je kaartprojecten.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Esri-logo",
   "app.containers.Admin.tools.esriKeyInputDescription": "Voeg je Esri API-sleutel toe om het importeren van je kaartlagen uit ArcGIS Online in de kaarttabbladen in projecten mogelijk te maken.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Esri API-sleutel",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Laag tooltip",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Deze tekst wordt weergegeven als een tooltip wanneer je met de muis over de onderdelen in de laag op de kaart gaat",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Lagen",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "We ondersteunen momenteel GeoJSON-bestanden. Lees het {supportArticle} voor tips over het converteren en stijlen van kaartlagen.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Standaard lengtegraad",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Middelpunt en zoom-niveau van de kaart",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "Het standaard middelpunt en zoom-niveau van de kaart. Pas de waarden hieronder handmatig aan, of klik op de {button} knop in de linkerbovenhoek van de kaart om het huidige middelpunt en zoom-niveau van de kaart op te slaan als de standaardwaarden.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Laag verwijderen",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Opslaan",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "support-artikel",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/nl/articles/7022129-input-en-feedback-verzamelen-lijst-en-kaartweergave",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Standaard zoom-niveau",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Stel in hoe de kaart standaard is ingezoomd. Kies een waarde tussen 0 en 20, waarbij 0 volledig uitgezoomd is (de hele wereld is zichtbaar) en 20 volledig ingezoomd is (blokken en gebouwen zijn zichtbaar)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Alle gebruikersgegevens anonimiseren",

From f9abc96cd5eef4ce2d14d74e1c6c632e2a2b9afe Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:32:48 +0100
Subject: [PATCH 276/282] New translations en.json (French, Belgium)

---
 front/app/translations/admin/fr-BE.json | 26 +++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index f8077b147bf2..c7c221225ead 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "Compte des réactions :",
   "app.components.admin.PostManager.PostPreview.save": "Enregistrer",
   "app.components.admin.PostManager.PostPreview.submitError": "Erreur",
+  "app.components.admin.PostManager.addFeatureLayer": "Ajouter une couche d'entités",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "Copiez l'URL de la couche d'entités hébergée sur ArcGIS Online et collez-la dans le champ ci-dessous :",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "Ajoutez une nouvelle couche d'entités à la carte",
+  "app.components.admin.PostManager.addWebMap": "Ajouter une Web Map",
+  "app.components.admin.PostManager.addWebMapInstruction": "Copiez l'ID de portail de votre Web Map depuis ArcGIS Online et collez-le dans le champ ci-dessous :",
   "app.components.admin.PostManager.allPhases": "Toutes les phases",
   "app.components.admin.PostManager.allProjects": "Tous les projets",
   "app.components.admin.PostManager.allStatuses": "Tous les statuts",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "{assigneeName}",
   "app.components.admin.PostManager.assignedToMe": "Attribué à moi",
   "app.components.admin.PostManager.assignee": "Responsable",
+  "app.components.admin.PostManager.authenticationError": "Une erreur d'authentification s'est produite lors de la récupération de cette couche. Veuillez vérifier l'URL et assurez-vous que votre clé API Esri a accès à cette couche.",
   "app.components.admin.PostManager.automatic": "(automatique)",
   "app.components.admin.PostManager.bodyTitle": "Description",
+  "app.components.admin.PostManager.cancel2": "Annuler",
   "app.components.admin.PostManager.changeStatusModalTitle": "Modifier le statut de cette proposition",
   "app.components.admin.PostManager.comments": "Commentaires",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "Cela signifie que vous perdrez toutes les données associées à ces propositions, comme les commentaires et les votes. Cette action ne peut pas être annulée.",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "Latitude par défaut",
   "app.components.admin.PostManager.currentLng": "Longitude par défaut",
   "app.components.admin.PostManager.currentZoomLevel": "Niveau de zoom actuel",
+  "app.components.admin.PostManager.defaultEsriError": "Une erreur s'est produite lors de la récupération de cette couche. Veuillez vérifier l'URL ainsi que votre connexion réseau.",
   "app.components.admin.PostManager.delete": "Supprimer",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "Supprimer {count} proposition(s) sélectionnée(s)",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "Supprimer {count} contributions",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "Modifier les statuts",
   "app.components.admin.PostManager.editTags": "Modifier les étiquettes",
   "app.components.admin.PostManager.editedPostSave": "Enregistrer",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "L'import de données depuis Esri ArcGIS Online fait partie d'une extension. Adressez-vous à votre GovSuccess Manager pour l'activer.",
+  "app.components.admin.PostManager.esriSideError": "Une erreur s'est produite avec l'application ArcGIS. Veuillez réessayer dans quelques minutes.",
+  "app.components.admin.PostManager.esriWebMap": "Web Map Esri",
   "app.components.admin.PostManager.exportAllInputs": "Exportez toutes les contributions (.xslx)",
   "app.components.admin.PostManager.exportIdeasComments": "Exporter tous les commentaires (.xslx)",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "Exporter tous les commentaires pour ce project (.xslx)",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "Exportez les contributions sélectionnées (.xslx)",
   "app.components.admin.PostManager.exportSelectedInputsComments": "Exportez les commentaires pour les contributions sélectionnées (.xslx)",
   "app.components.admin.PostManager.exports": "Exportations",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "Pour l'import des données cartographiques, vous devez choisir entre les couches GeoJSON ou l'import depuis ArcGIS Online. Veuillez supprimer toutes les couches GeoJSON existantes si vous souhaitez ajouter une couche d'entités depuis ArcGIS.",
+  "app.components.admin.PostManager.featureLayerTooltop": "Vous pouvez trouver l'URL de la couche d'entités sur la page d'élément correspondante sur ArcGIS Online.",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "Choisissez comment les autres voient votre nom",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "Expliquez ce changement de statut",
   "app.components.admin.PostManager.fileUploadError": "Un ou plusieurs fichiers n'ont pas pu être téléversés. Veuillez vérifier la taille et le format du fichier et réessayer.",
   "app.components.admin.PostManager.formTitle": "Modifier l'idée",
+  "app.components.admin.PostManager.generalApiError2": "Une erreur s'est produite lors de la récupération de cet élément. Veuillez vérifier que l'URL et l'ID de portail sont corrects et que vous avez accès à cet élément.",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "Pour l'import des données cartographiques, vous devez choisir entre les couches GeoJSON ou l'import depuis ArcGIS Online. Veuillez supprimer toutes les données ArcGIS existantes si vous souhaitez ajouter une couche GeoJSON.",
   "app.components.admin.PostManager.goToDefaultMapView": "Aller à la centralisation et au niveau de zoom par défaut",
   "app.components.admin.PostManager.hiddenFieldsLink": "champs cachés",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "https://support.citizenlab.co/articles/1641202",
   "app.components.admin.PostManager.hiddenFieldsTip": "Conseil : ajoutez un {hiddenFieldsLink} lors de la configuration de votre enquête Typeform pour savoir qui y a répondu.",
+  "app.components.admin.PostManager.import2": "Importer",
   "app.components.admin.PostManager.importError": "Le fichier sélectionné n'a pas pu être importé car il ne s'agit pas d'un fichier GeoJSON valide",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "Importer une couche d'entités Esri",
+  "app.components.admin.PostManager.importEsriWebMap": "Importer une Web Map Esri",
   "app.components.admin.PostManager.imported": "Importé",
   "app.components.admin.PostManager.initiatives": "propositions",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "propositions_commentaires",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "Afficher uniquement les contributions nécessitant un retour",
   "app.components.admin.PostManager.issueFormTitle": "Modifiez le problème",
   "app.components.admin.PostManager.latestFeedbackMode": "Utiliser la dernière mise à jour comme explication",
+  "app.components.admin.PostManager.layerAdded": "Couche ajoutée",
   "app.components.admin.PostManager.likes": "Pour",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "Si vous déplacez cette entrée hors de son projet actuel, vous perdrez les informations sur les phases qui lui ont été attribuées. Voulez-vous continuer ?",
+  "app.components.admin.PostManager.mapData": "Données cartographiques",
   "app.components.admin.PostManager.multipleInitiatives": "{initiativesCount} propositions",
   "app.components.admin.PostManager.multipleInputs": "{ideaCount} contributions",
   "app.components.admin.PostManager.newFeedbackMode": "Écrivez une nouvelle mise à jour pour expliquer ce changement",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "Ajoutez des étiquettes à une contribution en les glissant vers l'étiquette de votre choix.",
   "app.components.admin.PostManager.view": "Voir",
   "app.components.admin.PostManager.votes": "Votes",
+  "app.components.admin.PostManager.webMapAlreadyExists": "Vous ne pouvez utiliser qu'une seule Web Map à la fois. Veuillez supprimer la Web Map actuelle pour en importer une autre.",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "Pour l'import des données cartographiques, vous devez choisir entre les couches GeoJSON ou l'import depuis ArcGIS Online. Veuillez supprimer toutes les couches GeoJSON existantes si vous souhaitez importer une Web Map.",
+  "app.components.admin.PostManager.webMapTooltip": "Vous pouvez trouver l'ID de portail de votre Web Map sur la page d'élément correspondante sur ArcGIS Online.",
   "app.components.admin.PostManager.xDaysLeft": "{x, plural, =0 {Moins d'un jour restant} one {Un jour restant} other {# jours restants}}",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "de ",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "groupe",
@@ -928,6 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "L'intégration Esri est un add-on. Contactez votre responsable GovSuccess si vous souhaitez plus d'informations à ce sujet.",
   "app.containers.Admin.tools.esriIntegration2": "Intégration Esri",
   "app.containers.Admin.tools.esriIntegrationButton": "Activer Esri",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "Connectez votre compte Esri et importez vos couches cartographiques depuis ArcGIS Online directement dans vos projets.",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "Logo Esri",
   "app.containers.Admin.tools.esriKeyInputDescription": "Ajoutez votre clé API Esri pour permettre l'importation de vos couches cartographiques depuis ArcGIS Online depuis l'onglet \"Carte\" de vos projets.",
   "app.containers.Admin.tools.esriKeyInputLabel": "Clé API Esri",
@@ -1239,6 +1263,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltip": "Information de la couche",
   "app.containers.AdminPage.ProjectEdit.MapTab.layerTooltipTooltip": "Ce texte s'affiche comme bulle d'information lors du survol des éléments de la couche sur la carte",
   "app.containers.AdminPage.ProjectEdit.MapTab.layers": "Couches",
+  "app.containers.AdminPage.ProjectEdit.MapTab.layersTooltip": "Nous supportons actuellement les fichiers GeoJSON. Lisez cet {supportArticle} pour obtenir des conseils sur la manière de convertir et de paramétrer des couches cartographiques.",
   "app.containers.AdminPage.ProjectEdit.MapTab.lngLabel": "Longitude par défaut",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoom": "Centralisation et niveau de zoom par défaut de la carte",
   "app.containers.AdminPage.ProjectEdit.MapTab.mapCenterAndZoomTooltip": "La centralisation et le niveau de zoom par défaut de la carte. Ajustez manuellement les valeurs ci-dessous, ou cliquez sur le bouton {button} dans le coin supérieur gauche de la carte pour enregistrer la centralisation et le niveau de zoom actuels de la carte comme valeurs par défaut.",
@@ -1248,6 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "Supprimer la couche",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "Enregistrer",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "article de support",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "https://support.citizenlab.co/fr/articles/7022129-collecte-de-commentaires-et-de-reactions-liste-et-vue-cartographique",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "Niveau de zoom par défaut",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "Définissez le niveau de zoom de la carte par défaut. Choisissez une valeur entre 0 et 20, où 0 est entièrement dézoomé (le monde entier est visible) et 20 est entièrement zoomé (les blocs d'habitations et les bâtiments sont visibles)",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "Anonymiser toutes les données des utilisateurs",

From 001274bf12ce42a0db81b8eee33de9d2ab9057cc Mon Sep 17 00:00:00 2001
From: cl-dev-bot <88031410+cl-dev-bot@users.noreply.github.com>
Date: Mon, 11 Mar 2024 11:33:09 +0100
Subject: [PATCH 277/282] New translations en.json (Acholi)

---
 front/app/translations/admin/ach-UG.json | 27 ++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/front/app/translations/admin/ach-UG.json b/front/app/translations/admin/ach-UG.json
index c154ffa3e547..f73b37c1a0fb 100644
--- a/front/app/translations/admin/ach-UG.json
+++ b/front/app/translations/admin/ach-UG.json
@@ -97,6 +97,11 @@
   "app.components.admin.PostManager.PostPreview.reactionCounts": "crwdns777191:0crwdne777191:0",
   "app.components.admin.PostManager.PostPreview.save": "crwdns209184:0crwdne209184:0",
   "app.components.admin.PostManager.PostPreview.submitError": "crwdns209186:0crwdne209186:0",
+  "app.components.admin.PostManager.addFeatureLayer": "crwdns1919686:0crwdne1919686:0",
+  "app.components.admin.PostManager.addFeatureLayerInstruction": "crwdns1919688:0crwdne1919688:0",
+  "app.components.admin.PostManager.addFeatureLayerTooltip": "crwdns1919690:0crwdne1919690:0",
+  "app.components.admin.PostManager.addWebMap": "crwdns1919692:0crwdne1919692:0",
+  "app.components.admin.PostManager.addWebMapInstruction": "crwdns1919694:0crwdne1919694:0",
   "app.components.admin.PostManager.allPhases": "crwdns209190:0crwdne209190:0",
   "app.components.admin.PostManager.allProjects": "crwdns209192:0crwdne209192:0",
   "app.components.admin.PostManager.allStatuses": "crwdns209194:0crwdne209194:0",
@@ -105,8 +110,10 @@
   "app.components.admin.PostManager.assignedTo": "crwdns209200:0{assigneeName}crwdne209200:0",
   "app.components.admin.PostManager.assignedToMe": "crwdns209202:0crwdne209202:0",
   "app.components.admin.PostManager.assignee": "crwdns209204:0crwdne209204:0",
+  "app.components.admin.PostManager.authenticationError": "crwdns1919696:0crwdne1919696:0",
   "app.components.admin.PostManager.automatic": "crwdns209206:0crwdne209206:0",
   "app.components.admin.PostManager.bodyTitle": "crwdns353628:0crwdne353628:0",
+  "app.components.admin.PostManager.cancel2": "crwdns1919698:0crwdne1919698:0",
   "app.components.admin.PostManager.changeStatusModalTitle": "crwdns209208:0crwdne209208:0",
   "app.components.admin.PostManager.comments": "crwdns209210:0crwdne209210:0",
   "app.components.admin.PostManager.components.ActionBar.deleteInitiativesExplanation": "crwdns1091368:0crwdne1091368:0",
@@ -123,6 +130,7 @@
   "app.components.admin.PostManager.currentLat": "crwdns209212:0crwdne209212:0",
   "app.components.admin.PostManager.currentLng": "crwdns209214:0crwdne209214:0",
   "app.components.admin.PostManager.currentZoomLevel": "crwdns209216:0crwdne209216:0",
+  "app.components.admin.PostManager.defaultEsriError": "crwdns1919700:0crwdne1919700:0",
   "app.components.admin.PostManager.delete": "crwdns209218:0crwdne209218:0",
   "app.components.admin.PostManager.deleteAllSelectedInitiatives": "crwdns209220:0{count}crwdne209220:0",
   "app.components.admin.PostManager.deleteAllSelectedInputs": "crwdns209222:0{count}crwdne209222:0",
@@ -133,6 +141,9 @@
   "app.components.admin.PostManager.editStatuses": "crwdns667345:0crwdne667345:0",
   "app.components.admin.PostManager.editTags": "crwdns667347:0crwdne667347:0",
   "app.components.admin.PostManager.editedPostSave": "crwdns353632:0crwdne353632:0",
+  "app.components.admin.PostManager.esriAddOnFeatureTooltip": "crwdns1919702:0crwdne1919702:0",
+  "app.components.admin.PostManager.esriSideError": "crwdns1919704:0crwdne1919704:0",
+  "app.components.admin.PostManager.esriWebMap": "crwdns1919706:0crwdne1919706:0",
   "app.components.admin.PostManager.exportAllInputs": "crwdns209238:0crwdne209238:0",
   "app.components.admin.PostManager.exportIdeasComments": "crwdns209240:0crwdne209240:0",
   "app.components.admin.PostManager.exportIdeasCommentsProjects": "crwdns209242:0crwdne209242:0",
@@ -145,15 +156,22 @@
   "app.components.admin.PostManager.exportSelectedInputs": "crwdns209256:0crwdne209256:0",
   "app.components.admin.PostManager.exportSelectedInputsComments": "crwdns209258:0crwdne209258:0",
   "app.components.admin.PostManager.exports": "crwdns209260:0crwdne209260:0",
+  "app.components.admin.PostManager.featureLayerRemoveGeojsonTooltip": "crwdns1919708:0crwdne1919708:0",
+  "app.components.admin.PostManager.featureLayerTooltop": "crwdns1919710:0crwdne1919710:0",
   "app.components.admin.PostManager.feedbackAuthorPlaceholder": "crwdns209262:0crwdne209262:0",
   "app.components.admin.PostManager.feedbackBodyPlaceholder": "crwdns209264:0crwdne209264:0",
   "app.components.admin.PostManager.fileUploadError": "crwdns353634:0crwdne353634:0",
   "app.components.admin.PostManager.formTitle": "crwdns353636:0crwdne353636:0",
+  "app.components.admin.PostManager.generalApiError2": "crwdns1919712:0crwdne1919712:0",
+  "app.components.admin.PostManager.geojsonRemoveEsriTooltip2": "crwdns1919714:0crwdne1919714:0",
   "app.components.admin.PostManager.goToDefaultMapView": "crwdns209266:0crwdne209266:0",
   "app.components.admin.PostManager.hiddenFieldsLink": "crwdns209268:0crwdne209268:0",
   "app.components.admin.PostManager.hiddenFieldsSupportArticleUrl": "crwdns209270:0crwdne209270:0",
   "app.components.admin.PostManager.hiddenFieldsTip": "crwdns209272:0{hiddenFieldsLink}crwdne209272:0",
+  "app.components.admin.PostManager.import2": "crwdns1919716:0crwdne1919716:0",
   "app.components.admin.PostManager.importError": "crwdns209274:0crwdne209274:0",
+  "app.components.admin.PostManager.importEsriFeatureLayer": "crwdns1919718:0crwdne1919718:0",
+  "app.components.admin.PostManager.importEsriWebMap": "crwdns1919720:0crwdne1919720:0",
   "app.components.admin.PostManager.imported": "crwdns1159992:0crwdne1159992:0",
   "app.components.admin.PostManager.initiatives": "crwdns209276:0crwdne209276:0",
   "app.components.admin.PostManager.initiativesCommentsExportFileName": "crwdns209278:0crwdne209278:0",
@@ -165,8 +183,10 @@
   "app.components.admin.PostManager.inputsNeedFeedbackToggle": "crwdns209290:0crwdne209290:0",
   "app.components.admin.PostManager.issueFormTitle": "crwdns353638:0crwdne353638:0",
   "app.components.admin.PostManager.latestFeedbackMode": "crwdns209292:0crwdne209292:0",
+  "app.components.admin.PostManager.layerAdded": "crwdns1919722:0crwdne1919722:0",
   "app.components.admin.PostManager.likes": "crwdns777197:0crwdne777197:0",
   "app.components.admin.PostManager.loseIdeaPhaseInfoConfirmation": "crwdns209294:0crwdne209294:0",
+  "app.components.admin.PostManager.mapData": "crwdns1919724:0crwdne1919724:0",
   "app.components.admin.PostManager.multipleInitiatives": "crwdns209296:0{initiativesCount}crwdne209296:0",
   "app.components.admin.PostManager.multipleInputs": "crwdns209298:0{ideaCount}crwdne209298:0",
   "app.components.admin.PostManager.newFeedbackMode": "crwdns209300:0crwdne209300:0",
@@ -205,6 +225,9 @@
   "app.components.admin.PostManager.topicsTabTooltipText": "crwdns209352:0crwdne209352:0",
   "app.components.admin.PostManager.view": "crwdns1919532:0crwdne1919532:0",
   "app.components.admin.PostManager.votes": "crwdns209356:0crwdne209356:0",
+  "app.components.admin.PostManager.webMapAlreadyExists": "crwdns1919726:0crwdne1919726:0",
+  "app.components.admin.PostManager.webMapRemoveGeojsonTooltip": "crwdns1919728:0crwdne1919728:0",
+  "app.components.admin.PostManager.webMapTooltip": "crwdns1919730:0crwdne1919730:0",
   "app.components.admin.PostManager.xDaysLeft": "crwdns353652:0x={x}crwdne353652:0",
   "app.components.admin.ReportExportMenu.FileName.fromFilter": "crwdns209358:0crwdne209358:0",
   "app.components.admin.ReportExportMenu.FileName.groupFilter": "crwdns209360:0crwdne209360:0",
@@ -928,7 +951,7 @@
   "app.containers.Admin.tools.esriDisabled": "crwdns1582650:0crwdne1582650:0",
   "app.containers.Admin.tools.esriIntegration2": "crwdns1582652:0crwdne1582652:0",
   "app.containers.Admin.tools.esriIntegrationButton": "crwdns1582654:0crwdne1582654:0",
-  "app.containers.Admin.tools.esriIntegrationDescription2": "crwdns1582656:0crwdne1582656:0",
+  "app.containers.Admin.tools.esriIntegrationDescription3": "crwdns1919732:0crwdne1919732:0",
   "app.containers.Admin.tools.esriIntegrationImageAlt": "crwdns1582658:0crwdne1582658:0",
   "app.containers.Admin.tools.esriKeyInputDescription": "crwdns1582660:0crwdne1582660:0",
   "app.containers.Admin.tools.esriKeyInputLabel": "crwdns1582662:0crwdne1582662:0",
@@ -1250,7 +1273,7 @@
   "app.containers.AdminPage.ProjectEdit.MapTab.remove": "crwdns211004:0crwdne211004:0",
   "app.containers.AdminPage.ProjectEdit.MapTab.save": "crwdns211006:0crwdne211006:0",
   "app.containers.AdminPage.ProjectEdit.MapTab.supportArticle": "crwdns211008:0crwdne211008:0",
-  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl": "crwdns211010:0crwdne211010:0",
+  "app.containers.AdminPage.ProjectEdit.MapTab.supportArticleUrl2": "crwdns1919734:0crwdne1919734:0",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabel": "crwdns211012:0crwdne211012:0",
   "app.containers.AdminPage.ProjectEdit.MapTab.zoomLabelTooltip": "crwdns211014:0crwdne211014:0",
   "app.containers.AdminPage.ProjectEdit.NativeSurvey.userAnonymityLabelMain2": "crwdns604491:0crwdne604491:0",

From 1de946ce383366eb90d881df227d2002b927c887 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Mon, 11 Mar 2024 12:47:02 +0100
Subject: [PATCH 278/282] [TAN-1110] Allow updating report only if allowed to
 update phase

---
 .../report_builder/app/policies/report_builder/report_policy.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/back/engines/commercial/report_builder/app/policies/report_builder/report_policy.rb b/back/engines/commercial/report_builder/app/policies/report_builder/report_policy.rb
index 08bd27e5a903..6ec1a8271e92 100644
--- a/back/engines/commercial/report_builder/app/policies/report_builder/report_policy.rb
+++ b/back/engines/commercial/report_builder/app/policies/report_builder/report_policy.rb
@@ -64,7 +64,7 @@ def write?
         true
       elsif user.project_or_folder_moderator?
         if record.phase?
-          PhasePolicy.new(user, record.phase).show? && access_to_data?
+          PhasePolicy.new(user, record.phase).update? && access_to_data?
         else
           record.owner == user && access_to_data?
         end

From 98783fa40fbb23d7eae41c4387e02ec6f92c42c0 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Mon, 11 Mar 2024 14:25:00 +0100
Subject: [PATCH 279/282] [TAN-1250] Restructure left sidebar

---
 .../ReportBuilder/Toolbox/index.tsx           | 109 ++++++------------
 .../containers/Admin/reporting/messages.ts    |   8 --
 2 files changed, 33 insertions(+), 84 deletions(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
index 2c28ba25fb09..2c70101b9f27 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
@@ -2,10 +2,9 @@ import React from 'react';
 
 import {
   Box,
-  Title,
-  Accordion,
   Spinner,
   stylingConsts,
+  colors,
 } from '@citizenlab/cl2-component-library';
 import moment from 'moment';
 
@@ -17,13 +16,11 @@ import useAppConfigurationLocales from 'hooks/useAppConfigurationLocales';
 import { useReportContext } from 'containers/Admin/reporting/context/ReportContext';
 import { createMultiloc } from 'containers/Admin/reporting/utils/multiloc';
 
-import contentBuilderMessages from 'components/admin/ContentBuilder/messages';
 import Container from 'components/admin/ContentBuilder/Toolbox/Container';
 import DraggableElement from 'components/admin/ContentBuilder/Toolbox/DraggableElement';
 import WhiteSpace from 'components/admin/ContentBuilder/Widgets/WhiteSpace';
 
 import {
-  FormattedMessage,
   useIntl,
   useFormatMessageWithLocale,
   MessageDescriptor,
@@ -52,18 +49,10 @@ type ReportBuilderToolboxProps = {
   reportId: string;
 };
 
-const SectionTitle = ({ children }) => (
-  <Title
-    fontWeight="normal"
-    ml="10px"
-    variant="h6"
-    as="h3"
-    mb="8px"
-    mt="8px"
-    color="textSecondary"
-  >
+const Section = ({ children }) => (
+  <Box borderTop={`1px solid ${colors.divider}`} pt="12px" mb="12px">
     {children}
-  </Title>
+  </Box>
 );
 
 const ReportBuilderToolbox = ({ reportId }: ReportBuilderToolboxProps) => {
@@ -118,47 +107,7 @@ const ReportBuilderToolbox = ({ reportId }: ReportBuilderToolboxProps) => {
   return (
     <Container>
       <Box>
-        <Accordion
-          isOpenByDefault={true}
-          title={
-            <SectionTitle>
-              <FormattedMessage {...contentBuilderMessages.layout} />
-            </SectionTitle>
-          }
-        >
-          <DraggableElement
-            id="e2e-draggable-two-column"
-            component={<TwoColumn columnLayout="1-1" />}
-            icon="layout-2column-1"
-            label={formatMessage(WIDGET_TITLES.TwoColumn)}
-          />
-          <DraggableElement
-            id="e2e-draggable-white-space"
-            component={<WhiteSpace size="small" />}
-            icon="layout-white-space"
-            label={formatMessage(WIDGET_TITLES.WhiteSpace)}
-          />
-        </Accordion>
-
-        <Accordion
-          isOpenByDefault={true}
-          title={
-            <SectionTitle>
-              <FormattedMessage {...contentBuilderMessages.content} />
-            </SectionTitle>
-          }
-        >
-          <DraggableElement
-            id="e2e-draggable-about-report"
-            component={
-              <AboutReportWidget
-                reportId={reportId}
-                projectId={selectedProjectId}
-              />
-            }
-            icon="section-image-text"
-            label={formatMessage(WIDGET_TITLES.AboutReportWidget)}
-          />
+        <Section>
           <DraggableElement
             id="e2e-draggable-text"
             component={<TextMultiloc />}
@@ -171,16 +120,20 @@ const ReportBuilderToolbox = ({ reportId }: ReportBuilderToolboxProps) => {
             icon="image"
             label={formatMessage(WIDGET_TITLES.ImageMultiloc)}
           />
-        </Accordion>
-
-        <Accordion
-          isOpenByDefault={true}
-          title={
-            <SectionTitle>
-              <FormattedMessage {...reportBuilderMessages.resultsSection} />
-            </SectionTitle>
-          }
-        >
+          <DraggableElement
+            id="e2e-draggable-two-column"
+            component={<TwoColumn columnLayout="1-1" />}
+            icon="layout-2column-1"
+            label={formatMessage(WIDGET_TITLES.TwoColumn)}
+          />
+          <DraggableElement
+            id="e2e-draggable-white-space"
+            component={<WhiteSpace size="small" />}
+            icon="layout-white-space"
+            label={formatMessage(WIDGET_TITLES.WhiteSpace)}
+          />
+        </Section>
+        <Section>
           {
             // TODO: CL-2307 Only show this if there are surveys in the platform
             // TODO: Add in the default project / phase
@@ -221,16 +174,20 @@ const ReportBuilderToolbox = ({ reportId }: ReportBuilderToolboxProps) => {
             icon="idea"
             label={formatMessage(WIDGET_TITLES.SingleIdeaWidget)}
           />
-        </Accordion>
+        </Section>
 
-        <Accordion
-          isOpenByDefault={true}
-          title={
-            <SectionTitle>
-              <FormattedMessage {...reportBuilderMessages.chartsSection} />
-            </SectionTitle>
-          }
-        >
+        <Section>
+          <DraggableElement
+            id="e2e-draggable-about-report"
+            component={
+              <AboutReportWidget
+                reportId={reportId}
+                projectId={selectedProjectId}
+              />
+            }
+            icon="section-image-text"
+            label={formatMessage(WIDGET_TITLES.AboutReportWidget)}
+          />
           <DraggableElement
             id="e2e-draggable-visitors-timeline-widget"
             component={
@@ -335,7 +292,7 @@ const ReportBuilderToolbox = ({ reportId }: ReportBuilderToolboxProps) => {
             icon="chart-bar"
             label={formatMessage(WIDGET_TITLES.ReactionsByTimeWidget)}
           />
-        </Accordion>
+        </Section>
       </Box>
     </Container>
   );
diff --git a/front/app/containers/Admin/reporting/messages.ts b/front/app/containers/Admin/reporting/messages.ts
index 420733770ffa..85defe81450e 100644
--- a/front/app/containers/Admin/reporting/messages.ts
+++ b/front/app/containers/Admin/reporting/messages.ts
@@ -13,14 +13,6 @@ export default defineMessages({
     id: 'app.containers.Admin.reporting.helmetDescription',
     defaultMessage: 'Admin reporting page',
   },
-  chartsSection: {
-    id: 'app.containers.Admin.reporting.chartsSection',
-    defaultMessage: 'CHARTS',
-  },
-  resultsSection: {
-    id: 'app.containers.Admin.reporting.resultsSection',
-    defaultMessage: 'RESULTS',
-  },
   reportHeader: {
     id: 'app.containers.Admin.reporting.reportHeader',
     defaultMessage: 'Report header',

From 7fa6495cd2570e57b22ef5f2f76cbad262784727 Mon Sep 17 00:00:00 2001
From: CircleCI <hello@citizenlab.co>
Date: Mon, 11 Mar 2024 13:28:08 +0000
Subject: [PATCH 280/282] Translations updated by CI (extract-intl)

---
 front/app/translations/admin/ar-MA.json   | 2 --
 front/app/translations/admin/ar-SA.json   | 2 --
 front/app/translations/admin/ca-ES.json   | 2 --
 front/app/translations/admin/da-DK.json   | 2 --
 front/app/translations/admin/de-DE.json   | 2 --
 front/app/translations/admin/el-GR.json   | 2 --
 front/app/translations/admin/en-CA.json   | 2 --
 front/app/translations/admin/en-GB.json   | 2 --
 front/app/translations/admin/en.json      | 2 --
 front/app/translations/admin/es-CL.json   | 2 --
 front/app/translations/admin/es-ES.json   | 2 --
 front/app/translations/admin/fi-FI.json   | 2 --
 front/app/translations/admin/fr-BE.json   | 2 --
 front/app/translations/admin/fr-FR.json   | 2 --
 front/app/translations/admin/hr-HR.json   | 2 --
 front/app/translations/admin/it-IT.json   | 2 --
 front/app/translations/admin/kl-GL.json   | 2 --
 front/app/translations/admin/lb-LU.json   | 2 --
 front/app/translations/admin/lv-LV.json   | 2 --
 front/app/translations/admin/nb-NO.json   | 2 --
 front/app/translations/admin/nl-BE.json   | 2 --
 front/app/translations/admin/nl-NL.json   | 2 --
 front/app/translations/admin/pl-PL.json   | 2 --
 front/app/translations/admin/pt-BR.json   | 2 --
 front/app/translations/admin/ro-RO.json   | 2 --
 front/app/translations/admin/sr-Latn.json | 2 --
 front/app/translations/admin/sr-SP.json   | 2 --
 front/app/translations/admin/sv-SE.json   | 2 --
 front/app/translations/admin/tr-TR.json   | 2 --
 29 files changed, 58 deletions(-)

diff --git a/front/app/translations/admin/ar-MA.json b/front/app/translations/admin/ar-MA.json
index a4f6912d44c0..1f99aeae9176 100644
--- a/front/app/translations/admin/ar-MA.json
+++ b/front/app/translations/admin/ar-MA.json
@@ -476,7 +476,6 @@
   "app.containers.Admin.projects.all.deleteFolderError": "حدث خطأ أثناء إزالة هذا المجلد. يُرجى المحاولة مجددًا.",
   "app.containers.Admin.projects.all.deleteProjectConfirmation": "هل تريد حذف هذا المشروع بالتأكيد؟ هذا إجراء لا يمكن التراجع عنه.",
   "app.containers.Admin.projects.all.deleteProjectError": "حدث خطأ أثناء حذف هذا المشروع، يُرجى المحاولة مجددًا في وقت لاحق.",
-  "app.containers.Admin.reporting.chartsSection": "مخططات",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "يشير إلى نص معين. يمكنك تعديله وتهيئته باستخدام المحرر في اللوحة على اليمين.",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.participants": "المشاركون",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.projectResults": "نتائج المشروع",
@@ -512,7 +511,6 @@
   "app.containers.Admin.reporting.printPrepare": "جارٍ التحضير للطباعة...",
   "app.containers.Admin.reporting.reportBuilder": "أداة إنشاء التقرير",
   "app.containers.Admin.reporting.reportHeader": "ترويسة التقرير",
-  "app.containers.Admin.reporting.resultsSection": "النتائج",
   "app.containers.AdminPage.DashboardPage.Report.participants": "مشاركين",
   "app.containers.AdminPage.DashboardPage.Report.totalUsers": "الإجمالي على المنصة",
   "app.containers.AdminPage.DashboardPage._blank": "غير معروف",
diff --git a/front/app/translations/admin/ar-SA.json b/front/app/translations/admin/ar-SA.json
index e5b8d0cb872a..92d8a1abd46e 100644
--- a/front/app/translations/admin/ar-SA.json
+++ b/front/app/translations/admin/ar-SA.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "ردود أخرى",
   "app.containers.Admin.projects.project.survey.previousInsight": "البصيرة السابقة",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "منظر",
-  "app.containers.Admin.reporting.chartsSection": "مخططات",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "تقرير المرحلة",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "أضف بعض النصوص حول المرحلة",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "يشير إلى نص معين. يمكنك تعديله وتهيئته باستخدام المحرر في اللوحة على اليمين.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "جارٍ التحضير للطباعة...",
   "app.containers.Admin.reporting.reportBuilder": "أداة إنشاء التقرير",
   "app.containers.Admin.reporting.reportHeader": "ترويسة التقرير",
-  "app.containers.Admin.reporting.resultsSection": "النتائج",
   "app.containers.Admin.reporting.warningBanner": "في هذه الصفحة، يعرض التقرير أحدث بيانات النظام الأساسي. وفي الصفحات الأخرى، تظهر لقطة من التقرير. يتم التقاط اللقطات عند حفظ التقرير على هذه الصفحة.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "إنشاء رمز جديد",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "يلغي",
diff --git a/front/app/translations/admin/ca-ES.json b/front/app/translations/admin/ca-ES.json
index 95c91af2d0c1..258a9442922b 100644
--- a/front/app/translations/admin/ca-ES.json
+++ b/front/app/translations/admin/ca-ES.json
@@ -675,7 +675,6 @@
   "app.containers.Admin.projects.project.survey.deleteAnalysis": "Delete",
   "app.containers.Admin.projects.project.survey.deleteAnalysisConfirmation": "Are you sure you want to delete this analysis? This action cannot be undone.",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "View",
-  "app.containers.Admin.reporting.chartsSection": "CHARTS",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "This is some text. You can edit and format it by using the editor in the panel on the right.",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.participants": "Participants",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.projectResults": "Project results",
@@ -712,7 +711,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparing to print...",
   "app.containers.Admin.reporting.reportBuilder": "Constructor d'informes",
   "app.containers.Admin.reporting.reportHeader": "Report header",
-  "app.containers.Admin.reporting.resultsSection": "RESULTS",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Crea un testimoni nou",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancel · lar",
   "app.containers.Admin.tools.apiTokens.createTokenDescription": "Creeu un testimoni nou per utilitzar-lo amb la nostra API pública.",
diff --git a/front/app/translations/admin/da-DK.json b/front/app/translations/admin/da-DK.json
index 174be8653954..387418720bb4 100644
--- a/front/app/translations/admin/da-DK.json
+++ b/front/app/translations/admin/da-DK.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Andre svar",
   "app.containers.Admin.projects.project.survey.previousInsight": "Tidligere indsigt",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Se",
-  "app.containers.Admin.reporting.chartsSection": "GRAFER",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Fase-rapport",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Tilføj lidt tekst om fasen",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Dette er noget tekst. Du kan redigere og formatere den ved at bruge editoren i panelet til højre.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Forberedelse til udskrivning...",
   "app.containers.Admin.reporting.reportBuilder": "Rapportbygger",
   "app.containers.Admin.reporting.reportHeader": "Rapports overskrift",
-  "app.containers.Admin.reporting.resultsSection": "RESULTATER",
   "app.containers.Admin.reporting.warningBanner": "På denne side viser rapporten de seneste platformdata. På andre sider vises et øjebliksbillede af rapporten. Snapshots tages, når du gemmer rapporten på denne side.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Opret nyt token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuller",
diff --git a/front/app/translations/admin/de-DE.json b/front/app/translations/admin/de-DE.json
index b2ff04b6f7a3..1b51db1e5266 100644
--- a/front/app/translations/admin/de-DE.json
+++ b/front/app/translations/admin/de-DE.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Sonstige Antworten",
   "app.containers.Admin.projects.project.survey.previousInsight": "Vorheriger Einblick",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Vorschau",
-  "app.containers.Admin.reporting.chartsSection": "DIAGRAMME",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Phasenbericht",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Text über die Phase hinzufügen",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Dies ist ein text. Sie können ihn mit dem editor in der leiste auf der rechten seite bearbeiten und formatieren.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Vorbereitung auf den Druck...",
   "app.containers.Admin.reporting.reportBuilder": "Report Builder",
   "app.containers.Admin.reporting.reportHeader": "Berichtskopf",
-  "app.containers.Admin.reporting.resultsSection": "ERGEBNISSE",
   "app.containers.Admin.reporting.warningBanner": "Auf dieser Seite zeigt der Bericht die neuesten Plattformdaten an. Auf anderen Seiten wird ein Schnappschuss des Berichts angezeigt. Schnappschüsse werden erstellt, wenn Sie den Bericht auf dieser Seite speichern.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Neues Token erstellen",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Abbrechen",
diff --git a/front/app/translations/admin/el-GR.json b/front/app/translations/admin/el-GR.json
index 49a865896875..f40b5c344956 100644
--- a/front/app/translations/admin/el-GR.json
+++ b/front/app/translations/admin/el-GR.json
@@ -675,7 +675,6 @@
   "app.containers.Admin.projects.project.survey.deleteAnalysis": "Delete",
   "app.containers.Admin.projects.project.survey.deleteAnalysisConfirmation": "Are you sure you want to delete this analysis? This action cannot be undone.",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "View",
-  "app.containers.Admin.reporting.chartsSection": "ΓΡΑΦΗΜΑΤΑ",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "This is some text. You can edit and format it by using the editor in the panel on the right.",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.participants": "Participants",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.projectResults": "Project results",
@@ -712,7 +711,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparing to print...",
   "app.containers.Admin.reporting.reportBuilder": "Εργαλείο κατασκευής αναφορών",
   "app.containers.Admin.reporting.reportHeader": "Κεφαλίδα αναφοράς",
-  "app.containers.Admin.reporting.resultsSection": "RESULTS",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Δημιουργία νέου token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Ακύρωση",
   "app.containers.Admin.tools.apiTokens.createTokenDescription": "Δημιουργήστε ένα νέο token για χρήση με το δημόσιο API μας.",
diff --git a/front/app/translations/admin/en-CA.json b/front/app/translations/admin/en-CA.json
index 3e7449cc97aa..3b0347345e7d 100644
--- a/front/app/translations/admin/en-CA.json
+++ b/front/app/translations/admin/en-CA.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Other responses",
   "app.containers.Admin.projects.project.survey.previousInsight": "Previous insight",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "View",
-  "app.containers.Admin.reporting.chartsSection": "CHARTS",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Phase report",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Add some text about the phase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "This is some text. You can edit and format it by using the editor in the panel on the right.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparing to print...",
   "app.containers.Admin.reporting.reportBuilder": "Report builder",
   "app.containers.Admin.reporting.reportHeader": "Report header",
-  "app.containers.Admin.reporting.resultsSection": "RESULTS",
   "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Create new token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancel",
diff --git a/front/app/translations/admin/en-GB.json b/front/app/translations/admin/en-GB.json
index a38904584394..7d2246e24e40 100644
--- a/front/app/translations/admin/en-GB.json
+++ b/front/app/translations/admin/en-GB.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Other responses",
   "app.containers.Admin.projects.project.survey.previousInsight": "Previous insight",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "View",
-  "app.containers.Admin.reporting.chartsSection": "CHARTS",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Phase report",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Add some text about the phase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "This is some text. You can edit and format it by using the editor in the panel on the right.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparing to print...",
   "app.containers.Admin.reporting.reportBuilder": "Report builder",
   "app.containers.Admin.reporting.reportHeader": "Report header",
-  "app.containers.Admin.reporting.resultsSection": "RESULTS",
   "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Create new token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancel",
diff --git a/front/app/translations/admin/en.json b/front/app/translations/admin/en.json
index dff0cda5dc85..0718eb09893d 100644
--- a/front/app/translations/admin/en.json
+++ b/front/app/translations/admin/en.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Other responses",
   "app.containers.Admin.projects.project.survey.previousInsight": "Previous insight",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "View",
-  "app.containers.Admin.reporting.chartsSection": "CHARTS",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Phase report",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Add some text about the phase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "This is some text. You can edit and format it by using the editor in the panel on the right.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparing to print...",
   "app.containers.Admin.reporting.reportBuilder": "Report builder",
   "app.containers.Admin.reporting.reportHeader": "Report header",
-  "app.containers.Admin.reporting.resultsSection": "RESULTS",
   "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Create new token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancel",
diff --git a/front/app/translations/admin/es-CL.json b/front/app/translations/admin/es-CL.json
index af586155c916..75cde2be9b0a 100644
--- a/front/app/translations/admin/es-CL.json
+++ b/front/app/translations/admin/es-CL.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Otras respuestas",
   "app.containers.Admin.projects.project.survey.previousInsight": "Visión previa",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Ver",
-  "app.containers.Admin.reporting.chartsSection": "GRÁFICAS",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Informe de la fase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Añade algún texto sobre la fase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Aquí tiene texto. Puede editarlo y darle formato utilizando el editor del panel de la derecha.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparando la impresión...",
   "app.containers.Admin.reporting.reportBuilder": "Constructor de informes",
   "app.containers.Admin.reporting.reportHeader": "Encabezado del informe",
-  "app.containers.Admin.reporting.resultsSection": "RESULTADOS",
   "app.containers.Admin.reporting.warningBanner": "En esta página, el informe muestra los últimos datos de la plataforma. En otras páginas, se muestra una instantánea del informe. Las instantáneas se toman cuando guardas el informe en esta página.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Crear nuevo token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancelar",
diff --git a/front/app/translations/admin/es-ES.json b/front/app/translations/admin/es-ES.json
index 8938096458d2..d7a963108f30 100644
--- a/front/app/translations/admin/es-ES.json
+++ b/front/app/translations/admin/es-ES.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Otras respuestas",
   "app.containers.Admin.projects.project.survey.previousInsight": "Visión previa",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Ver",
-  "app.containers.Admin.reporting.chartsSection": "GRÁFICOS",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Informe de la fase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Añade algún texto sobre la fase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Aquí tiene texto. Puede editarlo y darle formato utilizando el editor del panel de la derecha.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparando para imprimir...",
   "app.containers.Admin.reporting.reportBuilder": "Constructor de informes",
   "app.containers.Admin.reporting.reportHeader": "Encabezado del informe",
-  "app.containers.Admin.reporting.resultsSection": "RESULTADOS",
   "app.containers.Admin.reporting.warningBanner": "En esta página, el informe muestra los últimos datos de la plataforma. En otras páginas, se muestra una instantánea del informe. Las instantáneas se toman cuando guardas el informe en esta página.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Crear nuevo token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancelar",
diff --git a/front/app/translations/admin/fi-FI.json b/front/app/translations/admin/fi-FI.json
index 3dcbabb0f9c0..3a53d3e0ad74 100644
--- a/front/app/translations/admin/fi-FI.json
+++ b/front/app/translations/admin/fi-FI.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Muut vastaukset",
   "app.containers.Admin.projects.project.survey.previousInsight": "Edellinen näkemys",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Näytä",
-  "app.containers.Admin.reporting.chartsSection": "KAAVIOT",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Vaiheraportti",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Lisää tekstiä vaiheesta",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Tämä on vähän tekstiä. Voit muokata ja muotoilla sitä käyttämällä oikeanpuoleisen paneelin editoria.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Valmistellaan tulostamista...",
   "app.containers.Admin.reporting.reportBuilder": "Raportin rakentaja",
   "app.containers.Admin.reporting.reportHeader": "Raportin otsikko",
-  "app.containers.Admin.reporting.resultsSection": "TULOKSET",
   "app.containers.Admin.reporting.warningBanner": "Tällä sivulla raportti näyttää uusimmat alustatiedot. Muilla sivuilla näytetään tilannekuva raportista. Tilannekuvia otetaan, kun tallennat raportin tälle sivulle.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Luo uusi tunnus",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Peruuttaa",
diff --git a/front/app/translations/admin/fr-BE.json b/front/app/translations/admin/fr-BE.json
index 5685585edf82..bd522f9454bc 100644
--- a/front/app/translations/admin/fr-BE.json
+++ b/front/app/translations/admin/fr-BE.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Autres réponses",
   "app.containers.Admin.projects.project.survey.previousInsight": "Aperçu précédent",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Voir",
-  "app.containers.Admin.reporting.chartsSection": "GRAPHIQUES",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Rapport de phase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Ajoutez un texte introductif ou une explication à propos de la phase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Voici du texte. Vous pouvez le modifier et le mettre en forme en utilisant l'éditeur dans le panneau de droite.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Préparation de l'impression...",
   "app.containers.Admin.reporting.reportBuilder": "Constructeur de rapports",
   "app.containers.Admin.reporting.reportHeader": "En-tête du rapport",
-  "app.containers.Admin.reporting.resultsSection": "RÉSULTATS",
   "app.containers.Admin.reporting.warningBanner": "Sur cette page, le rapport présente les dernières données de la plate-forme. Sur les autres pages, un instantané du rapport est affiché. Les instantanés sont pris lorsque vous enregistrez le rapport sur cette page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Créer un nouveau jeton",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuler",
diff --git a/front/app/translations/admin/fr-FR.json b/front/app/translations/admin/fr-FR.json
index 31d4e3171387..24c4de1bb10f 100644
--- a/front/app/translations/admin/fr-FR.json
+++ b/front/app/translations/admin/fr-FR.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Autres réponses",
   "app.containers.Admin.projects.project.survey.previousInsight": "Insight précédent",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Voir",
-  "app.containers.Admin.reporting.chartsSection": "GRAPHIQUES",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Rapport de phase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Ajoutez un texte introductif ou une explication à propos de la phase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Voici du texte. Vous pouvez le modifier et le mettre en forme en utilisant l'éditeur dans le panneau de droite.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Préparation de l'impression...",
   "app.containers.Admin.reporting.reportBuilder": "Éditeur de rapports",
   "app.containers.Admin.reporting.reportHeader": "En-tête du rapport",
-  "app.containers.Admin.reporting.resultsSection": "RÉSULTATS",
   "app.containers.Admin.reporting.warningBanner": "Sur cette page, le rapport présente les dernières données de la plate-forme. Sur les autres pages, un instantané du rapport est affiché. Les instantanés sont pris lorsque vous enregistrez le rapport sur cette page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Créer un nouveau jeton",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuler",
diff --git a/front/app/translations/admin/hr-HR.json b/front/app/translations/admin/hr-HR.json
index a93fe27c23bf..1eb90c8128b4 100644
--- a/front/app/translations/admin/hr-HR.json
+++ b/front/app/translations/admin/hr-HR.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Ostali odgovori",
   "app.containers.Admin.projects.project.survey.previousInsight": "Prethodni uvid",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Pogled",
-  "app.containers.Admin.reporting.chartsSection": "GRAFIKONI",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Izvješće o fazi",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Dodajte tekst o fazi",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Ovo je neki tekst. Možete ga uređivati i formatirati pomoću uređivača u ploči s desne strane.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Priprema za tisak...",
   "app.containers.Admin.reporting.reportBuilder": "Alat za izgradnju izvješća",
   "app.containers.Admin.reporting.reportHeader": "Zaglavlje izvješća",
-  "app.containers.Admin.reporting.resultsSection": "REZULTATI",
   "app.containers.Admin.reporting.warningBanner": "Na ovoj stranici izvješće prikazuje najnovije podatke o platformi. Na ostalim stranicama prikazuje se snimka izvješća. Snimke se prave kada spremite izvješće na ovu stranicu.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Stvorite novi token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Otkazati",
diff --git a/front/app/translations/admin/it-IT.json b/front/app/translations/admin/it-IT.json
index 07e8f2c8417e..172c5e31e52c 100644
--- a/front/app/translations/admin/it-IT.json
+++ b/front/app/translations/admin/it-IT.json
@@ -675,7 +675,6 @@
   "app.containers.Admin.projects.project.survey.deleteAnalysis": "Delete",
   "app.containers.Admin.projects.project.survey.deleteAnalysisConfirmation": "Are you sure you want to delete this analysis? This action cannot be undone.",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "View",
-  "app.containers.Admin.reporting.chartsSection": "GRAFICI",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "This is some text. You can edit and format it by using the editor in the panel on the right.",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.participants": "Participants",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.projectResults": "Project results",
@@ -712,7 +711,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparing to print...",
   "app.containers.Admin.reporting.reportBuilder": "Generatore report",
   "app.containers.Admin.reporting.reportHeader": "Intestazione report",
-  "app.containers.Admin.reporting.resultsSection": "RESULTS",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Crea un nuovo token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annullamento",
   "app.containers.Admin.tools.apiTokens.createTokenDescription": "Crea un nuovo token da utilizzare con la nostra API pubblica.",
diff --git a/front/app/translations/admin/kl-GL.json b/front/app/translations/admin/kl-GL.json
index aa6b969d5f6a..508e10423c00 100644
--- a/front/app/translations/admin/kl-GL.json
+++ b/front/app/translations/admin/kl-GL.json
@@ -517,7 +517,6 @@
   "app.containers.Admin.projects.all.deleteProjectButtonFull": "Delete project",
   "app.containers.Admin.projects.all.deleteProjectConfirmation": "Ilumoortumik suliniut una peerniarpiuk? Uterteqqinneqarsinnaanngilaq.",
   "app.containers.Admin.projects.all.deleteProjectError": "Suliniutip uuma peerniarnerani ajortoqarpoq. Kingusinnerusukkut misileqqilaariuk.",
-  "app.containers.Admin.reporting.chartsSection": "CHARTS",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "This is some text. You can edit and format it by using the editor in the panel on the right.",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.participants": "Participants",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.projectResults": "Project results",
@@ -554,7 +553,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparing to print...",
   "app.containers.Admin.reporting.reportBuilder": "Report builder",
   "app.containers.Admin.reporting.reportHeader": "Report header",
-  "app.containers.Admin.reporting.resultsSection": "RESULTS",
   "app.containers.AdminPage.DashboardPage.Report.participants": "peqataasut",
   "app.containers.AdminPage.DashboardPage.Report.totalUsers": "quppernermi atuisut amerlassusaat",
   "app.containers.AdminPage.DashboardPage._blank": "ilisimaneqanngilaq",
diff --git a/front/app/translations/admin/lb-LU.json b/front/app/translations/admin/lb-LU.json
index 2141190f41f5..8731526ff042 100644
--- a/front/app/translations/admin/lb-LU.json
+++ b/front/app/translations/admin/lb-LU.json
@@ -517,7 +517,6 @@
   "app.containers.Admin.projects.all.deleteProjectButtonFull": "Projet läschen",
   "app.containers.Admin.projects.all.deleteProjectConfirmation": "Are you sure you want to delete this project? This cannot be undone.",
   "app.containers.Admin.projects.all.deleteProjectError": "There was an error deleting this project, please try again later.",
-  "app.containers.Admin.reporting.chartsSection": "GRAFIKEN",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "This is some text. You can edit and format it by using the editor in the panel on the right.",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.participants": "Participants",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.projectResults": "Project results",
@@ -554,7 +553,6 @@
   "app.containers.Admin.reporting.printPrepare": "Drécke gëtt preparéiert...",
   "app.containers.Admin.reporting.reportBuilder": "Report Builder",
   "app.containers.Admin.reporting.reportHeader": "Header vum Rapport",
-  "app.containers.Admin.reporting.resultsSection": "RESULTS",
   "app.containers.AdminPage.DashboardPage.Report.participants": "participants",
   "app.containers.AdminPage.DashboardPage.Report.totalUsers": "total users on the platform",
   "app.containers.AdminPage.DashboardPage._blank": "unknown",
diff --git a/front/app/translations/admin/lv-LV.json b/front/app/translations/admin/lv-LV.json
index cc8d5f9198c1..1b3245fb8cd6 100644
--- a/front/app/translations/admin/lv-LV.json
+++ b/front/app/translations/admin/lv-LV.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Citas atbildes",
   "app.containers.Admin.projects.project.survey.previousInsight": "Iepriekšējais ieskats",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Skatīt",
-  "app.containers.Admin.reporting.chartsSection": "DIAGRAMMATAS",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Posma ziņojums",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Pievienojiet tekstu par fāzi",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Šeit ir teksts. To var rediģēt un formatēt, izmantojot redaktoru panelī labajā pusē.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Gatavošanās drukāšanai...",
   "app.containers.Admin.reporting.reportBuilder": "Ziņojuma veidotājs",
   "app.containers.Admin.reporting.reportHeader": "Ziņojuma galvene",
-  "app.containers.Admin.reporting.resultsSection": "REZULTĀTI",
   "app.containers.Admin.reporting.warningBanner": "Šajā lapā pārskatā ir norādīti jaunākie platformas dati. Citās lapās tiek parādīts ziņojuma momentuzņēmums. Kad saglabājat ziņojumu šajā lapā, tiek veikti momentuzņēmumi.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Izveidot jaunu žetonu",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Atcelt",
diff --git a/front/app/translations/admin/nb-NO.json b/front/app/translations/admin/nb-NO.json
index 089c4e6ebc34..0e4b26bd9858 100644
--- a/front/app/translations/admin/nb-NO.json
+++ b/front/app/translations/admin/nb-NO.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Andre svar",
   "app.containers.Admin.projects.project.survey.previousInsight": "Tidligere innsikt",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Utsikt",
-  "app.containers.Admin.reporting.chartsSection": "Diagrammer",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Faserapport",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Legg til litt tekst om fasen",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Dette er litt tekst. Du kan redigere og formatere den ved hjelp av redigeringsprogrammet i panelet til høyre.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Forbereder utskrift …",
   "app.containers.Admin.reporting.reportBuilder": "Rapportbygger",
   "app.containers.Admin.reporting.reportHeader": "Rapport overskrift",
-  "app.containers.Admin.reporting.resultsSection": "RESULTATER",
   "app.containers.Admin.reporting.warningBanner": "På denne siden viser rapporten de nyeste plattformdataene. På andre sider vises et øyeblikksbilde av rapporten. Øyeblikksbilder tas når du lagrer rapporten på denne siden.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Opprett nytt token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Avbryt",
diff --git a/front/app/translations/admin/nl-BE.json b/front/app/translations/admin/nl-BE.json
index 26fd4e3ccd48..7a83e74b4aeb 100644
--- a/front/app/translations/admin/nl-BE.json
+++ b/front/app/translations/admin/nl-BE.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Andere reacties",
   "app.containers.Admin.projects.project.survey.previousInsight": "Vorig inzicht",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Bekijk",
-  "app.containers.Admin.reporting.chartsSection": "CHARTS",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Faserapport",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Voeg wat tekst over de fase toe",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Dit is tekst. Je kunt het aanpassen en formatteren met behulp van de editor in het paneel aan de rechterzijde.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Klaarmaken om af te drukken...",
   "app.containers.Admin.reporting.reportBuilder": "Rapportbouwer",
   "app.containers.Admin.reporting.reportHeader": "Koptekst rapport",
-  "app.containers.Admin.reporting.resultsSection": "RESULTATEN",
   "app.containers.Admin.reporting.warningBanner": "Op deze pagina toont het rapport de laatste platformgegevens. Op andere pagina's wordt een momentopname van het rapport getoond. Snapshots worden gemaakt wanneer je het rapport op deze pagina opslaat.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Nieuw token aanmaken",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuleren",
diff --git a/front/app/translations/admin/nl-NL.json b/front/app/translations/admin/nl-NL.json
index 8ab7291f2ded..c2419399b626 100644
--- a/front/app/translations/admin/nl-NL.json
+++ b/front/app/translations/admin/nl-NL.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Andere reacties",
   "app.containers.Admin.projects.project.survey.previousInsight": "Vorige inzicht",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Bekijk",
-  "app.containers.Admin.reporting.chartsSection": "GRAFIEKEN",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Faserapport",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Voeg wat tekst over de fase toe",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Dit is tekst. Je kunt het aanpassen en formatteren met behulp van de editor in het paneel aan de rechterzijde.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Klaarmaken om af te drukken...",
   "app.containers.Admin.reporting.reportBuilder": "Rapport vormgever",
   "app.containers.Admin.reporting.reportHeader": "Koptekst rapport",
-  "app.containers.Admin.reporting.resultsSection": "RESULTATEN",
   "app.containers.Admin.reporting.warningBanner": "Op deze pagina toont het rapport de laatste platformgegevens. Op andere pagina's wordt een momentopname van het rapport getoond. Momentopnames worden gemaakt wanneer je het rapport op deze pagina opslaat.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Nieuw token aanmaken",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Annuleren",
diff --git a/front/app/translations/admin/pl-PL.json b/front/app/translations/admin/pl-PL.json
index 758b729e2b1c..6172f3f37be5 100644
--- a/front/app/translations/admin/pl-PL.json
+++ b/front/app/translations/admin/pl-PL.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Inne odpowiedzi",
   "app.containers.Admin.projects.project.survey.previousInsight": "Poprzedni wgląd",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Zobacz",
-  "app.containers.Admin.reporting.chartsSection": "CHARAKTERYSTYKA",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Raport z fazy",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Dodaj tekst o fazie",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "To jest przykładowy tekst. Można go edytować i formatować za pomocą edytora w panelu po prawej stronie.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Przygotowanie do druku...",
   "app.containers.Admin.reporting.reportBuilder": "Kreator raportu",
   "app.containers.Admin.reporting.reportHeader": "Nagłówek raportu",
-  "app.containers.Admin.reporting.resultsSection": "WYNIKI",
   "app.containers.Admin.reporting.warningBanner": "Na tej stronie raport przedstawia najnowsze dane platformy. Na innych stronach wyświetlana jest migawka raportu. Migawki są tworzone, gdy zapisujesz raport na tej stronie.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Utwórz nowy token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Anuluj",
diff --git a/front/app/translations/admin/pt-BR.json b/front/app/translations/admin/pt-BR.json
index 435b67224337..2f5a9711d233 100644
--- a/front/app/translations/admin/pt-BR.json
+++ b/front/app/translations/admin/pt-BR.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Outras respostas",
   "app.containers.Admin.projects.project.survey.previousInsight": "Insight anterior",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Visualizar",
-  "app.containers.Admin.reporting.chartsSection": "CARTUCHOS",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Relatório de fase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Adicione algum texto sobre a fase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Esse é o texto. Você pode editá-lo e formatá-lo usando o editor no painel à direita.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparar para imprimir...",
   "app.containers.Admin.reporting.reportBuilder": "Elaboração de Relatórios",
   "app.containers.Admin.reporting.reportHeader": "Cabeçalho do relatório",
-  "app.containers.Admin.reporting.resultsSection": "RESULTADOS",
   "app.containers.Admin.reporting.warningBanner": "Nesta página, o relatório mostra os dados mais recentes da plataforma. Em outras páginas, é mostrado um instantâneo do relatório. Os instantâneos são tirados quando você salva o relatório nessa página.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Criar nova ficha",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Cancelar",
diff --git a/front/app/translations/admin/ro-RO.json b/front/app/translations/admin/ro-RO.json
index c97d4f687489..40ae32aa036c 100644
--- a/front/app/translations/admin/ro-RO.json
+++ b/front/app/translations/admin/ro-RO.json
@@ -476,7 +476,6 @@
   "app.containers.Admin.projects.all.deleteFolderError": "There was an issue removing this folder. Please try again.",
   "app.containers.Admin.projects.all.deleteProjectConfirmation": "Are you sure you want to delete this project? This cannot be undone.",
   "app.containers.Admin.projects.all.deleteProjectError": "There was an error deleting this project, please try again later.",
-  "app.containers.Admin.reporting.chartsSection": "DIAGRAME",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "This is some text. You can edit and format it by using the editor in the panel on the right.",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.participants": "Participants",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.projectResults": "Project results",
@@ -512,7 +511,6 @@
   "app.containers.Admin.reporting.printPrepare": "Preparing to print...",
   "app.containers.Admin.reporting.reportBuilder": "Constructor de rapoarte",
   "app.containers.Admin.reporting.reportHeader": "Antetul raportului",
-  "app.containers.Admin.reporting.resultsSection": "RESULTS",
   "app.containers.AdminPage.DashboardPage.Report.participants": "participants",
   "app.containers.AdminPage.DashboardPage.Report.totalUsers": "total users on the platform",
   "app.containers.AdminPage.DashboardPage._blank": "unknown",
diff --git a/front/app/translations/admin/sr-Latn.json b/front/app/translations/admin/sr-Latn.json
index cef9a6cc521d..342e06b7f7b8 100644
--- a/front/app/translations/admin/sr-Latn.json
+++ b/front/app/translations/admin/sr-Latn.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Other responses",
   "app.containers.Admin.projects.project.survey.previousInsight": "Previous insight",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "View",
-  "app.containers.Admin.reporting.chartsSection": "GRAFIKONI",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Phase report",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Add some text about the phase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Ovo je neki tekst. Možete ga uređivati i formatirati pomoću uređivača na tabli sa desne strane.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Priprema za štampu...",
   "app.containers.Admin.reporting.reportBuilder": "Prijavi alatku za izradu",
   "app.containers.Admin.reporting.reportHeader": "Zaglavlje izveštaja",
-  "app.containers.Admin.reporting.resultsSection": "REZULTATI",
   "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Креирајте нови токен",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Поништити, отказати",
diff --git a/front/app/translations/admin/sr-SP.json b/front/app/translations/admin/sr-SP.json
index 0a0b1c489f69..6de0dac47ec0 100644
--- a/front/app/translations/admin/sr-SP.json
+++ b/front/app/translations/admin/sr-SP.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Other responses",
   "app.containers.Admin.projects.project.survey.previousInsight": "Претходни увид",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Поглед",
-  "app.containers.Admin.reporting.chartsSection": "ЦАРТС",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Phase report",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Add some text about the phase",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Ово је неки текст. Можете га уређивати и форматирати помоћу уређивача на табли са десне стране.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Припрема за штампање...",
   "app.containers.Admin.reporting.reportBuilder": "Градитељ извештаја",
   "app.containers.Admin.reporting.reportHeader": "Заглавље извештаја",
-  "app.containers.Admin.reporting.resultsSection": "РЕЗУЛТАТИ",
   "app.containers.Admin.reporting.warningBanner": "On this page, the report shows the latest platform data. On other pages, a snapshot of the report is shown. Snapshots are taken when you save the report on this page.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Креирајте нови токен",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Поништити, отказати",
diff --git a/front/app/translations/admin/sv-SE.json b/front/app/translations/admin/sv-SE.json
index 2e1ae3ba0370..a5794dbda395 100644
--- a/front/app/translations/admin/sv-SE.json
+++ b/front/app/translations/admin/sv-SE.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Andra svar",
   "app.containers.Admin.projects.project.survey.previousInsight": "Tidigare insikt",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Utsikt",
-  "app.containers.Admin.reporting.chartsSection": "DIAGRAM",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Fasrapport",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Lägg till lite text om fasen",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Det här är lite text. Du kan redigera och formatera den genom att använda redigeraren i panelen till höger.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Förbereder utskrift...",
   "app.containers.Admin.reporting.reportBuilder": "Rapportbyggare",
   "app.containers.Admin.reporting.reportHeader": "Rapportrubrik",
-  "app.containers.Admin.reporting.resultsSection": "RESULTAT",
   "app.containers.Admin.reporting.warningBanner": "På den här sidan visar rapporten de senaste plattformsdata. På andra sidor visas en ögonblicksbild av rapporten. Ögonblicksbilder tas när du sparar rapporten på den här sidan.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Skapa ny token",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "Avbryt",
diff --git a/front/app/translations/admin/tr-TR.json b/front/app/translations/admin/tr-TR.json
index 527825810263..1d182671d6e0 100644
--- a/front/app/translations/admin/tr-TR.json
+++ b/front/app/translations/admin/tr-TR.json
@@ -850,7 +850,6 @@
   "app.containers.Admin.projects.project.survey.otherResponses": "Diğer yanıtlar",
   "app.containers.Admin.projects.project.survey.previousInsight": "Önceki içgörü",
   "app.containers.Admin.projects.project.survey.viewAnalysis": "Görünüm",
-  "app.containers.Admin.reporting.chartsSection": "ÇİZELGELER",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReport": "Aşama raporu",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.PhaseTemplate.phaseReportDescription": "Aşama hakkında biraz metin ekleyin",
   "app.containers.Admin.reporting.components.ReportBuilder.Templates.descriptionPlaceHolder": "Bu bir metin içeriğidir. Sağdaki panelde bulunan düzenleyiciyi kullanarak düzenleyebilir ve biçimlendirebilirsiniz.",
@@ -899,7 +898,6 @@
   "app.containers.Admin.reporting.printPrepare": "Baskıya hazırlanıyor...",
   "app.containers.Admin.reporting.reportBuilder": "Rapor oluşturucu",
   "app.containers.Admin.reporting.reportHeader": "Rapor başlığı",
-  "app.containers.Admin.reporting.resultsSection": "SONUÇLAR",
   "app.containers.Admin.reporting.warningBanner": "Bu sayfada, rapor en son platform verilerini gösterir. Diğer sayfalarda raporun bir anlık görüntüsü gösterilir. Anlık görüntüler, raporu bu sayfada kaydettiğinizde alınır.",
   "app.containers.Admin.tools.apiTokens.createTokenButton": "Yeni belirteç oluşturun",
   "app.containers.Admin.tools.apiTokens.createTokenCancel": "İptal",

From ca9368a3138209dafc2ab57556381a470c70f3ad Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Mon, 11 Mar 2024 16:47:17 +0100
Subject: [PATCH 281/282] [TAN-1250] Remove unused import statement in
 ReportBuilder Toolbox component

---
 .../Admin/reporting/components/ReportBuilder/Toolbox/index.tsx   | 1 -
 1 file changed, 1 deletion(-)

diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
index 2c70101b9f27..1339cbecdf50 100644
--- a/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
+++ b/front/app/containers/Admin/reporting/components/ReportBuilder/Toolbox/index.tsx
@@ -27,7 +27,6 @@ import {
 } from 'utils/cl-intl';
 import { isModerator } from 'utils/permissions/roles';
 
-import reportBuilderMessages from '../../../messages';
 import { WIDGET_TITLES } from '../Widgets';
 import AboutReportWidget from '../Widgets/AboutReportWidget';
 import ActiveUsersWidget from '../Widgets/ChartWidgets/ActiveUsersWidget';

From 214798ffe1ad085100648bad47f76c23e656af61 Mon Sep 17 00:00:00 2001
From: Alexander <alexander@citizenlab.co>
Date: Tue, 12 Mar 2024 11:56:25 +0100
Subject: [PATCH 282/282] Don't publish report when visibility is updated

---
 .../app/services/report_builder/side_fx_report_service.rb       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/back/engines/commercial/report_builder/app/services/report_builder/side_fx_report_service.rb b/back/engines/commercial/report_builder/app/services/report_builder/side_fx_report_service.rb
index 83c1a68a1a39..c7cd8d528adf 100644
--- a/back/engines/commercial/report_builder/app/services/report_builder/side_fx_report_service.rb
+++ b/back/engines/commercial/report_builder/app/services/report_builder/side_fx_report_service.rb
@@ -19,7 +19,7 @@ def before_update(report, user)
     def after_update(report, user)
       super(report, user)
       layout_side_fx_service.after_update(report.layout, user) if report.layout.previous_changes.present?
-      ReportPublisher.new(report, user).publish
+      ReportPublisher.new(report, user).publish if report.layout.previous_changes.include?('craftjs_json')
     end
 
     def before_destroy(report, user)