@galadrim/galadmin 0.1.25 → 0.1.27

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.
Files changed (18) hide show
  1. package/dist/tsconfig.tsbuildinfo +1 -1
  2. package/dist/types/config.d.ts +15 -3
  3. package/package.json +1 -1
  4. package/src/front/build/asset-manifest.json +3 -3
  5. package/src/front/build/index.html +1 -1
  6. package/src/front/build/static/js/{main.72907e23.chunk.js → main.0e17de8e.chunk.js} +2 -2
  7. package/src/front/build/static/js/main.0e17de8e.chunk.js.map +1 -0
  8. package/src/front/node_modules/.cache/.eslintcache +1 -1
  9. package/src/front/node_modules/.cache/babel-loader/ca18f7e85f0afa740f4d5fb324b056a5.json +1 -0
  10. package/src/front/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/c9/12/58a7f123b352e6ae40715f13eb0c089d25efc399f4e05b09d5fdb82569a107cfae29a94d43a2d5b6fc9d9cc411cfa262e3a33e797fbb4932bc1277c59204 +1 -0
  11. package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/{5e/56/3713e5124fdb53258d967cc18d2baaca0bef8fc282629e63e651d65fd801 → 03/f6/fe533ff91d4daa56e323f4fc8e4df13d3176fc1bfff318920f9315782eea} +1 -1
  12. package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/1a/f6/93794b3e91e2fc8012c6d64abcbec3d311845a4f34191ae898f0b23fb368 +1 -1
  13. package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/87/08/421190bfe6e50816e059da6c33526c9943732ef856ebd2752d0cbfb4a852 +1 -1
  14. package/src/front/src/pages/Records.js +11 -9
  15. package/src/types/config.ts +12 -4
  16. package/src/front/build/static/js/main.72907e23.chunk.js.map +0 -1
  17. package/src/front/node_modules/.cache/babel-loader/3c35365361be8af665836d218febef34.json +0 -1
  18. package/src/front/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/12/48/f1fcdb4ebeb21ef18821c9b52c83c3c88c5ba9068b706d2183642c4d5842be1b0128784ae4ddade6cb1b99e87b05cf282e49436885bd96e34e8bc59a5704 +0 -1
@@ -1,2 +1,2 @@
1
1
 
2
- e2da909acaf54a290a1cd8e476716f73a83268aa {"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.72907e23.chunk.js\",\"contentHash\":\"830978baf435dd62a36e\"}","integrity":"sha512-Ekjx/NtOvrIe8YghybUsg8PIjFupBotwbSGDZCxNWEK+GwEoeErk3a3myxuZ6HsFzyguSUNohb2W406LxZpXBA==","time":1684498230758,"size":376048}
2
+ 2ea2d11522f660532f84bd57099c46325b603a92 {"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.0e17de8e.chunk.js\",\"contentHash\":\"bfe325183d0d620ed8f8\"}","integrity":"sha512-yRJYp/Ejs1LmrkBxXxPrDAidJe/DmfTgWwnV/bglaaEHz64pqU1DotW2/J2cxBHPomLjoz55f7tJMrwSd8WSBA==","time":1685301884792,"size":376321}
@@ -1,2 +1,2 @@
1
1
 
2
- df7c3f367b30962cfd1952e1afd89408a8514c35 {"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\\u002F2.5e3d5b65.chunk.js\",\"contentHash\":\"17387ffe9e86fdeb3d6b\"}","integrity":"sha512-/PLSbmnhdmzUQ9ITaZFPFeejIezu8dmYveHLwCbUkJ69eMz4qWZOKxqtmTqF4M9Tvs7cU29fxP7fIRJlfhTw5A==","time":1684498233589,"size":1867077}
2
+ 9f2e9597d77cd315cef78fc851b2090f64f6cff8 {"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\\u002F2.5e3d5b65.chunk.js\",\"contentHash\":\"17387ffe9e86fdeb3d6b\"}","integrity":"sha512-/PLSbmnhdmzUQ9ITaZFPFeejIezu8dmYveHLwCbUkJ69eMz4qWZOKxqtmTqF4M9Tvs7cU29fxP7fIRJlfhTw5A==","time":1685301887498,"size":1867077}
@@ -1,2 +1,2 @@
1
1
 
2
- b696bcfb18cffd5bc4fee59f2e46a7c1eef065ed {"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\\u002Fruntime-main.2084140f.js\",\"contentHash\":\"21b0955fafaa36835c2c\"}","integrity":"sha512-EIHWkk+Hu8omZttNSZyf/dcQREufSs8WYrDS8rrnA4aKRWlIARB00JVPiR1DRsuEMh2l+YSkkh+tpa2nXovJ6g==","time":1684498230791,"size":17514}
2
+ 1cb6437f3b025e806055508963e4887a82ed2d1d {"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\\u002Fruntime-main.2084140f.js\",\"contentHash\":\"21b0955fafaa36835c2c\"}","integrity":"sha512-EIHWkk+Hu8omZttNSZyf/dcQREufSs8WYrDS8rrnA4aKRWlIARB00JVPiR1DRsuEMh2l+YSkkh+tpa2nXovJ6g==","time":1685301884835,"size":17514}
@@ -102,15 +102,17 @@ export default () => {
102
102
  refreshData={refreshData}
103
103
  onAddFilter={(filter) => setCurrentFilters([...currentFilters, filter])}
104
104
  />
105
- <DownloadButton
106
- view={view}
107
- viewIndex={viewIndex}
108
- subviewIndex={subviewIndex}
109
- currentFilters={currentFilters}
110
- orderBy={orderBy}
111
- isDesc={isDesc}
112
- query={query}
113
- />
105
+ {view.canExport !== false ? (
106
+ <DownloadButton
107
+ view={view}
108
+ viewIndex={viewIndex}
109
+ subviewIndex={subviewIndex}
110
+ currentFilters={currentFilters}
111
+ orderBy={orderBy}
112
+ isDesc={isDesc}
113
+ query={query}
114
+ />
115
+ ) : null}
114
116
  {view.canCreate ? (
115
117
  <Link to={`/createRecord/${viewIndex}`}>
116
118
  <div class="plusButton"><i class="fa fa-plus"></i></div>
@@ -101,6 +101,8 @@ export type FileColumn = {
101
101
  name: string,
102
102
  publicPath?: string,
103
103
  subdirectory?: string,
104
+ aspectRatioField?: string,
105
+ originalNameField?: string,
104
106
  s3Config?: {
105
107
  host: string,
106
108
  accessKeyId: string,
@@ -168,6 +170,8 @@ export type TableView = {
168
170
  canDelete?: boolean,
169
171
  /** Rendre possible à l'utilisateur de modifier des enregistrements */
170
172
  canEdit?: boolean,
173
+ /** Rendre possible à l'utilisateur de télécharger les enregistrements (par défaut : true) */
174
+ canExport?: boolean,
171
175
  createCallback?: string,
172
176
  createCallbackFunction?: ({ id, data }: { id: number, data: any }) => void,
173
177
  editCallback?: string,
@@ -227,15 +231,19 @@ export type MapPanel = {
227
231
 
228
232
  export type GalleryPanel = {
229
233
  type: "gallery",
230
- tableName?: string,
231
- primaryId?: string,
232
234
  query: string,
235
+ canDelete?: boolean,
233
236
  canCreate?: boolean,
234
237
  createConfig?: CreateConfig,
235
- canDelete?: boolean,
238
+ tableName?: string,
239
+ primaryId?: string,
236
240
  baseUrl?: string,
237
241
  pathField?: string,
238
- objectFit?: 'cover' | 'contain'
242
+ objectFit?: 'cover' | 'contain',
243
+ createCallback?: string,
244
+ createCallbackFunction?: ({ id, data }: { id: number, data: any }) => void,
245
+ deleteCallback?: string,
246
+ deleteCallbackFunction?: ({ id }: { id: number }) => void,
239
247
  }
240
248
 
241
249
  export type ViewPanel = BaseTypePanel & (TablePanel | MapPanel | GalleryPanel)
@@ -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","viewIndex","useParams","isLoading","setIsLoading","path","setPath","onInputChange","a","f","FormData","method","url","params","columnId","__id__","headers","fileData","aspectRatioField","aspectRatio","originalNameField","originalFilename","id","Math","random","toString","htmlFor","display","preventDefault","options","setOptions","post","optional","option","query","setQuery","input","isInputValid","list","dataType","includes","defaultOption","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","isAxiosError","aNewSingular","index","labelTooltip","LabelTooltip","Input","newValues","goBack","record","setRecord","dataToUpdate","isUpdating","setIsUpdating","updateRecord","primaryValue","previousData","responseText","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","foreignViewIndex","findIndex","tableName","table","formatValue","dangerouslySetInnerHTML","__html","evalExpression","showAsPicture","imageUrl","baseUrl","pathField","width","objectFit","actionDisplayCondition","backgroundColor","constructor","_viewIndex","_page","_currentFilters","_orderBy","_isDesc","_query","page","setPage","setCurrentFilters","setOrderBy","setIsDesc","setSelectedRecordIds","setData","hideInTable","records","BulkActionsButton","AddFilterButton","DownloadButton","canCreate","sortName","cellIndex","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","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.72907e23.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, 4, 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}\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 ? \"YYYY-MM-DD HH:mm:ss\" : \"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\";\nimport {\n useParams\n} from \"react-router-dom\";\n\nexport default ({ column, onChange, initialData }) => {\n const form = useRef(null);\n const { viewIndex } = useParams();\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 viewIndex,\n columnId: column.__id__\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] ?? column.defaultOption}\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] ?? column.defaultOption}\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] ?? column.defaultOption}\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.defaultOption) {\n initialData[column.name] = column.defaultOption\n } else 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 window.swal({\n title: \"Erreur\",\n text: axios.isAxiosError(error) ? error.response.data.message : \"Une erreur est survenue\",\n dangerMode: true\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\"\nimport {\n Link\n} from \"react-router-dom\";\n\nexport default (column, record, config, onTable) => {\n const foreignViewIndex = column.dataType === 'foreign' ? config.views.findIndex(x => x.tableName === column.table) : -1\n if (column.dataType === 'foreign' && foreignViewIndex > -1) {\n if (column.formatValue) {\n return <Link to={`/record/${foreignViewIndex}/${record[column.name]}`} dangerouslySetInnerHTML={{ __html: record[`__formatValue-${column.__id__}__`] }} />\n } else if (column.formattedValue) {\n return <Link to={`/record/${foreignViewIndex}/${record[column.name]}`}>{evalExpression(column.formattedValue, record)}</Link>\n } else {\n return <Link to={`/record/${foreignViewIndex}/${record[column.name]}`}>{record[column.name]}</Link>\n }\n } else 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 if (response.data?.records?.length === 0 && page > 1) {\n setPage(1)\n }\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, config, 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}\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, index }) => {\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 viewIndex,\n panelIndex: index,\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, config, 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} index={index} /> : null}\n {panel.type === \"gallery\" ? <GalleryPanel record={record} panel={panel} view={view} index={index} /> : null}\n {panel.type === \"map\" ? <MapPanel record={record} panel={panel} view={view} index={index} /> : 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":""}
@@ -1 +0,0 @@
1
- {"ast":null,"code":"import _toConsumableArray from\"/home/runner/work/galadmin/galadmin/src/front/node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toConsumableArray\";import _slicedToArray from\"/home/runner/work/galadmin/galadmin/src/front/node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/slicedToArray\";import{useState,useEffect,useContext}from\"react\";import axios from\"axios\";import{Link,useParams,useHistory}from\"react-router-dom\";import DownloadButton from\"../components/DownloadButton\";import AddFilterButton from\"../components/AddFilterButton\";import BulkActionsButton from\"../components/BulkActionsButton\";import getFormattedValue from\"../utils/getFormattedValue\";import{ConfigContext}from'../contexts/ConfigContext';import{jsx as _jsx}from\"react/jsx-runtime\";import{jsxs as _jsxs}from\"react/jsx-runtime\";var _viewIndex=null;var _page=1;var _currentFilters=[];var _orderBy=null;var _isDesc=null;var _query=\"\";export default(function(){var _view$columns,_data$records;var _useParams=useParams(),viewIndex=_useParams.viewIndex,subviewIndex=_useParams.subviewIndex;var history=useHistory();var _useState=useState(_page),_useState2=_slicedToArray(_useState,2),page=_useState2[0],setPage=_useState2[1];var _useState3=useState(_currentFilters),_useState4=_slicedToArray(_useState3,2),currentFilters=_useState4[0],setCurrentFilters=_useState4[1];var _useState5=useState(_orderBy),_useState6=_slicedToArray(_useState5,2),orderBy=_useState6[0],setOrderBy=_useState6[1];var _useState7=useState(_isDesc),_useState8=_slicedToArray(_useState7,2),isDesc=_useState8[0],setIsDesc=_useState8[1];var _useState9=useState(_query),_useState10=_slicedToArray(_useState9,2),query=_useState10[0],setQuery=_useState10[1];var _useState11=useState([]),_useState12=_slicedToArray(_useState11,2),selectedRecordIds=_useState12[0],setSelectedRecordIds=_useState12[1];var _useState13=useState(null),_useState14=_slicedToArray(_useState13,2),data=_useState14[0],setData=_useState14[1];var config=useContext(ConfigContext);var view=config.views[viewIndex];var filteredColumns=(_view$columns=view.columns)===null||_view$columns===void 0?void 0:_view$columns.filter(function(x){return!x.hideInTable&&!x.hidden;});useEffect(function(){if(viewIndex!==_viewIndex){setPage(1);setQuery(null);setOrderBy(null);setIsDesc(null);setQuery(\"\");if(selectedRecordIds.length>0){setSelectedRecordIds([]);}if(currentFilters.length>0){setCurrentFilters([]);}}},[viewIndex]);useEffect(function(){refreshData();_viewIndex=viewIndex;_page=page;_query=query;_currentFilters=currentFilters;_orderBy=orderBy;_isDesc=isDesc;},[viewIndex,subviewIndex,page,query,currentFilters,orderBy,isDesc]);function refreshData(){setData(null);axios.post(\"/records\",{viewIndex:viewIndex,subviewIndex:subviewIndex,page:page,filters:currentFilters.map(function(x){return x.query;}),orderBy:orderBy,isDesc:isDesc,query:query}).then(function(response){var _response$data,_response$data$record;if(((_response$data=response.data)===null||_response$data===void 0?void 0:(_response$data$record=_response$data.records)===null||_response$data$record===void 0?void 0:_response$data$record.length)===0&&page>1){setPage(1);}setData(response.data);});}return/*#__PURE__*/_jsxs(\"div\",{class:\"view\",children:[/*#__PURE__*/_jsxs(\"div\",{class:\"scrollable\",children:[/*#__PURE__*/_jsxs(\"div\",{class:\"viewHeader\",children:[/*#__PURE__*/_jsx(\"div\",{class:\"viewTitle\",children:view.label}),/*#__PURE__*/_jsxs(\"div\",{class:\"viewHeaderActions\",children:[/*#__PURE__*/_jsxs(\"div\",{class:\"searchBarContainer\",children:[/*#__PURE__*/_jsx(\"input\",{type:\"text\",placeholder:\"Rechercher\",class:\"searchBar\",value:query,onChange:function onChange(e){return setQuery(e.target.value);}}),/*#__PURE__*/_jsx(\"div\",{class:\"searchBarIcon\",children:/*#__PURE__*/_jsx(\"i\",{class:\"fa fa-search\"})})]}),/*#__PURE__*/_jsx(BulkActionsButton,{viewIndex:viewIndex,selectedRecordIds:selectedRecordIds,refreshData:refreshData}),/*#__PURE__*/_jsx(AddFilterButton,{view:view,refreshData:refreshData,onAddFilter:function onAddFilter(filter){return setCurrentFilters([].concat(_toConsumableArray(currentFilters),[filter]));}}),/*#__PURE__*/_jsx(DownloadButton,{view:view,viewIndex:viewIndex,subviewIndex:subviewIndex,currentFilters:currentFilters,orderBy:orderBy,isDesc:isDesc,query:query}),view.canCreate?/*#__PURE__*/_jsx(Link,{to:\"/createRecord/\".concat(viewIndex),children:/*#__PURE__*/_jsx(\"div\",{class:\"plusButton\",children:/*#__PURE__*/_jsx(\"i\",{class:\"fa fa-plus\"})})}):null]})]}),currentFilters.length>0?/*#__PURE__*/_jsx(\"div\",{class:\"filtersContainer\",children:currentFilters.map(function(filter,index){return/*#__PURE__*/_jsxs(\"div\",{class:\"filterItem\",children:[/*#__PURE__*/_jsx(\"div\",{class:\"filterItemLabel\",children:filter.label}),/*#__PURE__*/_jsx(\"div\",{class:\"filterRemove\",onClick:function onClick(){setCurrentFilters(currentFilters.filter(function(x){return x.query!==filter.query;}));},children:/*#__PURE__*/_jsx(\"i\",{class:\"fa fa-times\"})})]},index);})}):null,/*#__PURE__*/_jsxs(\"table\",{class:\"table\",children:[/*#__PURE__*/_jsx(\"thead\",{children:/*#__PURE__*/_jsxs(\"tr\",{children:[config.hideMultiselect?null:/*#__PURE__*/_jsx(\"th\",{}),filteredColumns.map(function(column,index){var sortName=column.dataType===\"foreign\"||column.dataType===\"datalist\"?column.formattedValue:column.sortName||column.name;return/*#__PURE__*/_jsxs(\"th\",{class:sortName?\"sortable\":\"\",onClick:function onClick(){if(sortName){setOrderBy(sortName);setIsDesc(orderBy===sortName?!isDesc:false);}},children:[column.label,sortName?/*#__PURE__*/_jsx(\"div\",{class:\"columnSortIcon\",children:/*#__PURE__*/_jsx(\"i\",{class:\"fas fa-sort\".concat(isDesc===true&&sortName===orderBy?\"-down\":isDesc===false&&sortName===orderBy?\"-up\":\"\")})}):null]},index);})]})}),/*#__PURE__*/_jsxs(\"tbody\",{children:[!data?Array.from({length:10}).map(function(_,index){return/*#__PURE__*/_jsx(\"tr\",{class:\"record\",children:Array.from({length:filteredColumns.length+(config.hideMultiselect?0:1)}).map(function(_,cellIndex){return/*#__PURE__*/_jsx(\"td\",{children:\" \"},cellIndex);})},index);}):null,data===null||data===void 0?void 0:(_data$records=data.records)===null||_data$records===void 0?void 0:_data$records.map(function(record){var recordId=record[view.primaryId];return/*#__PURE__*/_jsxs(\"tr\",{class:\"record \".concat(view.notClickable?\"nonClickableRow\":\"\"),onClick:function onClick(event){if(event.target.tagName==\"A\"){event.stopPropagation();return;}if(!view.notClickable){if(view.clickToEdit){history.push(\"/editRecord/\".concat(viewIndex,\"/\").concat(recordId));}else{history.push(\"/record/\".concat(viewIndex,\"/\").concat(recordId));}}},children:[config.hideMultiselect?null:/*#__PURE__*/_jsx(\"td\",{class:\"checkboxParent\",onClick:function onClick(e){setSelectedRecordIds(selectedRecordIds.includes(recordId)?selectedRecordIds.filter(function(x){return x!==recordId;}):[].concat(_toConsumableArray(selectedRecordIds),[recordId]));e.stopPropagation();},children:/*#__PURE__*/_jsx(\"div\",{class:\"checkbox \".concat(selectedRecordIds.includes(recordId)?\"checked\":\"\")})}),filteredColumns.map(function(column,index){return/*#__PURE__*/_jsx(\"td\",{children:getFormattedValue(column,record,config,true)},index);})]},recordId);})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{class:\"tableFooter\",children:[/*#__PURE__*/_jsxs(\"div\",{class:\"tableCounter\",children:[(data===null||data===void 0?void 0:data.count)||\"-\",\" \",view.label]}),/*#__PURE__*/_jsxs(\"div\",{class:\"paginator\",children:[/*#__PURE__*/_jsx(\"div\",{class:\"paginatorLeft\",onClick:function onClick(){return setPage(Math.max(1,page-1));},children:/*#__PURE__*/_jsx(\"i\",{class:\"fas fa-caret-left\"})}),/*#__PURE__*/_jsxs(\"div\",{class:\"paginatorNumber\",children:[page,\" / \",data&&data.count?Math.ceil(data.count/(view.limit||10)):\"-\"]}),/*#__PURE__*/_jsx(\"div\",{class:\"paginatorRight\",onClick:function onClick(){return setPage(Math.min(page+1,Math.ceil(data.count/(view.limit||10))));},children:/*#__PURE__*/_jsx(\"i\",{class:\"fas fa-caret-right\"})})]})]})]});});","map":{"version":3,"sources":["/home/runner/work/galadmin/galadmin/src/front/src/pages/Records.js"],"names":["useState","useEffect","useContext","axios","Link","useParams","useHistory","DownloadButton","AddFilterButton","BulkActionsButton","getFormattedValue","ConfigContext","_viewIndex","_page","_currentFilters","_orderBy","_isDesc","_query","viewIndex","subviewIndex","history","page","setPage","currentFilters","setCurrentFilters","orderBy","setOrderBy","isDesc","setIsDesc","query","setQuery","selectedRecordIds","setSelectedRecordIds","data","setData","config","view","views","filteredColumns","columns","filter","x","hideInTable","hidden","length","refreshData","post","filters","map","then","response","records","label","e","target","value","canCreate","index","hideMultiselect","column","sortName","dataType","formattedValue","name","Array","from","_","cellIndex","record","recordId","primaryId","notClickable","event","tagName","stopPropagation","clickToEdit","push","includes","count","Math","max","ceil","limit","min"],"mappings":"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","sourcesContent":["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 if (response.data?.records?.length === 0 && page > 1) {\n setPage(1)\n }\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, config, 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}\n"]},"metadata":{},"sourceType":"module"}