{"version":3,"file":"layouts.mjs","sources":["../../../../../server/src/services/utils/configuration/layouts.ts"],"sourcesContent":["import _ from 'lodash';\nimport { getService } from '../../../utils';\nimport { isListable, hasEditableAttribute, hasRelationAttribute } from './attributes';\n\nconst DEFAULT_LIST_LENGTH = 4;\nconst MAX_ROW_SIZE = 12;\n\nconst isAllowedFieldSize = (type: any, size: any) => {\n const { getFieldSize } = getService('field-sizes');\n const fieldSize = getFieldSize(type);\n\n // Check if field was locked to another size\n if (!fieldSize.isResizable && size !== fieldSize.default) {\n return false;\n }\n\n // Otherwise allow unless it's bigger than a row\n return size <= MAX_ROW_SIZE;\n};\n\nconst getDefaultFieldSize = (attribute: any) => {\n const { hasFieldSize, getFieldSize } = getService('field-sizes');\n\n // Check if it's a custom field with a custom size and get the default size for the field type\n return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type)\n .default;\n};\n\nasync function createDefaultLayouts(schema: any) {\n return {\n // @ts-expect-error necessary to provide this default layout\n list: createDefaultListLayout(schema),\n // @ts-expect-error necessary to provide this default layout\n edit: createDefaultEditLayout(schema),\n ..._.pick(_.get(schema, ['config', 'layouts'], {}), ['list', 'edit']),\n };\n}\n\nfunction createDefaultListLayout(schema: any) {\n return Object.keys(schema.attributes)\n .filter((name) => isListable(schema, name) && name !== 'documentId')\n .slice(0, DEFAULT_LIST_LENGTH);\n}\n\nconst rowSize = (els: any) => els.reduce((sum: any, el: any) => sum + el.size, 0);\n\nfunction createDefaultEditLayout(schema: any) {\n const keys = Object.keys(schema.attributes).filter((name) => hasEditableAttribute(schema, name));\n\n return appendToEditLayout([], keys, schema);\n}\n\n/** Synchronisation functions */\n\nfunction syncLayouts(configuration: any, schema: any) {\n if (_.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);\n\n const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};\n\n let cleanList = list.filter((attr: any) => isListable(schema, attr));\n\n // TODO V5: remove editRelations\n const cleanEditRelations = editRelations.filter((attr: any) =>\n hasRelationAttribute(schema, attr)\n );\n\n // backward compatibility with when relations were on the side of the layout\n // it migrates the displayed relations to the main edit layout\n const elementsToReAppend = [...cleanEditRelations];\n let cleanEdit: unknown[] = [];\n for (const row of edit) {\n const newRow: unknown[] = [];\n\n for (const el of row) {\n if (!hasEditableAttribute(schema, el.name)) continue;\n\n // Check if the field is a custom field with a custom size.\n // If so, use the custom size instead of the type size\n const { hasFieldSize } = getService('field-sizes');\n const fieldType = hasFieldSize(schema.attributes[el.name].customField)\n ? schema.attributes[el.name].customField\n : schema.attributes[el.name].type;\n\n /* if the type of a field was changed (ex: string -> json) or a new field was added in the schema\n and the new type doesn't allow the size of the previous type, append the field at the end of layouts\n */\n if (!isAllowedFieldSize(fieldType, el.size)) {\n elementsToReAppend.push(el.name);\n continue;\n }\n\n newRow.push(el);\n }\n\n if (newRow.length > 0) {\n cleanEdit.push(newRow);\n }\n }\n\n cleanEdit = appendToEditLayout(cleanEdit as any, elementsToReAppend, schema);\n\n const newAttributes = _.difference(\n Object.keys(schema.attributes),\n Object.keys(configuration.metadatas)\n );\n\n /** Add new attributes where they belong */\n\n if (cleanList.length < DEFAULT_LIST_LENGTH) {\n // add newAttributes\n // only add valid listable attributes\n cleanList = _.uniq(\n cleanList\n .concat(newAttributes.filter((key) => isListable(schema, key)))\n .slice(0, DEFAULT_LIST_LENGTH)\n );\n }\n\n // add new attributes to edit view\n const newEditAttributes = newAttributes.filter((key) => hasEditableAttribute(schema, key));\n\n cleanEdit = appendToEditLayout(cleanEdit, newEditAttributes, schema);\n\n return {\n list: cleanList.length > 0 ? cleanList : createDefaultListLayout(schema),\n edit: cleanEdit.length > 0 ? cleanEdit : createDefaultEditLayout(schema),\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/default-param-last\nconst appendToEditLayout = (layout: any = [], keysToAppend: any, schema: any) => {\n if (keysToAppend.length === 0) return layout;\n let currentRowIndex = Math.max(layout.length - 1, 0);\n\n // init currentRow if necessary\n if (!layout[currentRowIndex]) {\n layout[currentRowIndex] = [];\n }\n\n for (const key of keysToAppend) {\n const attribute = schema.attributes[key];\n\n const attributeSize = getDefaultFieldSize(attribute);\n const currenRowSize = rowSize(layout[currentRowIndex]);\n\n if (currenRowSize + attributeSize > MAX_ROW_SIZE) {\n currentRowIndex += 1;\n layout[currentRowIndex] = [];\n }\n\n layout[currentRowIndex].push({\n name: key,\n size: attributeSize,\n });\n }\n\n return layout;\n};\n\nexport { createDefaultLayouts, syncLayouts };\n"],"names":["DEFAULT_LIST_LENGTH","MAX_ROW_SIZE","isAllowedFieldSize","type","size","getFieldSize","getService","fieldSize","isResizable","default","getDefaultFieldSize","attribute","hasFieldSize","customField","createDefaultLayouts","schema","list","createDefaultListLayout","edit","createDefaultEditLayout","_","pick","get","Object","keys","attributes","filter","name","isListable","slice","rowSize","els","reduce","sum","el","hasEditableAttribute","appendToEditLayout","syncLayouts","configuration","isEmpty","layouts","editRelations","cleanList","attr","cleanEditRelations","hasRelationAttribute","elementsToReAppend","cleanEdit","row","newRow","fieldType","push","length","newAttributes","difference","metadatas","uniq","concat","key","newEditAttributes","layout","keysToAppend","currentRowIndex","Math","max","attributeSize","currenRowSize"],"mappings":"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"}