@galadrim/galadmin 0.0.106 → 0.0.107

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+
2
+ 8af5d0af53d319a579f8b983a97437e4e2b75f18 {"key":"{\"terser\":\"5.7.1\",\"terser-webpack-plugin\":\"4.2.3\",\"terser-webpack-plugin-options\":{\"test\":new RegExp(\"\\\\.[cm]?js(\\\\?.*)?$\", \"i\"),\"extractComments\":true,\"sourceMap\":true,\"cache\":true,\"cacheKeys\":defaultCacheKeys => defaultCacheKeys,\"parallel\":true,\"include\":undefined,\"exclude\":undefined,\"minify\":undefined,\"terserOptions\":{\"parse\":{\"ecma\":8},\"compress\":{\"ecma\":5,\"warnings\":false,\"comparisons\":false,\"inline\":2},\"mangle\":{\"safari10\":true},\"keep_classnames\":false,\"keep_fnames\":false,\"output\":{\"ecma\":5,\"comments\":false,\"ascii_only\":true},\"ecma\":5}},\"name\":\"static\\u002Fjs\\u002Fmain.97032afc.chunk.js\",\"contentHash\":\"b95b335530c220b55599\"}","integrity":"sha512-HGHMwkvfErzCbcdoZBuBq3ln6mYfQSM/rUvk8hqBMpW7uyTche+7uNfRnmcK20QZHLGZcA9A0axA/Ggj+aq/Dg==","time":1657009255804,"size":369831}
@@ -4393,7 +4393,7 @@
4393
4393
  "version": "2.6.12",
4394
4394
  "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
4395
4395
  "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
4396
- "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.",
4396
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
4397
4397
  "hasInstallScript": true
4398
4398
  },
4399
4399
  "node_modules/babel-runtime/node_modules/regenerator-runtime": {
@@ -5450,6 +5450,7 @@
5450
5450
  "version": "3.16.0",
5451
5451
  "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz",
5452
5452
  "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==",
5453
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
5453
5454
  "hasInstallScript": true,
5454
5455
  "funding": {
5455
5456
  "type": "opencollective",
@@ -5481,6 +5482,7 @@
5481
5482
  "version": "3.16.0",
5482
5483
  "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.0.tgz",
5483
5484
  "integrity": "sha512-wzlhZNepF/QA9yvx3ePDgNGudU5KDB8lu/TRPKelYA/QtSnkS/cLl2W+TIdEX1FAFcBr0YpY7tPDlcmXJ7AyiQ==",
5485
+ "deprecated": "core-js-pure@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js-pure.",
5484
5486
  "hasInstallScript": true,
5485
5487
  "funding": {
5486
5488
  "type": "opencollective",
@@ -4409,7 +4409,7 @@
4409
4409
  "version": "2.6.12",
4410
4410
  "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
4411
4411
  "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
4412
- "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.",
4412
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
4413
4413
  "hasInstallScript": true
4414
4414
  },
4415
4415
  "node_modules/babel-runtime/node_modules/regenerator-runtime": {
@@ -5466,6 +5466,7 @@
5466
5466
  "version": "3.16.0",
5467
5467
  "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz",
5468
5468
  "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==",
5469
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
5469
5470
  "hasInstallScript": true,
5470
5471
  "funding": {
5471
5472
  "type": "opencollective",
@@ -5497,6 +5498,7 @@
5497
5498
  "version": "3.16.0",
5498
5499
  "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.0.tgz",
5499
5500
  "integrity": "sha512-wzlhZNepF/QA9yvx3ePDgNGudU5KDB8lu/TRPKelYA/QtSnkS/cLl2W+TIdEX1FAFcBr0YpY7tPDlcmXJ7AyiQ==",
5501
+ "deprecated": "core-js-pure@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js-pure.",
5500
5502
  "hasInstallScript": true,
5501
5503
  "funding": {
5502
5504
  "type": "opencollective",
@@ -7,7 +7,7 @@ import {
7
7
  } from "react-router-dom";
8
8
  import { ConfigContext } from "../../contexts/ConfigContext";
9
9
 
10
- export default ({ panel, record, view }) => {
10
+ export default ({ panel, record, view, index }) => {
11
11
  const [results, setResults] = useState(null);
12
12
  const history = useHistory();
13
13
  const { viewIndex } = useParams();
@@ -20,6 +20,8 @@ export default ({ panel, record, view }) => {
20
20
  const refreshData = () => {
21
21
  axios.get("/customQuery", {
22
22
  params: {
23
+ viewIndex,
24
+ panelIndex: index,
23
25
  query: panel.query || evalExpression(panel.formattedQuery, record),
24
26
  primaryValue: record[view.primaryId]
25
27
  }
@@ -75,9 +75,9 @@ export default () => {
75
75
  {panel.canDownload && panel.type === "table" ? <DownloadTablePanelButton record={record} panel={panel} /> : null}
76
76
  </div>
77
77
  </div>
78
- {panel.type === "table" ? <TablePanel record={record} panel={panel} view={view} /> : null}
79
- {panel.type === "gallery" ? <GalleryPanel record={record} panel={panel} view={view} /> : null}
80
- {panel.type === "map" ? <MapPanel record={record} panel={panel} view={view} /> : null}
78
+ {panel.type === "table" ? <TablePanel record={record} panel={panel} view={view} index={index} /> : null}
79
+ {panel.type === "gallery" ? <GalleryPanel record={record} panel={panel} view={view} index={index} /> : null}
80
+ {panel.type === "map" ? <MapPanel record={record} panel={panel} view={view} index={index} /> : null}
81
81
  </div>
82
82
  ))}
83
83
  </div>
@@ -197,6 +197,9 @@ export type TablePanel = {
197
197
  createConfig?: CreateConfig,
198
198
  tableName?: string,
199
199
  primaryId?: string,
200
+ formatValue?: {
201
+ [key: string]: (record: any) => string
202
+ },
200
203
  formattedValues?: { [key: string]: string },
201
204
  createCallback?: string,
202
205
  createCallbackFunction?: ({ id: number, data: any }) => void,
@@ -1 +0,0 @@
1
- {"version":3,"sources":["utils/evalExpression.js","contexts/ConfigContext.js","components/Sidebar.js","components/RedirectToFirstView.js","components/inputs/ColorInput.js","components/inputs/RichTextInput.js","components/inputs/DatetimeInput.js","components/inputs/AddressInput.js","components/inputs/FileInput.js","components/inputs/ForeignSelectInput.js","components/inputs/ForeignDatalistInput.js","components/Input.js","components/LabelTooltip.js","utils/checkRequiredColumns.js","pages/CreateRecord.js","pages/EditRecord.js","components/DownloadButton.js","components/OutsideClickHandler.js","components/AddFilterButton.js","components/BulkActionsButton.js","utils/getFormattedValue.js","pages/Records.js","components/ActionsButton.js","components/BackButton.js","components/DownloadTablePanelButton.js","components/panels/TablePanel.js","components/panels/GalleryPanel.js","components/panels/MapPanel.js","pages/Record.js","images/logo.png","pages/Login.js","pages/Iframe.js","components/CustomComponent.js","pages/CustomView.js","App.js","index.js"],"names":["expression","data","varString","key","replace","JSON","stringify","eval","e","console","log","error","ConfigContext","createContext","ConfigProvider","props","useState","config","setConfig","useEffect","axios","get","then","response","_config","googleMapsKey","script","document","createElement","src","body","appendChild","removeChild","Provider","value","children","SidebarItemIconAndLabel","view","class","icon","label","location","useLocation","useContext","history","useHistory","logo","name","views","filter","hidden","map","i","type","href","isActive","pathname","to","startsWith","onClick","push","subviews","subview","j","stopPropagation","hideBranding","firstView","column","onChange","initialData","colorPicker","useRef","current","window","$","spectrum","preferredFormat","showInput","chooseText","cancelText","color","on","_","toHexString","off","ref","target","Quill","prototype","getHTML","this","container","querySelector","innerHTML","quillContainer","editor","theme","modules","toolbar","contentField","setContents","parse","htmlField","getContents","style","height","withTime","datepicker","datepickerEl","language","autoClose","onSelect","date","moment","format","selectDate","Date","googleMapsInput","google","autocomplete","maps","places","Autocomplete","componentRestrictions","addListener","place","getPlace","length","geometry","fieldValues","latitudeField","lat","longitudeField","lng","addressField","formatted_address","streetNumberField","address_components","find","x","long_name","routeField","localityField","administrativeAreaLevel2Field","administrativeAreaLevel1Field","countryField","postalCodeField","placeData","setInputValue","addEventListener","removeEventListener","placeholder","defaultValue","form","isLoading","setIsLoading","path","setPath","onInputChange","a","f","FormData","method","url","params","subdirectory","publicPath","s3Config","headers","fileData","aspectRatioField","aspectRatio","originalNameField","originalFilename","id","Math","random","toString","htmlFor","display","preventDefault","options","setOptions","viewIndex","useParams","post","columnId","__id__","optional","option","query","setQuery","input","isInputValid","list","dataType","includes","Array","isArray","Object","keys","ForeignDatalistInput","ForeignSelectInput","AddressInput","ColorInput","FileInput","DatetimeInput","RichTextInput","text","visible","setVisible","onMouseLeave","onMouseEnter","columns","message","requiredUnfilledColumns","required","undefined","join","swal","title","dangerMode","panelIndex","recordId","panel","recordViewPanels","filteredColumns","createConfig","canEditOnCreation","canEdit","isCreating","setIsCreating","createRecord","checkRequiredColumns","createFilters","redirectToCreatedItems","responseText","aNewSingular","index","labelTooltip","LabelTooltip","Input","newValues","goBack","record","setRecord","dataToUpdate","isUpdating","setIsUpdating","updateRecord","primaryValue","previousData","subviewIndex","currentFilters","orderBy","isDesc","isDownloading","setIsDownloading","filters","download","content","OutsideClickHandler","handler","wrapperRef","onOutsideClick","handleClickOutside","event","contains","getElementById","onAddFilter","refreshData","filtersOpened","setFiltersOpened","field","setField","operator","setOperator","setValue","foreignSelectedLabel","c","searchableName","_column","info","from","fieldLabel","searchedField","formattedValue","queryItems","selectedRecordIds","bulkActionsOpened","setBulkActionsOpened","hideMultiselect","canDelete","customActions","action","actionIndex","alert","catch","buttons","willDelete","primaryValues","onTable","showAsPicture","imageUrl","baseUrl","pathField","width","objectFit","formatValue","dangerouslySetInnerHTML","__html","evalExpression","actionDisplayCondition","backgroundColor","constructor","_viewIndex","_page","_currentFilters","_orderBy","_isDesc","_query","page","setPage","setCurrentFilters","setOrderBy","setIsDesc","setSelectedRecordIds","setData","hideInTable","BulkActionsButton","AddFilterButton","DownloadButton","canCreate","sortName","cellIndex","records","primaryId","notClickable","tagName","clickToEdit","getFormattedValue","count","max","ceil","limit","min","actionsOpened","setActionsOpened","deleteRecord","deleteCallback","canDuplicate","formattedQuery","results","lines","result","formattedValues","setResults","deleteRow","row","panelId","folded","canShow","findIndex","tableName","onerror","mapRef","initMap","Lat","Lng","zoom","Map","center","Marker","position","BackButton","ActionsButton","canDownload","DownloadTablePanelButton","TablePanel","GalleryPanel","MapPanel","setIsAuthenticated","username","setUsername","password","setPassword","login","success","packages","exports","React","styled","getParsedModule","code","moduleName","_this","create","require","module","Function","wrapper","fetchComponent","componentPath","default","CustomComponent","Component","useMemo","lazy","fallback","memo","defaults","withCredentials","baseURL","App","isAuthenticated","basename","Sidebar","Records","Record","EditRecord","CreateRecord","Iframe","CustomView","RedirectToFirstView","Login","ReactDOM","render","StrictMode"],"mappings":"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","file":"static/js/main.421625da.chunk.js","sourcesContent":["\nexport default (expression, data) => {\n try {\n var varString = '';\n for (var key in data) {\n varString += \"var \" + key + \" = \" + (typeof data[key] === \"string\" ? \"'\" + data[key].replace(/'/g, \"\\\\'\").replace(/\\n/g, \"<br>\").replace(/\\r/g, \"\") + \"'\" : (typeof data[key] === \"object\" ? JSON.stringify(data[key]) : data[key])) + \";\"\n }\n return eval(varString + expression)\n } catch (e) {\n console.log(varString + expression);\n console.error(e);\n return \"Error\"\n }\n}","\nimport React, { useEffect, createContext, useState } from \"react\";\nimport axios from \"axios\";\n\nconst ConfigContext = createContext(null);\n\nconst ConfigProvider = (props) => {\n const [config, setConfig] = useState(null);\n\n useEffect(() => {\n axios.get(\"/config\").then(response => {\n const _config = eval('(' + response.data.config + ')')\n setConfig(_config)\n\n if (_config.googleMapsKey) {\n const script = document.createElement('script');\n script.src = \"https://maps.googleapis.com/maps/api/js?key=\" + _config.googleMapsKey + \"&libraries=places,autocomplete\";\n document.body.appendChild(script);\n return () => {\n document.body.removeChild(script);\n }\n }\n })\n }, []);\n\n return config ? (\n <ConfigContext.Provider value={config} >\n {props.children}\n </ConfigContext.Provider >\n ) : null\n};\n\nexport { ConfigContext, ConfigProvider };","\nimport { useContext } from \"react\";\nimport {\n Link,\n useHistory,\n useLocation\n} from \"react-router-dom\";\nimport { ConfigContext } from '../contexts/ConfigContext'\n\nconst SidebarItemIconAndLabel = ({ view }) => (\n <>\n <div class=\"sidebarIcon\">\n <i class={`fas fa-${view.icon || \"square\"}`}></i>\n </div>\n <div class=\"sidebarLabel\">{view.label}</div>\n </>\n)\n\nexport default () => {\n const location = useLocation();\n const config = useContext(ConfigContext)\n const history = useHistory();\n\n return (\n <div class=\"sidebar\">\n {config.logo ? <img src={config.logo} class=\"logo\" /> : null}\n <div class=\"sidebarTitle\">{config.name}</div>\n <div class=\"sidebarSubtitle\">Back-office</div>\n {config.views.filter(view => !view.hidden).map((view, i) => {\n if (view.type === \"link\") {\n return (\n <a href={view.src} key={i}>\n <div class=\"sidebarItem\">\n <div>\n <SidebarItemIconAndLabel view={view} />\n </div>\n </div>\n </a>\n )\n } else if (view.type === \"iframe\") {\n const isActive = location.pathname === `/iframe/${i}`\n return (\n <Link to={`/iframe/${i}`} key={i}>\n <div class={`sidebarItem ${isActive ? \"active\" : \"\"}`}>\n <div>\n <SidebarItemIconAndLabel view={view} />\n </div>\n </div>\n </Link>\n )\n } else if (view.type === \"custom\") {\n const isActive = location.pathname === `/customView/${i}`\n return (\n <Link to={`/customView/${i}`} key={i}>\n <div class={`sidebarItem ${isActive ? \"active\" : \"\"}`}>\n <div>\n <SidebarItemIconAndLabel view={view} />\n </div>\n </div>\n </Link>\n )\n } else if (view.type === \"table\") {\n // TODO: bug quand la vue 10 est sélectionnée, la 1 aussi\n const isActive =\n location.pathname.startsWith(`/records/${i}`) ||\n location.pathname === `/createRecord/${i}` ||\n location.pathname.startsWith(`/record/${i}`) ||\n location.pathname.startsWith(`/editRecord/${i}`)\n return (\n <div onClick={() => history.push(`/records/${i}`)}>\n <div class={`sidebarItem ${isActive ? \"active\" : \"\"}`} key={i}>\n <div>\n <div class=\"notificationWrapper\"></div>\n <SidebarItemIconAndLabel view={view} />\n </div>\n {view.subviews ? (\n <>\n <div class=\"subviewsSeparator\"></div>\n {view.subviews.map((subview, j) => {\n const isActive = location.pathname == `/records/${i}/${j}`\n return (\n <div onClick={(e) => {\n history.push(`/records/${i}/${j}`);\n e.stopPropagation();\n }}>\n <div data-subview-index={j} class={isActive ? \"active\" : \"\"}>\n <div class=\"notificationWrapperForSubview\"></div>\n {subview.label}\n </div>\n </div>\n )\n })}\n </>\n ) : null}\n </div>\n </div>\n )\n }\n })}\n {!config.hideBranding ? (\n <div class=\"sidebarBranding\">Made with <i class=\"fas fa-heart\"></i> by Galadrim</div>\n ) : null}\n </div>\n )\n}","import { useContext } from \"react\"\nimport {\n\tRedirect\n} from \"react-router-dom\";\nimport { ConfigContext } from '../contexts/ConfigContext'\n\nexport default () => {\n\tconst config = useContext(ConfigContext)\n\tconst firstView = config.views[0]\n\n\tif (!firstView) {\n\t\treturn null\n\t}\n\tif (firstView.type === \"table\") {\n\t\treturn <Redirect to=\"/records/0\" />\n\t}\n\tif (firstView.type === \"iframe\") {\n\t\treturn <Redirect to=\"/iframe/0\" />\n\t}\n\tif (firstView.type === \"custom\") {\n\t\treturn <Redirect to=\"/customView/0\" />\n\t}\n\treturn null;\n}","import { useEffect, useRef } from \"react\";\n\nexport default ({ column, onChange, initialData }) => {\n const colorPicker = useRef(null);\n\n useEffect(() => {\n if (colorPicker.current) {\n window.$(colorPicker.current).spectrum({\n preferredFormat: \"hex\",\n showInput: true,\n chooseText: \"OK\",\n cancelText: \"Annuler\",\n color: initialData?.[column.name]\n });\n window.$(colorPicker.current).on(\"change.spectrum\", (_, value) => {\n onChange({ [column.name]: value.toHexString() })\n })\n }\n return () => window.$(colorPicker.current).off()\n }, [colorPicker.current])\n\n return (\n <input\n ref={colorPicker}\n type='text'\n onChange={(e) => onChange({ [column.name]: e.target.value })}\n />\n );\n}","import { useEffect, useRef } from \"react\";\n\nwindow.Quill.prototype.getHTML = function () {\n return this.container.querySelector('.ql-editor').innerHTML;\n};\n\nexport default ({ column, onChange, initialData }) => {\n const quillContainer = useRef(null);\n\n useEffect(() => {\n if (quillContainer.current && !quillContainer.current.editor) {\n const editor = new window.Quill(quillContainer.current, {\n theme: 'snow',\n modules: {\n toolbar: [\n [{\n 'header': [1, 2, 3, false]\n }],\n ['bold', 'italic', 'underline', 'link'],\n ['image'],\n [{\n 'align': []\n }],\n [{\n 'list': 'ordered'\n }, {\n 'list': 'bullet'\n }],\n ['clean']\n ]\n }\n });\n if (initialData?.[column.contentField]) {\n try {\n editor.setContents(JSON.parse(initialData?.[column.contentField]))\n } catch (e) { }\n }\n editor.on('text-change', () => {\n onChange({\n [column.htmlField]: editor.getHTML(),\n [column.contentField]: JSON.stringify(editor.getContents())\n })\n });\n quillContainer.current.editor = editor\n return editor.off();\n }\n }, [quillContainer.current])\n\n\n return (\n <div class='quillContainer'>\n <div class=\"quill\" ref={quillContainer} style={column.height ? { height: column.height } : null} />\n </div>\n )\n}","import { useEffect, useRef } from \"react\";\n\nexport default ({ column, onChange, initialData, withTime }) => {\n const datepicker = useRef(null);\n\n useEffect(() => {\n if (datepicker.current) {\n const datepickerEl = window.$(datepicker.current).datepicker({\n language: \"fr\",\n autoClose: true,\n onSelect: (_, date) => {\n onChange({ [column.name]: window.moment(date).format(withTime ? null : \"YYYY-MM-DD\") })\n }\n })\n if (initialData?.[column.name]) {\n datepickerEl.data(\"datepicker\").selectDate(new Date(initialData?.[column.name]))\n }\n }\n }, [datepicker.current])\n\n return (\n <div>\n <input type='text' ref={datepicker} data-timepicker={withTime ? \"true\" : \"false\"} />\n </div>\n )\n}","import { useEffect, useRef } from \"react\";\n\nexport default ({ column, onChange, initialData }) => {\n const googleMapsInput = useRef(null);\n\n useEffect(() => {\n if (googleMapsInput.current && window.google) {\n const autocomplete = new window.google.maps.places.Autocomplete(\n googleMapsInput.current,\n column.componentRestrictions ? {\n componentRestrictions: column.componentRestrictions\n } : {}\n )\n autocomplete.addListener('place_changed', () => {\n const place = autocomplete.getPlace();\n if (place.length === 0) {\n return;\n }\n if (!place.geometry) {\n return;\n } else {\n const fieldValues = {\n latitudeField: (place) => place.geometry.location.lat(),\n longitudeField: (place) => place.geometry.location.lng(),\n addressField: (place) => place.formatted_address,\n streetNumberField: (place) => place.address_components.find(x => x.type === \"street_number\")?.long_name,\n routeField: (place) => place.address_components.find(x => x.type === \"route\")?.long_name,\n localityField: (place) => place.address_components.find(x => x.type === \"locality\")?.long_name,\n administrativeAreaLevel2Field: (place) => place.address_components.find(x => x.type === \"administrative_area_level_2\")?.long_name,\n administrativeAreaLevel1Field: (place) => place.address_components.find(x => x.type === \"administrative_area_level_1\")?.long_name,\n countryField: (place) => place.address_components.find(x => x.type === \"country\")?.long_name,\n postalCodeField: (place) => place.address_components.find(x => x.type === \"postal_code\")?.long_name\n }\n const placeData = {}\n for (const key in fieldValues) {\n if (column[key]) {\n placeData[column[key]] = fieldValues[key](place)\n }\n }\n googleMapsInput.current.value = place.formatted_address\n onChange(placeData);\n }\n });\n }\n }, [googleMapsInput.current]);\n\n useEffect(() => {\n const setInputValue = () => {\n if (googleMapsInput.current) {\n googleMapsInput.current.value = \"\"\n }\n }\n googleMapsInput?.current?.addEventListener(\"focusout\", setInputValue)\n return () => googleMapsInput?.current?.removeEventListener(\"focusout\", setInputValue)\n }, [googleMapsInput.current])\n\n return (\n <div>\n <input\n type='text'\n placeholder=''\n ref={googleMapsInput}\n defaultValue={initialData?.[column.name]}\n />\n </div>\n )\n}","import { useRef, useState } from \"react\";\nimport axios from \"axios\";\n\nexport default ({ column, onChange, initialData }) => {\n const form = useRef(null);\n const [isLoading, setIsLoading] = useState(false)\n const [path, setPath] = useState(initialData?.[column.name])\n\n const onInputChange = async () => {\n const f = new FormData(form.current);\n setIsLoading(true);\n\n const response = await axios({\n method: \"post\",\n url: `/uploadFile`,\n data: f,\n params: {\n subdirectory: column.subdirectory,\n publicPath: column.publicPath,\n s3Config: column.s3Config\n },\n headers: { \"Content-Type\": \"multipart/form-data\" }\n })\n const fileData = {\n [column.name]: response.data.path\n }\n if (column.aspectRatioField) {\n fileData[column.aspectRatioField] = response.data.aspectRatio\n }\n if (column.originalNameField) {\n fileData[column.originalNameField] = response.data.originalFilename\n }\n onChange(fileData)\n setIsLoading(false)\n setPath(response.data.path)\n // var showAsPicture = $(this).data(\"showAsPicture\") === 1\n //var baseUrl = $(\".fileInputContent[data-input-id='\" + inputId + \"']\").data(\"baseUrl\")\n //$(\".fileInputContent[data-input-id='\" + inputId + \"']\").removeClass(\"clickToSelectFile\").html(showAsPicture ? \"<div><img src='https://res.cloudinary.com/forest2/image/fetch/w_600,h_300,c_fit/\" + baseUrl + data.path + \"' /><div class='deleteFile'><i class='fal fa-trash-alt'></i></div></div>\" : \"<div class='nonImageFileOutput'><span>Fichier téléchargé</span><div class='deleteFile'><i class='fal fa-trash-alt'></i></div></div>\"\n }\n\n const deleteFile = (e) => {\n setPath(null);\n const fileData = {\n [column.name]: null\n }\n if (column.aspectRatioField) {\n fileData[column.aspectRatioField] = null\n }\n if (column.originalNameField) {\n fileData[column.originalNameField] = null\n }\n onChange(fileData)\n e.preventDefault()\n }\n\n var id = Math.random().toString()\n return (\n <div class='fileInputContainer'>\n <label htmlFor={id}>\n <form ref={form}>\n <input type='file' id={id} style={{ display: \"none\" }} name='file' onChange={onInputChange} />\n </form>\n <div class={`fileInputContent ${!path ? \"clickToSelectFile\" : \"\"}`}>\n {isLoading ?\n <i class='fa fa-circle-notch fa-spin'></i>\n : null\n }\n {!isLoading && !path ?\n <div>Cliquez pour sélectionner un fichier</div>\n : null}\n {!isLoading && path ? (\n <div class='nonImageFileOutput'>\n <span>Fichier téléchargé</span>\n <div class='deleteFile' onClick={deleteFile}><i class='fal fa-trash-alt'></i></div>\n </div>\n ) : null}\n </div>\n </label>\n </div>\n )\n}\n","import axios from \"axios\";\nimport { useEffect, useState } from \"react\"\nimport {\n useParams\n} from \"react-router-dom\";\n\nexport default ({ column, onChange, initialData }) => {\n const [options, setOptions] = useState(null)\n const { viewIndex } = useParams();\n\n useEffect(() => {\n axios.post(\"/foreignSelectRecords\", {\n viewIndex,\n columnId: column.__id__\n }).then((response) => {\n setOptions(response.data)\n onChange({ \n [column.name]: initialData?.[column.name] || (column.optional ? \"NULL\" : response.data[0]?.value) \n }, {\n label: column.optional ? \"-\" : response.data[0]?.label\n })\n })\n }, [])\n\n return options === null ? (\n <i class='fa fa-circle-notch fa-spin' style={{ color: \"#536579\" }}></i>\n ) : (\n <select\n onChange={(e) => onChange({ \n [column.name]: e.target.value \n }, {\n label: options.find(x => x.value == e.target.value)?.label\n })}\n defaultValue={initialData?.[column.name]}\n >\n {column.optional ? <option value='NULL'>-</option> : null}\n {options.map((option) => {\n return (\n <option value={option.value} key={option.value}>\n {option.label}\n </option>\n )\n })}\n </select>\n );\n}\n","import axios from \"axios\";\nimport { useEffect, useRef, useState } from \"react\"\nimport {\n useParams\n} from \"react-router-dom\";\n\nexport default ({ column, onChange, initialData }) => {\n const [options, setOptions] = useState([])\n const { viewIndex } = useParams();\n const [query, setQuery] = useState(\"\")\n const input = useRef(null)\n const isInputValid = useRef(false)\n\n useEffect(() => {\n axios.post(\"/foreignSelectRecords\", {\n viewIndex,\n columnId: column.__id__,\n query\n }).then((response) => {\n setOptions(response.data)\n })\n }, [query])\n\n useEffect(() => {\n const setInputValue = () => {\n if (input.current && !isInputValid.current) {\n input.current.value = \"\"\n }\n }\n input?.current?.addEventListener(\"focusout\", setInputValue)\n return () => input?.current?.removeEventListener(\"focusout\", setInputValue)\n }, [input.current])\n\n const id = Math.random();\n\n return options === null ? (\n <i class='fa fa-circle-notch fa-spin' style={{ color: \"#536579\" }}></i>\n ) : (\n <div>\n <input\n type='text'\n list={id}\n ref={input}\n onChange={(e) => {\n const value = options.find(x => x.label === e.target.value)?.value ?? null;\n isInputValid.current = !!value\n setQuery(e.target.value);\n onChange({ [column.name]: value })\n }}\n defaultValue={options.find(x => x.value === initialData?.[column.name])?.label}\n />\n <datalist id={id}>\n {column.optional ? <option value='NULL'>-</option> : null}\n {options.map((option) => {\n return (\n <option value={option.label} key={option.value}>\n {option.label}\n </option>\n )\n })}\n </datalist>\n </div>\n );\n}","import ColorInput from \"./inputs/ColorInput\"\nimport RichTextInput from \"./inputs/RichTextInput\";\nimport DatetimeInput from \"./inputs/DatetimeInput\";\nimport AddressInput from \"./inputs/AddressInput\";\nimport FileInput from \"./inputs/FileInput\";\nimport ForeignSelectInput from \"./inputs/ForeignSelectInput\";\nimport ForeignDatalistInput from \"./inputs/ForeignDatalistInput\";\n\nexport default ({ column, onChange, initialData }) => {\n const { dataType } = column;\n\n if ([\"int\", \"double\", \"float\", \"decimal\"].includes(dataType)) {\n return (\n <input\n type='number'\n onChange={(e) => onChange({ [column.name]: e.target.value })}\n defaultValue={initialData?.[column.name]}\n />\n );\n } else if (dataType === \"tinyint\") {\n return (\n <select\n onChange={(e) => onChange({ [column.name]: e.target.value })}\n defaultValue={initialData?.[column.name]}\n >\n {column.optional ? <option value='NULL'>-</option> : null}\n <option value='0'>Non</option>\n <option value='1'>Oui</option>\n </select>\n );\n } else if (dataType === \"select\" && Array.isArray(column.options)) {\n return (\n <select\n onChange={(e) => onChange({ [column.name]: e.target.value })}\n defaultValue={initialData?.[column.name]}\n >\n {column.optional ? <option value='NULL'>-</option> : null}\n {column.options.map(option => <option value={option} key={option}>{option}</option>)}\n </select>\n );\n } else if (dataType === \"select\") {\n return (\n <select\n onChange={(e) => onChange({ [column.name]: e.target.value })}\n defaultValue={initialData?.[column.name]}\n >\n {column.optional ? <option value='NULL'>-</option> : null}\n {Object.keys(column.options).map(key => <option value={key} key={key}>{column.options[key]}</option>)}\n </select>\n );\n } else if (dataType === \"datalist\") {\n return (\n <ForeignDatalistInput\n column={column}\n onChange={onChange}\n initialData={initialData}\n />\n );\n } else if (dataType === \"foreign\") {\n return (\n <ForeignSelectInput\n column={column}\n onChange={onChange}\n initialData={initialData}\n />\n );\n } else if (dataType === \"address\") {\n return (\n <AddressInput\n column={column}\n onChange={onChange}\n initialData={initialData}\n />\n )\n } else if (dataType === \"color\") {\n return (\n <ColorInput\n column={column}\n onChange={onChange}\n initialData={initialData}\n />\n );\n } else if (dataType === \"file\") {\n return (\n <FileInput\n column={column}\n onChange={onChange}\n initialData={initialData}\n />\n );\n } else if (dataType === \"datetime\") {\n return (\n <DatetimeInput\n column={column}\n onChange={onChange}\n initialData={initialData}\n withTime={true}\n />\n );\n } else if (dataType === \"date\") {\n return (\n <DatetimeInput\n column={column}\n onChange={onChange}\n initialData={initialData}\n withTime={false}\n />\n );\n } else if (dataType === \"textarea\") {\n return (\n <textarea\n onChange={(e) => onChange({ [column.name]: e.target.value })}\n defaultValue={initialData?.[column.name]}\n >\n </textarea>\n );\n } else if (dataType === \"richText\") {\n return (\n <RichTextInput\n column={column}\n onChange={onChange}\n initialData={initialData}\n />\n );\n } else {\n return (\n <input\n type='text'\n onChange={(e) => onChange({ [column.name]: e.target.value })}\n defaultValue={initialData?.[column.name]}\n />\n );\n }\n};","import { useState } from \"react\";\n\nexport default ({ text }) => {\n const [visible, setVisible] = useState(false);\n return (\n <div class=\"labelTooltipContainer\" onMouseLeave={() => setVisible(false)}>\n <div class=\"labelTooltipIcon\" onMouseEnter={() => setVisible(true)}>\n <i class='fa fa-question-circle' />\n </div>\n {visible ? (\n <div class='tooltip'>\n {text}\n </div>\n ) : null}\n </div>\n )\n}","function isNotFilled(x) {\n return x === undefined || x === null || x === ''\n}\n\nexport default (columns, data) => {\n const requiredUnfilledColumns = columns.filter(column => column.required && isNotFilled(data[column.name]))\n if (requiredUnfilledColumns.length > 0) {\n let message;\n if (requiredUnfilledColumns.length == 1) {\n message = `Le champ requis ${requiredUnfilledColumns.map(x => x.label).join(\", \")} n'a pas été rempli`\n } else {\n message = `Les champs requis ${requiredUnfilledColumns.map(x => x.label).join(\", \")} n'ont pas été remplis`\n }\n window.swal({\n title: \"Erreur\",\n text: message,\n dangerMode: true\n })\n return false;\n }\n return true;\n}","import { useContext, useRef, useState } from \"react\";\nimport {\n useParams,\n useHistory\n} from \"react-router-dom\";\nimport axios from \"axios\";\nimport Input from \"../components/Input\"\nimport LabelTooltip from \"../components/LabelTooltip\"\nimport { ConfigContext } from '../contexts/ConfigContext'\nimport checkRequiredColumns from \"../utils/checkRequiredColumns\";\n\nexport default () => {\n const config = useContext(ConfigContext)\n const { viewIndex, panelIndex, recordId } = useParams();\n const history = useHistory();\n const view = config.views[viewIndex];\n const panel = panelIndex ? view.recordViewPanels[panelIndex] : null;\n const filteredColumns = panel ? panel.createConfig.columns : view.columns.filter(\n column => column.dataType &&\n (column.canEditOnCreation === true || column.canEdit !== false)\n && !column.hidden\n )\n\n const initialData = {}\n for (const column of filteredColumns) {\n if (column.dataType === \"tinyint\") {\n initialData[column.name] = column.optional ? \"NULL\" : \"0\"\n } else if (column.dataType === \"select\" && Array.isArray(column.options)) {\n initialData[column.name] = column.options[0]\n } else if (column.dataType === \"select\") {\n initialData[column.name] = Object.keys(column.options)[0]\n }\n if (column.defaultValue) {\n initialData[column.name] = column.defaultValue\n }\n }\n const data = useRef(initialData)\n const [isCreating, setIsCreating] = useState(false)\n\n const createRecord = async () => {\n if (!checkRequiredColumns(filteredColumns, data.current)) return;\n for (const key in view.createFilters) {\n data.current[key] = view.createFilters[key]\n }\n setIsCreating(true)\n try {\n const response = await axios.post(\"/createRecord\", {\n viewIndex,\n panelIndex,\n recordId,\n data: data.current\n })\n setIsCreating(false)\n if (recordId) { // Create from panel view\n history.push(`/record/${viewIndex}/${recordId}`)\n } else if (view?.createConfig?.redirectToCreatedItems) {\n history.push(`/record/${viewIndex}/${response.data.id}`)\n } else {\n history.push(`/records/${viewIndex}`)\n }\n } catch (error) {\n if (error.response.responseText) {\n window.swal({\n title: \"Erreur\",\n text: error.response.responseText,\n dangerMode: true\n })\n }\n setIsCreating(false)\n }\n }\n\n return (\n <div class=\"view\">\n <div class=\"viewHeader\">\n <div class=\"viewTitle\">{panel ? panel.createConfig.label : `Créer ${view.aNewSingular}`}</div>\n </div>\n <div class=\"paddedView\">\n <div class=\"form\">\n {filteredColumns.map((column, index) => {\n return (\n <div class='formElement' key={index}>\n <div class='formLabel'>\n {column.label} {column.required ? \"*\" : \"\"}\n {column.labelTooltip ? <LabelTooltip text={column.labelTooltip} /> : null}\n </div>\n <div class='formInput'>\n <Input\n column={column}\n onChange={(newValues) => { data.current = { ...data.current, ...newValues } }}\n />\n </div>\n </div>\n )\n })}\n </div>\n <div class={`button greenButton ${isCreating ? \"loading\" : \"\"}`} onClick={createRecord}>{isCreating ? \"Sauvegarde en cours...\" : \"Créer\"}</div>\n <div class=\"button\" onClick={() => history.goBack()}>Annuler</div>\n </div>\n </div>\n )\n}","import { useContext, useRef, useState, useEffect } from \"react\";\nimport {\n useParams,\n useHistory\n} from \"react-router-dom\";\nimport axios from \"axios\";\nimport Input from \"../components/Input\"\nimport LabelTooltip from \"../components/LabelTooltip\"\nimport { ConfigContext } from '../contexts/ConfigContext'\nimport checkRequiredColumns from \"../utils/checkRequiredColumns\";\n\nexport default () => {\n const config = useContext(ConfigContext)\n const { viewIndex, recordId } = useParams();\n const history = useHistory();\n const view = config.views[viewIndex];\n const [record, setRecord] = useState(null);\n const filteredColumns = view.columns.filter(\n column => column.dataType &&\n column.canEdit !== false &&\n !column.hidden\n )\n\n const dataToUpdate = useRef({})\n const [isUpdating, setIsUpdating] = useState(false)\n\n useEffect(() => {\n axios.get(\"/record\", {\n params: {\n viewIndex,\n recordId\n }\n }).then((response) => {\n dataToUpdate.current = {};\n setRecord(response.data);\n });\n }, [viewIndex, recordId]);\n\n const updateRecord = async () => {\n if (!checkRequiredColumns(filteredColumns, {...record, ...dataToUpdate.current})) return;\n setIsUpdating(true)\n try {\n await axios.post(\"/updateRecord\", {\n viewIndex,\n primaryValue: recordId,\n data: dataToUpdate.current,\n previousData: record\n })\n setIsUpdating(false)\n history.push(`/record/${viewIndex}/${recordId}`)\n } catch (error) {\n if (error.response.responseText) {\n window.swal({\n title: \"Erreur\",\n text: error.response.responseText,\n dangerMode: true\n })\n }\n setIsUpdating(false)\n }\n }\n\n return (\n <div class=\"view\">\n <div class=\"viewHeader\">\n <div class=\"viewTitle\">{view.label}</div>\n </div>\n <div class=\"paddedView\">\n {record ? (\n <>\n <div class=\"form\">\n {filteredColumns.map((column, index) => {\n return (\n <div class='formElement' key={index}>\n <div class='formLabel'>\n {column.label} {column.required ? \"*\" : \"\"}\n {column.labelTooltip ? <LabelTooltip text={column.labelTooltip} /> : null}\n </div>\n <div class='formInput'>\n <Input\n column={column}\n initialData={record}\n onChange={(newValues) => { dataToUpdate.current = { ...dataToUpdate.current, ...newValues } }}\n />\n </div>\n </div>\n )\n })}\n </div>\n <div class={`button greenButton ${isUpdating ? \"loading\" : \"\"}`} onClick={updateRecord}>{isUpdating ? \"Sauvegarde en cours...\" : \"Sauvegarder\"}</div>\n <div class=\"button\" onClick={() => history.goBack()}>Annuler</div>\n </>\n ) : null}\n </div>\n </div>\n )\n}","\nimport { useState } from \"react\"\nimport axios from \"axios\";\n\nexport default ({ view, viewIndex, subviewIndex, currentFilters, orderBy, isDesc, query }) => {\n const [isDownloading, setIsDownloading] = useState(false)\n\n const downloadRecords = () => {\n setIsDownloading(true)\n axios.post(\"/recordsExport\", {\n viewIndex,\n subviewIndex,\n filters: currentFilters.map(function (x) {\n return x.query\n }),\n orderBy,\n isDesc,\n query\n }).then((response) => {\n setIsDownloading(false)\n window.download(response.data.content, view.label + \".csv\");\n })\n }\n\n return (\n <div class=\"downloadButton\" onClick={downloadRecords}>\n <i class={`fa ${!isDownloading ? \"fa-cloud-download\" : \"fa-spin fa-circle-notch\"}`}></i>\n </div>\n )\n}","import { useEffect, useRef } from \"react\"\n\nfunction useOutsideClickHandler(ref, handler) {\n useEffect(() => {\n function handleClickOutside(event) {\n if (\n ref.current && \n !ref.current.contains(event.target) && \n !document.getElementById(\"datepickers-container\")?.contains(event.target)\n ) {\n handler()\n }\n }\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [ref]);\n}\n\nexport default function OutsideClickHandler(props) {\n const wrapperRef = useRef(null);\n useOutsideClickHandler(wrapperRef, props.onOutsideClick);\n\n return <div ref={wrapperRef}>{props.children}</div>;\n}","import { useEffect, useState, useRef } from \"react\"\nimport OutsideClickHandler from \"./OutsideClickHandler\"\nimport ForeignSelectInput from \"./inputs/ForeignSelectInput\"\nimport DatetimeInput from \"./inputs/DatetimeInput\"\n\nexport default ({ view, refreshData, onAddFilter }) => {\n const [filtersOpened, setFiltersOpened] = useState(false)\n const [field, setField] = useState(null);\n const [operator, setOperator] = useState(\"contains\")\n const [value, setValue] = useState(null)\n\n const foreignSelectedLabel = useRef(\"-\");\n\n const column = view.columns.find(c => (c.searchableName || c.name) === field)\n\n useEffect(() => {\n if (column?.dataType === 'select') {\n setValue(Array.isArray(column.options) ? column.options[0] : Object.keys(column.options)[0])\n }\n }, [field])\n\n const addFilter = () => {\n if (field && value) {\n const fieldLabel = column?.label\n const searchedField = `(${column?.searchableName || column?.name})`\n if (column?.dataType === 'select') {\n const formattedValue = !Array.isArray(column?.options) ? column.options[value] : value\n onAddFilter({\n label: fieldLabel + \" est \" + formattedValue,\n query: searchedField + \" = '\" + value + \"'\"\n })\n } else if (column?.dataType === 'foreign') {\n onAddFilter({\n label: fieldLabel + \" est \" + foreignSelectedLabel.current,\n query: column.name + \" = '\" + value + \"'\"\n })\n } else if (column?.dataType === 'date' || column?.dataType === 'datetime') {\n let label;\n const queryItems = []\n if (value.from && !value.to) {\n label = fieldLabel + \" est après \" + value.from\n } else if (value.to && !value.from) {\n label = fieldLabel + \" est avant \" + value.to\n } else {\n label = fieldLabel + \" de \" + value.from + \" à \" + value.to\n }\n if (value.from) {\n queryItems.push(column.name + \" >= '\" + value.from + \"'\")\n }\n if (value.to) {\n queryItems.push(column.name + \" <= '\" + value.to + \"'\")\n }\n onAddFilter({\n label,\n query: queryItems.join(\" AND \")\n })\n } else if (operator === \"contains\") {\n onAddFilter({\n label: fieldLabel + \" contient \" + value,\n query: searchedField + \" LIKE '%\" + value + \"%'\"\n })\n } else if (operator === \"notContains\") {\n onAddFilter({\n label: fieldLabel + \" ne contient pas \" + value,\n query: searchedField + \" NOT LIKE '%\" + value + \"%'\"\n })\n } else if (operator === \"is\") {\n onAddFilter({\n label: fieldLabel + \" est \" + value,\n query: searchedField + \" = '\" + value + \"'\"\n })\n } else if (operator === \"isNot\") {\n onAddFilter({\n label: fieldLabel + \" n'est pas \" + value,\n query: searchedField + \" != '\" + value + \"'\"\n })\n } else if (operator === \"startsWith\") {\n onAddFilter({\n label: fieldLabel + \" commence par \" + value,\n query: searchedField + \" LIKE '\" + value + \"%'\"\n })\n } else if (operator === \"endsWith\") {\n onAddFilter({\n label: fieldLabel + \" finit par \" + value,\n query: searchedField + \" LIKE '%\" + value + \"'\"\n })\n } else if (operator === \"largerThan\") {\n onAddFilter({\n label: fieldLabel + \" supérieur à \" + value,\n query: searchedField + \" >= \" + value\n })\n } else if (operator === \"smallerThan\") {\n onAddFilter({\n label: fieldLabel + \" inférieur à \" + value,\n query: searchedField + \" <= \" + value\n })\n }\n setField(null)\n setValue(null)\n setFiltersOpened(false)\n }\n }\n\n return (\n <OutsideClickHandler onOutsideClick={() => setFiltersOpened(false)}>\n <div class=\"button openFilterPopup\" onClick={() => setFiltersOpened(!filtersOpened)}>\n <i class=\"fas fa-filter\"></i> Ajouter un filtre\n {filtersOpened ? (\n <div class=\"addFilterPopup\" onClick={(e) => e.stopPropagation()}>\n <div class=\"filterLabel\">Champ</div>\n <select onChange={(e) => setField(e.target.value)}>\n <option value=''>Sélectionnez un champ</option>\n {view.columns.filter(_column =>\n (_column.searchableName || _column.name) && _column.dataType !== \"datalist\"\n ).map((_column) => {\n const value = _column.searchableName || _column.name\n return (\n <option value={value} key={value}>\n {_column.label}\n </option>\n )\n })}\n </select>\n {column?.dataType === 'select' ? (\n <>\n <div class=\"filterLabel\">Valeur</div>\n <select onChange={(e) => setValue(e.target.value)}>\n {Array.isArray(column.options) ? column.options.map(value => (\n <option value={value}>{value}</option>\n )) : Object.keys(column.options).map(value => (\n <option value={value}>{column.options[value]}</option>\n ))}\n </select>\n </>\n ) : column?.dataType === 'foreign' ? (\n <>\n <div class=\"filterLabel\">Valeur</div>\n <ForeignSelectInput \n column={column} \n onChange={(data, info) => {\n setValue(data[column.name])\n foreignSelectedLabel.current = info.label\n }}\n />\n </>\n ) : column?.dataType === 'date' || column?.dataType === 'datetime' ? (\n <>\n <div class=\"filterLabel\">De</div>\n <DatetimeInput column={column} withTime={true} onChange={(data) => {\n setValue({\n from: data[column.name],\n to: value?.to\n })\n }} />\n <div class=\"filterLabel\">À</div>\n <DatetimeInput column={column} withTime={true} onChange={(data) => {\n setValue({\n from: value?.from,\n to: data[column.name]\n })\n }} />\n </>\n ) : (\n <>\n <div class=\"filterLabel\">Opérateur</div>\n <select onChange={(e) => setOperator(e.target.value)}>\n <option value=\"contains\">contient</option>\n <option value=\"notContains\">ne contient pas</option>\n <option value=\"startsWith\">commence par</option>\n <option value=\"endsWith\">finit par</option>\n <option value=\"is\">est</option>\n <option value=\"isNot\">n'est pas</option>\n <option value=\"largerThan\">est supérieur à</option>\n <option value=\"smallerThan\">est inférieur à</option>\n </select>\n <div class=\"filterLabel\">Valeur</div>\n <input onChange={(e) => setValue(e.target.value)} />\n </>\n )}\n <div class=\"button greenButton\" onClick={addFilter}>Ajouter</div>\n </div>\n ) : null}\n </div>\n </OutsideClickHandler >\n )\n}","import { useContext, useState } from \"react\"\nimport axios from \"axios\";\nimport OutsideClickHandler from \"./OutsideClickHandler\"\nimport { ConfigContext } from '../contexts/ConfigContext'\n\nexport default ({ viewIndex, selectedRecordIds, refreshData }) => {\n const config = useContext(ConfigContext)\n const view = config.views[viewIndex]\n const [bulkActionsOpened, setBulkActionsOpened] = useState(false)\n\n const bulkDelete = () => {\n window.swal({\n title: \"Êtes-vous sûr ?\",\n text: \"Une fois la suppression confirmée, il ne sera pas possible de revenir en arrière.\",\n buttons: [\"Annuler\", \"Oui\"],\n dangerMode: true\n }).then((willDelete) => {\n if (willDelete) {\n axios.post(\"deleteRecords\", {\n viewIndex,\n primaryValues: selectedRecordIds\n }).then(function () {\n refreshData()\n }).catch(function () {\n window.swal({\n title: \"Erreur\",\n text: \"Suppression impossible\",\n dangerMode: true\n })\n });\n }\n });\n }\n\n const bulkCustomAction = (actionIndex) => () => {\n setBulkActionsOpened(false)\n axios.post(\"customAction\", {\n viewIndex,\n actionIndex,\n selectedRecordIds\n }).then(function (response) {\n if (response.data.message) {\n alert(response.data.message)\n }\n refreshData()\n }).catch(function () {\n window.swal({\n title: \"Erreur\",\n text: \"L'action a échoué\",\n dangerMode: true\n })\n });\n }\n\n return !config.hideMultiselect && (view.canDelete !== false || view.customActions?.length > 0) ? (\n <OutsideClickHandler onOutsideClick={() => setBulkActionsOpened(false)}>\n <div class=\"actionButtonsContainer\">\n <div class=\"button openBulkActionsButton\" onClick={() => setBulkActionsOpened(!bulkActionsOpened)}>Actions</div>\n {bulkActionsOpened ? <div class=\"bulkActions\">\n {view.customActions?.map((action, index) => (\n <div class=\"action recordAction\" onClick={bulkCustomAction(index)}>{action.label}</div>\n ))}\n {view.canDelete !== false ? <div class=\"action recordAction red\" onClick={bulkDelete}>Supprimer</div> : null}\n </div> : null}\n </div>\n </OutsideClickHandler>\n ) : null\n}","import evalExpression from \"./evalExpression\"\n\nexport default (column, record, onTable) => {\n if (column.showAsPicture) {\n const imageUrl = column.baseUrl + record[column.pathField];\n return record[column.pathField] ? (\n <a href={imageUrl} target='_blank'>\n <img src={imageUrl} style={{ width: onTable ? 60 : 300, height: onTable ? 30 : 150, objectFit: \"contain\" }} />\n </a>\n ) : null\n } else if (column.formatValue) {\n return <div dangerouslySetInnerHTML={{ __html: record[`__formatValue-${column.__id__}__`] }} />\n } else if (column.formattedValue) {\n return <div>{evalExpression(column.formattedValue, record)}</div>\n } else if (column.action) {\n if (column.actionDisplayCondition) {\n let isDisplaying = evalExpression(column.actionDisplayCondition, record)\n if (!isDisplaying)\n return \"\";\n }\n var data = JSON.parse(JSON.stringify(column.data));\n for (var key in data) {\n data[key] = evalExpression(data[key], record)\n }\n return (\n <div class='actionButton' data-route='\" + column.route + \"' data-data='\" + JSON.stringify(data) + \"'>{column.action}</div>\n )\n } else if (column.dataType === \"tinyint\") {\n return <div>{record[column.name] === 1 ? \"Oui\" : \"Non\"}</div>\n } else if (column.dataType === \"color\") {\n return <div class='colorPreview' style={{ backgroundColor: record[column.name] }}></div>\n } else if (column.dataType === \"richText\") {\n return <div dangerouslySetInnerHTML={{ __html: record[column.htmlField] }} />\n } else if (column.dataType === \"select\" && column.options && column.options.constructor == Object) {\n return <div>{column.options[record[column.name]]}</div>\n } else {\n return <div>{record[column.name]}</div>\n }\n}","import { useState, useEffect, useContext } from \"react\"\nimport axios from \"axios\";\nimport {\n Link,\n useParams,\n useHistory\n} from \"react-router-dom\";\nimport DownloadButton from \"../components/DownloadButton\"\nimport AddFilterButton from \"../components/AddFilterButton\"\nimport BulkActionsButton from \"../components/BulkActionsButton\"\nimport getFormattedValue from \"../utils/getFormattedValue\"\nimport { ConfigContext } from '../contexts/ConfigContext'\n\nlet _viewIndex = null;\nlet _page = 1;\nlet _currentFilters = [];\nlet _orderBy = null;\nlet _isDesc = null;\nlet _query = \"\";\n\nexport default () => {\n const { viewIndex, subviewIndex } = useParams();\n const history = useHistory();\n const [page, setPage] = useState(_page)\n const [currentFilters, setCurrentFilters] = useState(_currentFilters)\n const [orderBy, setOrderBy] = useState(_orderBy);\n const [isDesc, setIsDesc] = useState(_isDesc);\n const [query, setQuery] = useState(_query);\n const [selectedRecordIds, setSelectedRecordIds] = useState([])\n const [data, setData] = useState(null)\n const config = useContext(ConfigContext);\n const view = config.views[viewIndex]\n\n const filteredColumns = view.columns?.filter(x => !x.hideInTable && !x.hidden)\n\n useEffect(() => {\n if (viewIndex !== _viewIndex) {\n setPage(1)\n setQuery(null)\n setOrderBy(null)\n setIsDesc(null)\n setQuery(\"\")\n if (selectedRecordIds.length > 0) {\n setSelectedRecordIds([])\n }\n if (currentFilters.length > 0) {\n setCurrentFilters([])\n }\n }\n }, [viewIndex])\n\n\n useEffect(() => {\n refreshData()\n _viewIndex = viewIndex;\n _page = page;\n _query = query;\n _currentFilters = currentFilters;\n _orderBy = orderBy;\n _isDesc = isDesc;\n }, [viewIndex, subviewIndex, page, query, currentFilters, orderBy, isDesc])\n\n function refreshData() {\n setData(null)\n axios.post(\"/records\", {\n viewIndex,\n subviewIndex,\n page,\n filters: currentFilters.map(function (x) {\n return x.query\n }),\n orderBy,\n isDesc,\n query\n }).then((response) => {\n setData(response.data)\n })\n }\n\n return (\n <div class=\"view\">\n <div class=\"scrollable\">\n <div class=\"viewHeader\">\n <div class=\"viewTitle\">{view.label}</div>\n <div class=\"viewHeaderActions\">\n <div class=\"searchBarContainer\">\n <input type=\"text\" placeholder=\"Rechercher\" class=\"searchBar\" value={query} onChange={(e) => setQuery(e.target.value)} />\n <div class=\"searchBarIcon\">\n <i class=\"fa fa-search\"></i>\n </div>\n </div>\n <BulkActionsButton\n viewIndex={viewIndex}\n selectedRecordIds={selectedRecordIds}\n refreshData={refreshData}\n />\n <AddFilterButton\n view={view}\n refreshData={refreshData}\n onAddFilter={(filter) => setCurrentFilters([...currentFilters, filter])}\n />\n <DownloadButton\n view={view}\n viewIndex={viewIndex}\n subviewIndex={subviewIndex}\n currentFilters={currentFilters}\n orderBy={orderBy}\n isDesc={isDesc}\n query={query}\n />\n {view.canCreate ? (\n <Link to={`/createRecord/${viewIndex}`}>\n <div class=\"plusButton\"><i class=\"fa fa-plus\"></i></div>\n </Link>\n ) : null}\n </div>\n </div>\n {currentFilters.length > 0 ? (\n <div class=\"filtersContainer\">\n {currentFilters.map((filter, index) => (\n <div class='filterItem' key={index}>\n <div class='filterItemLabel'>{filter.label}</div>\n <div class=\"filterRemove\" onClick={() => {\n setCurrentFilters(currentFilters.filter(x => x.query !== filter.query))\n }}><i class='fa fa-times'></i></div>\n </div>\n ))}\n </div>\n ) : null}\n <table class=\"table\">\n <thead>\n <tr>\n {config.hideMultiselect ? null : <th></th>}\n {filteredColumns.map((column, index) => {\n const sortName = column.dataType === \"foreign\" || column.dataType === \"datalist\" ? column.formattedValue : column.sortName || column.name\n return (\n <th\n class={sortName ? \"sortable\" : \"\"}\n key={index}\n onClick={() => {\n if (sortName) {\n setOrderBy(sortName)\n setIsDesc(orderBy === sortName ? !isDesc : false)\n }\n }}\n >\n {column.label}\n {sortName ? (\n <div class='columnSortIcon'>\n <i class={`fas fa-sort${isDesc === true && sortName === orderBy ? \"-down\" : (isDesc === false && sortName === orderBy ? \"-up\" : \"\")}`}></i>\n </div>\n ) : null}\n </th>\n )\n })}\n\n </tr>\n </thead>\n <tbody>\n {!data ? Array.from({ length: 10 }).map((_, index) => (\n <tr class='record' key={index}>{\n Array.from({\n length: filteredColumns.length + (config.hideMultiselect ? 0 : 1)\n }).map((_, cellIndex) => (\n <td key={cellIndex}> </td>\n ))\n }</tr>\n )) : null}\n {data?.records?.map((record) => {\n const recordId = record[view.primaryId]\n return (\n <tr\n class={`record ${view.notClickable ? \"nonClickableRow\" : \"\"}`}\n onClick={(event) => {\n if (event.target.tagName == \"A\") {\n event.stopPropagation();\n return;\n }\n if (!view.notClickable) {\n if (view.clickToEdit) {\n history.push(`/editRecord/${viewIndex}/${recordId}`)\n } else {\n history.push(`/record/${viewIndex}/${recordId}`)\n }\n }\n }}\n key={recordId}\n >\n {config.hideMultiselect ? null : <td class='checkboxParent' onClick={(e) => {\n setSelectedRecordIds(selectedRecordIds.includes(recordId) ? selectedRecordIds.filter(x => x !== recordId) : [...selectedRecordIds, recordId])\n e.stopPropagation()\n }}><div class={`checkbox ${selectedRecordIds.includes(recordId) ? \"checked\" : \"\"}`}></div></td>}\n {filteredColumns.map((column, index) => (\n <td key={index}>{getFormattedValue(column, record, true)}</td>\n ))}\n </tr>\n )\n })}\n </tbody>\n\n </table>\n </div>\n <div class=\"tableFooter\">\n <div class=\"tableCounter\">{data?.count || \"-\"} {view.label}</div>\n <div class=\"paginator\">\n <div class=\"paginatorLeft\" onClick={() => setPage(Math.max(1, page - 1))}><i class=\"fas fa-caret-left\"></i></div>\n <div class=\"paginatorNumber\">{page} / {data && data.count ? Math.ceil(data.count / (view.limit || 10)) : \"-\"}</div>\n <div class=\"paginatorRight\" onClick={() => setPage(Math.min(page + 1, Math.ceil(data.count / (view.limit || 10))))}><i class=\"fas fa-caret-right\"></i></div>\n </div>\n </div>\n </div>\n )\n}","\nimport { useContext, useState } from \"react\"\nimport {\n useHistory\n} from \"react-router-dom\";\nimport axios from \"axios\";\nimport OutsideClickHandler from \"./OutsideClickHandler\"\nimport { ConfigContext } from \"../contexts/ConfigContext\";\n\nexport default ({ viewIndex, record, refreshData }) => {\n const config = useContext(ConfigContext)\n const view = config.views[viewIndex]\n const [actionsOpened, setActionsOpened] = useState(false)\n const history = useHistory()\n\n const deleteRecord = async () => {\n const willDelete = await window.swal({\n title: \"Êtes-vous sûr ?\",\n text: \"Une fois la suppression confirmée, il ne sera pas possible de revenir en arrière.\",\n buttons: [\"Annuler\", \"Oui\"],\n dangerMode: true\n })\n if (willDelete) {\n if (view.deleteCallback) {\n axios.post(view.deleteCallback, {\n id: record[view.primaryId],\n data: record\n })\n }\n try {\n await axios.post(\"/deleteRecord\", {\n viewIndex,\n primaryValue: record[view.primaryId]\n })\n history.push(`/records/${viewIndex}`)\n } catch (e) {\n window.swal({\n title: \"Erreur\",\n text: \"Suppression impossible\",\n dangerMode: true\n })\n }\n }\n }\n\n const customAction = (actionIndex) => () => {\n setActionsOpened(false)\n axios.post(\"customAction\", {\n viewIndex,\n actionIndex,\n selectedRecordIds: [record[view.primaryId]]\n }).then(function (response) {\n if (response.data.message) {\n alert(response.data.message)\n }\n refreshData()\n }).catch(function () {\n window.swal({\n title: \"Erreur\",\n text: \"L'action a échoué\",\n dangerMode: true\n })\n });\n }\n\n return (\n (view.canDuplicate === true) || (view.canDelete !== false) || (view.customActions?.length > 0) ? (\n <OutsideClickHandler onOutsideClick={() => setActionsOpened(false)}>\n <div class=\"actionButtonsContainer\">\n <div class=\"button openActionsButton\" onClick={() => setActionsOpened(!actionsOpened)}>Actions</div>\n {actionsOpened ? (\n <div class=\"actions\">\n {view.customActions?.map((action, index) => (\n <div class=\"action recordAction\" onClick={customAction(index)}>{action.label}</div>\n ))}\n {view.canDuplicate === true ? <div class=\"action recordAction duplicateRecord\">Dupliquer</div> : null}\n {view.canDelete !== false ? <div class=\"action recordAction red\" onClick={deleteRecord}>Supprimer</div> : null}\n </div>\n ) : null}\n </div>\n </OutsideClickHandler>\n ) : null\n\n )\n}","\nimport {\n useHistory\n} from \"react-router-dom\";\n\nexport default () => {\n const history = useHistory();\n\n return (\n <div class=\"button backButton\" onClick={() => history.goBack()}>Retour</div>\n );\n}","import axios from \"axios\";\nimport evalExpression from \"../utils/evalExpression\";\n\nexport default ({ record, panel }) => {\n const downloadTable = () => {\n axios.get(\"/customQuery\", {\n params: {\n query: panel.query || evalExpression(panel.formattedQuery, record),\n primaryValue: 2630\n }\n }).then((response) => {\n const results = response.data;\n const lines = [];\n lines.push(Object.keys(results[0]).filter(key => key !== panel.primaryId).join(\",\"))\n for (let result of results) {\n lines.push(\n Object.keys(result).filter(key => key !== panel.primaryId).map((key) =>\n (panel.formattedValues && (key in panel.formattedValues)) ? evalExpression(panel.formattedValues[key], result) : result[key]\n ).join(\",\")\n )\n }\n\n window.download(lines.join(\"\\r\\n\"), panel.label + \".csv\");\n })\n }\n\n return (<div class='downloadPanelButton' onClick={downloadTable}><i class='fa fa-cloud-download'></i></div>)\n}","import { useState, useEffect, useContext } from \"react\"\nimport axios from \"axios\";\nimport evalExpression from \"../../utils/evalExpression\";\nimport {\n useHistory,\n useParams\n} from \"react-router-dom\";\nimport { ConfigContext } from \"../../contexts/ConfigContext\";\n\nexport default ({ panel, record, view }) => {\n const [results, setResults] = useState(null);\n const history = useHistory();\n const { viewIndex } = useParams();\n const config = useContext(ConfigContext)\n\n useEffect(() => {\n refreshData()\n }, [record])\n\n const refreshData = () => {\n axios.get(\"/customQuery\", {\n params: {\n query: panel.query || evalExpression(panel.formattedQuery, record),\n primaryValue: record[view.primaryId]\n }\n }).then((response) => {\n setResults(response.data)\n })\n }\n\n const deleteRow = async (row) => {\n const willDelete = await window.swal({\n title: \"Êtes-vous sûr ?\",\n text: \"Une fois la suppression confirmée, il ne sera pas possible de revenir en arrière.\",\n buttons: [\"Annuler\", \"Oui\"],\n dangerMode: true\n })\n if (willDelete) {\n try {\n await axios.post(\"/deleteRecordFromPanel\", {\n viewIndex,\n panelId: panel.__id__,\n primaryValue: row[panel.primaryId]\n })\n refreshData();\n } catch (e) {\n window.swal({\n title: \"Erreur\",\n text: \"Suppression impossible\",\n dangerMode: true\n })\n }\n }\n }\n\n return (\n <div>\n {results?.length > 0 ? (\n <table class={`table panelTable ${panel.folded ? \"folded\" : \"\"}`}>\n <thead>\n <tr>\n {Object.keys(results[0]).filter(key => key !== panel.primaryId).map((key) =>\n <th key={key}>{key}</th>\n )}\n {panel.canDelete ? <th></th> : null}\n </tr>\n </thead>\n <tbody>\n {results.map((result) => (\n <tr\n class={`record ${panel.canShow ? \"\" : \"nonClickableRow\"}`}\n onClick={() => {\n const viewIndex = config.views.findIndex(x => x.type === \"table\" && x.tableName === panel.tableName)\n if (panel.canShow) {\n history.push(`/record/${viewIndex}/${result[panel.primaryId]}`)\n }\n }}\n >\n {Object.keys(result).filter(key => key !== panel.primaryId).map((key) =>\n <td key={key}>\n <div\n dangerouslySetInnerHTML={{\n __html:\n (panel.formattedValues && (key in panel.formattedValues)) ?\n evalExpression(panel.formattedValues[key], result) :\n result[key]\n }}\n />\n </td>\n )}\n {panel.canDelete ? (\n <td class='deleteIconCell'>\n <div\n class='deleteIcon'\n onClick={(e) => {deleteRow(result); e.stopPropagation()}}\n >\n <i class='fa fa-minus'></i>\n </div>\n </td>\n ) : null}\n </tr>\n ))}\n </tbody>\n </table>\n ) : results?.length === 0 ? (\n <div class={`noData panelTable ${panel.folded ? \"folded\" : \"\"}`}>Aucune donnée</div>\n ) : null}\n </div>\n )\n}\n","import { useState, useEffect } from \"react\"\nimport {\n useHistory,\n useParams\n} from \"react-router-dom\";\nimport axios from \"axios\";\n\nexport default ({ panel, record, view }) => {\n const [results, setResults] = useState(null);\n const history = useHistory();\n const { viewIndex } = useParams();\n\n useEffect(() => {\n refreshData()\n }, [panel.query, record])\n\n const refreshData = () => {\n axios.get(\"/customQuery\", {\n params: {\n query: panel.query,\n primaryValue: record[view.primaryId]\n }\n }).then((response) => {\n setResults(response.data)\n })\n }\n const deleteRow = async (row) => {\n const willDelete = await window.swal({\n title: \"Êtes-vous sûr ?\",\n text: \"Une fois la suppression confirmée, il ne sera pas possible de revenir en arrière.\",\n buttons: [\"Annuler\", \"Oui\"],\n dangerMode: true\n })\n if (willDelete) {\n try {\n await axios.post(\"/deleteRecordFromPanel\", {\n viewIndex,\n panelId: panel.__id__,\n primaryValue: row[panel.primaryId]\n })\n refreshData();\n } catch (e) {\n window.swal({\n title: \"Erreur\",\n text: \"Suppression impossible\",\n dangerMode: true\n })\n }\n }\n }\n\n const pathField = panel.pathField || \"Path\"\n\n return (\n <div>\n {results?.length > 0 ? (\n <div class=\"gallery\">\n {results.map((result) => (\n <div class='galleryPicture' key={result[pathField]}>\n {panel.canDelete ? <div class='deleteIcon' onClick={(e) => {deleteRow(result); e.stopPropagation()}}><i class='fa fa-minus'></i></div> : null}\n <a href={panel.baseUrl + result[pathField]} target='_blank'>\n <img\n src={panel.baseUrl + result[pathField]}\n style={{ width: \"100%\", height: 150, objectFit: panel.objectFit || \"cover\" }}\n onerror='this.style.height = 0'\n />\n </a>\n </div>\n ))}\n </div>\n ) : results?.length === 0 ? (\n <div class={`noData panelTable ${panel.folded ? \"folded\" : \"\"}`}>Aucune donnée</div>\n ) : null}\n </div>\n )\n}\n","import { useEffect, useRef } from \"react\"\nimport axios from \"axios\";\n\nexport default ({ panel, record, view }) => {\n const mapRef = useRef();\n\n useEffect(() => {\n if (window.google && record) {\n if (panel.query) {\n axios.get(\"/customQuery\", {\n query: panel.query,\n primaryValue: record[view.primaryId]\n }).then((response) => {\n const result = response?.data?.[0]\n if (result) {\n initMap(result.Lat, result.Lng, panel.zoom || 12)\n }\n })\n } else {\n initMap(record[panel.latitudeField], record[panel.longitudeField], panel.zoom || 12)\n }\n }\n }, [record, window.google])\n\n const initMap = (lat, lng, zoom) => {\n const map = new window.google.maps.Map(mapRef.current, {\n zoom,\n center: {\n lat,\n lng\n }\n });\n new window.google.maps.Marker({\n position: { lat, lng },\n map\n });\n }\n\n return (\n <div class='map' ref={mapRef}></div>\n )\n}","import { useState, useEffect, useContext } from \"react\"\nimport axios from \"axios\";\nimport {\n useParams,\n Link,\n} from \"react-router-dom\";\nimport getFormattedValue from \"../utils/getFormattedValue\"\nimport ActionsButton from \"../components/ActionsButton\"\nimport BackButton from \"../components/BackButton\"\nimport DownloadTablePanelButton from \"../components/DownloadTablePanelButton\"\nimport TablePanel from \"../components/panels/TablePanel\"\nimport GalleryPanel from \"../components/panels/GalleryPanel\"\nimport MapPanel from \"../components/panels/MapPanel\"\nimport { ConfigContext } from '../contexts/ConfigContext'\n\nexport default () => {\n const config = useContext(ConfigContext)\n const { viewIndex, recordId } = useParams();\n const [record, setRecord] = useState(null);\n\n const view = config.views[viewIndex]\n const filteredColumns = view.columns?.filter(x => !x.hidden)\n\n useEffect(() => {\n refreshData()\n }, [viewIndex, recordId]);\n\n const refreshData = () => {\n axios.get(\"/record\", {\n params: {\n viewIndex,\n recordId\n }\n }).then((response) => {\n setRecord(response.data);\n });\n }\n\n return (\n <div class=\"view backgroundBlue\">\n <div class=\"viewHeader\">\n <div class=\"viewTitle\">{view.label}</div>\n <div class=\"viewHeaderActions\">\n <BackButton />\n <ActionsButton viewIndex={viewIndex} record={record} refreshData={refreshData} />\n {view.canEdit !== false ? (\n <Link to={`/editRecord/${viewIndex}/${recordId}`}>\n <div class=\"button greenButton recordAction\">Modifier</div>\n </Link>\n ) : null}\n </div>\n </div>\n <div class=\"paddedView\">\n <div class=\"showContainer\">\n <div class='panel detailsPanel'>\n <div class='panelTitle'>Détails</div>\n {record ?\n filteredColumns.map((column, index) => (\n <div class='showRecordField' key={index}>\n <div class='formLabel'>{column.label}</div>\n <div class='formValue'>{getFormattedValue(column, record, false) || \"-\"}</div>\n </div>\n ))\n : null}\n </div>\n {view.recordViewPanels && record ? (\n <div class='recordViewPanels'>\n {view.recordViewPanels.map((panel, index) => (\n <div class='panel' key={index}>\n <div class='panelHeader'>\n <div class='viewTitle'>{panel.label}</div>\n <div class='viewHeaderActions'>\n {panel.folded ? <div class='button smallButton unfoldPanel'>Afficher</div> : null}\n {panel.canCreate ? <Link to={`/createRecord/${viewIndex}/${index}/${recordId}`}><div class='plusButton'><i class='fa fa-plus'></i></div></Link> : null}\n {panel.canDownload && panel.type === \"table\" ? <DownloadTablePanelButton record={record} panel={panel} /> : null}\n </div>\n </div>\n {panel.type === \"table\" ? <TablePanel record={record} panel={panel} view={view} /> : null}\n {panel.type === \"gallery\" ? <GalleryPanel record={record} panel={panel} view={view} /> : null}\n {panel.type === \"map\" ? <MapPanel record={record} panel={panel} view={view} /> : null}\n </div>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n )\n}\n","export default __webpack_public_path__ + \"static/media/logo.e407b9ca.png\";","import axios from \"axios\";\nimport { useState } from \"react\";\nimport logo from \"../images/logo.png\"\n\nexport default ({ setIsAuthenticated }) => {\n const [username, setUsername] = useState(\"\")\n const [password, setPassword] = useState(\"\")\n\n const login = async () => {\n const response = await axios.post(\"/login\", {\n username,\n password\n });\n if (response.data.success) {\n setIsAuthenticated(true)\n }\n }\n\n return (\n <div class=\"loginPanelBackground\">\n <div class=\"loginPanel\">\n <div class=\"loginLogoContainer\">\n <img class=\"loginLogo\" src={logo} />\n </div>\n <label>Nom d'utilisateur</label>\n <input type=\"text\" name=\"username\" onChange={(e) => setUsername(e.target.value)} />\n <label>Mot de passe</label>\n <input type=\"password\" name=\"password\" onChange={(e) => setPassword(e.target.value)} />\n <button class=\"button greenButton fullWidth\" onClick={login}>Se connecter</button>\n </div>\n </div>\n )\n}","\n\nimport { useContext } from \"react\";\nimport {\n useParams\n} from \"react-router-dom\";\nimport { ConfigContext } from '../contexts/ConfigContext'\n\nexport default () => {\n const config = useContext(ConfigContext)\n const { viewIndex } = useParams();\n const view = config.views[viewIndex];\n\n return (\n <div class=\"view\">\n <iframe src={view.src}></iframe>\n </div>\n )\n}","import React, { useMemo, Suspense } from 'react';\nimport axios from \"axios\";\nimport styled from 'styled-components'\n\nconst packages = {\n \"react\": () => ({ exports: React }),\n \"axios\": () => ({ exports: axios }),\n \"styled-components\": () => ({ exports: styled }),\n}\n\nfunction getParsedModule(code, moduleName, packages) {\n const _this = Object.create(packages);\n function require(name) {\n if (!(name in _this) && moduleName === name) {\n let module = { exports: {} };\n _this[name] = () => module;\n let wrapper = Function(\"require, exports, module\", code);\n wrapper(require, module.exports, module);\n } else if (!(name in _this)) {\n throw `Module '${name}' not found`\n }\n return (_this[name]()).exports;\n }\n\n return require(moduleName);\n}\n\n\nasync function fetchComponent(componentPath) {\n try {\n const response = await axios.get(`/customComponent`, {\n params: {\n componentPath\n }\n })\n const text = response.data\n return { default: getParsedModule(text, \"__moduleName__\", packages) };\n } catch (error) {\n console.error(error)\n return { default() { return <div>Erreur de rendu</div> } }\n }\n\n}\n\nconst CustomComponent = ({ componentPath, children, ...props }) => {\n const Component = useMemo(() => {\n return React.lazy(async () => fetchComponent(componentPath))\n }, [componentPath]);\n\n return (\n <Suspense fallback={null}>\n <Component {...props}>{children}</Component>\n </Suspense>\n )\n};\n\nexport default React.memo(CustomComponent);\n","import { useContext } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport CustomComponent from \"../components/CustomComponent\";\nimport { ConfigContext } from \"../contexts/ConfigContext\";\n\nexport default () => {\n const config = useContext(ConfigContext)\n const { viewIndex } = useParams();\n\n const componentPath = config.views[viewIndex].componentPath\n\n return (\n <CustomComponent componentPath={componentPath} />\n )\n}","import {\n BrowserRouter as Router,\n Switch,\n Route\n} from \"react-router-dom\";\nimport { useEffect, useState } from \"react\";\nimport './App.css';\nimport Sidebar from './components/Sidebar'\nimport RedirectToFirstView from './components/RedirectToFirstView'\nimport CreateRecord from './pages/CreateRecord'\nimport EditRecord from './pages/EditRecord'\nimport Records from './pages/Records'\nimport Record from './pages/Record'\nimport Login from './pages/Login'\nimport Iframe from './pages/Iframe'\nimport CustomView from './pages/CustomView'\nimport { ConfigProvider } from './contexts/ConfigContext'\nimport axios from \"axios\";\n\naxios.defaults.withCredentials = true;\naxios.defaults.baseURL = process.env.NODE_ENV === \"development\" ? 'http://localhost/admin/api' : '/_HOMEPAGE_/api';\n\nfunction App() {\n const [isAuthenticated, setIsAuthenticated] = useState(null);\n\n useEffect(() => {\n axios.get(\"/isAuthenticated\").then((response) => {\n setIsAuthenticated(response.data.isAuthenticated)\n })\n }, []);\n\n return (\n <div id=\"body\">\n {isAuthenticated === true ? (\n <ConfigProvider>\n <Router basename={process.env.NODE_ENV === \"development\" ? '/admin' : \"/_HOMEPAGE_\"}>\n <Sidebar />\n <Switch>\n <Route path=\"/records/:viewIndex/:subviewIndex?\">\n <Records />\n </Route>\n <Route path=\"/record/:viewIndex/:recordId\">\n <Record />\n </Route>\n <Route path=\"/editRecord/:viewIndex/:recordId\">\n <EditRecord />\n </Route>\n <Route path=\"/createRecord/:viewIndex/:panelIndex?/:recordId?\">\n <CreateRecord />\n </Route>\n <Route path=\"/iframe/:viewIndex\">\n <Iframe />\n </Route>\n <Route path=\"/customView/:viewIndex\">\n <CustomView />\n </Route>\n <Route path=\"/\">\n <RedirectToFirstView />\n </Route>\n </Switch>\n </Router>\n </ConfigProvider>\n ) : isAuthenticated === false ? (\n <Login setIsAuthenticated={setIsAuthenticated} />\n ) : (\n <div class=\"appLoading\">\n <i class='fa fa-circle-notch fa-spin'></i>\n </div>\n )}\n </div>\n\n );\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n\nReactDOM.render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n document.getElementById('root')\n);"],"sourceRoot":""}