record panel reference

This commit is contained in:
Yuri Kuznetsov
2024-12-06 13:00:10 +02:00
parent 96e1f30590
commit 0899e20cad
19 changed files with 280 additions and 257 deletions
+19
View File
@@ -341,6 +341,25 @@
</SchemaInfo> </SchemaInfo>
</value> </value>
</entry> </entry>
<entry key="metadata/app/clientRecord">
<value>
<SchemaInfo>
<option name="generatedName" value="New Schema" />
<option name="name" value="metadata/app/clientRecord" />
<option name="relativePathToSchema" value="schema/metadata/app/clientRecord.json" />
<option name="schemaVersion" value="JSON Schema version 7" />
<option name="patterns">
<list>
<Item>
<option name="pattern" value="true" />
<option name="path" value="*/Resources/metadata/app/clientRecord.json" />
<option name="mappingKind" value="Pattern" />
</Item>
</list>
</option>
</SchemaInfo>
</value>
</entry>
<entry key="metadata/app/clientRoutes"> <entry key="metadata/app/clientRoutes">
<value> <value>
<SchemaInfo> <SchemaInfo>
+6
View File
@@ -184,6 +184,12 @@
], ],
"url": "./schema/metadata/app/client.json" "url": "./schema/metadata/app/client.json"
}, },
{
"fileMatch": [
"*/Resources/metadata/app/clientRecord.json"
],
"url": "./schema/metadata/app/clientRecord.json"
},
{ {
"fileMatch": [ "fileMatch": [
"*/Resources/metadata/app/clientRoutes.json" "*/Resources/metadata/app/clientRoutes.json"
@@ -5,21 +5,15 @@
"detail": [ "detail": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
}, },
{ {
"name": "tasks", "name": "tasks",
"label": "Tasks", "reference": "tasks"
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
} }
] ]
} }
@@ -5,21 +5,15 @@
"detail": [ "detail": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
}, },
{ {
"name": "tasks", "name": "tasks",
"label": "Tasks", "reference": "tasks"
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
} }
] ]
} }
@@ -5,21 +5,15 @@
"detail": [ "detail": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
}, },
{ {
"name": "tasks", "name": "tasks",
"label": "Tasks", "reference": "tasks"
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
} }
] ]
} }
@@ -8,41 +8,29 @@
"detail": [ "detail": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
}, },
{ {
"name": "tasks", "name": "tasks",
"label": "Tasks", "reference": "tasks"
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
} }
], ],
"detailSmall": [ "detailSmall": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
}, },
{ {
"name": "tasks", "name": "tasks",
"label": "Tasks", "reference": "tasks"
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
} }
] ]
}, },
@@ -19,46 +19,36 @@
"checkVisibilityFunction": "isRejectAvailable" "checkVisibilityFunction": "isRejectAvailable"
} }
], ],
"sidePanels":{ "sidePanels": {
"detail":[ "detail": [
{ {
"name":"activities", "name": "activities",
"label":"Activities", "reference": "activities",
"view":"crm:views/case/record/panels/activities", "view": "crm:views/case/record/panels/activities"
"aclScope": "Activities" },
}, {
{ "name": "history",
"name":"history", "reference": "history"
"label":"History", },
"view":"crm:views/record/panels/history", {
"aclScope": "Activities" "name": "tasks",
}, "reference": "tasks"
{ }
"name":"tasks",
"label":"Tasks",
"view":"crm:views/record/panels/tasks",
"aclScope": "Task"
}
], ],
"detailSmall":[ "detailSmall": [
{ {
"name":"activities", "name": "activities",
"label":"Activities", "reference": "activities",
"view":"crm:views/case/record/panels/activities", "view": "crm:views/case/record/panels/activities"
"aclScope": "Activities" },
}, {
{ "name": "history",
"name":"history", "reference": "history"
"label":"History", },
"view":"crm:views/record/panels/history", {
"aclScope": "Activities" "name": "tasks",
}, "reference": "tasks"
{ }
"name":"tasks",
"label":"Tasks",
"view":"crm:views/record/panels/tasks",
"aclScope": "Task"
}
] ]
}, },
"filterList": [ "filterList": [
@@ -12,41 +12,29 @@
"detail": [ "detail": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
}, },
{ {
"name": "tasks", "name": "tasks",
"label": "Tasks", "reference": "tasks"
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
} }
], ],
"detailSmall": [ "detailSmall": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
}, },
{ {
"name": "tasks", "name": "tasks",
"label": "Tasks", "reference": "tasks"
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
} }
] ]
}, },
@@ -6,8 +6,8 @@
"recordViews":{ "recordViews":{
"detail":"crm:views/lead/record/detail" "detail":"crm:views/lead/record/detail"
}, },
"sidePanels":{ "sidePanels": {
"detail":[ "detail": [
{ {
"name":"convertedTo", "name":"convertedTo",
"label":"Converted To", "label":"Converted To",
@@ -18,22 +18,16 @@
"isForm": true "isForm": true
}, },
{ {
"name":"activities", "name": "activities",
"label":"Activities", "reference": "activities"
"view":"crm:views/record/panels/activities",
"aclScope":"Activities"
}, },
{ {
"name":"history", "name": "history",
"label":"History", "reference": "history"
"view":"crm:views/record/panels/history",
"aclScope":"Activities"
}, },
{ {
"name":"tasks", "name": "tasks",
"label":"Tasks", "reference": "tasks"
"view":"crm:views/record/panels/tasks",
"aclScope":"Task"
} }
], ],
"edit":[ "edit":[
@@ -47,7 +41,7 @@
"isForm": true "isForm": true
} }
], ],
"detailSmall":[ "detailSmall": [
{ {
"name":"convertedTo", "name":"convertedTo",
"label":"Converted To", "label":"Converted To",
@@ -58,22 +52,16 @@
"isForm": true "isForm": true
}, },
{ {
"name":"activities", "name": "activities",
"label":"Activities", "reference": "activities"
"view":"crm:views/record/panels/activities",
"aclScope":"Activities"
}, },
{ {
"name":"history", "name": "history",
"label":"History", "reference": "history"
"view":"crm:views/record/panels/history",
"aclScope":"Activities"
}, },
{ {
"name":"tasks", "name": "tasks",
"label":"Tasks", "reference": "tasks"
"view":"crm:views/record/panels/tasks",
"aclScope":"Task"
} }
], ],
"editSmall":[ "editSmall":[
@@ -10,46 +10,36 @@
"list":"crm:views/opportunity/record/list", "list":"crm:views/opportunity/record/list",
"kanban": "crm:views/opportunity/record/kanban" "kanban": "crm:views/opportunity/record/kanban"
}, },
"sidePanels":{ "sidePanels": {
"detail":[ "detail": [
{ {
"name":"activities", "name": "activities",
"label":"Activities", "reference": "activities",
"view":"crm:views/opportunity/record/panels/activities", "view": "crm:views/opportunity/record/panels/activities"
"aclScope": "Activities" },
}, {
{ "name": "history",
"name":"history", "reference": "history"
"label":"History", },
"view":"crm:views/record/panels/history", {
"aclScope": "Activities" "name": "tasks",
}, "reference": "tasks"
{ }
"name":"tasks",
"label":"Tasks",
"view":"crm:views/record/panels/tasks",
"aclScope": "Task"
}
], ],
"detailSmall":[ "detailSmall": [
{ {
"name":"activities", "name": "activities",
"label":"Activities", "reference": "activities",
"view":"crm:views/record/panels/activities", "view": "crm:views/opportunity/record/panels/activities"
"aclScope": "Activities" },
}, {
{ "name": "history",
"name":"history", "reference": "history"
"label":"History", },
"view":"crm:views/record/panels/history", {
"aclScope": "Activities" "name": "tasks",
}, "reference": "tasks"
{ }
"name":"tasks",
"label":"Tasks",
"view":"crm:views/record/panels/tasks",
"aclScope": "Task"
}
] ]
}, },
"filterList": [ "filterList": [
@@ -0,0 +1,22 @@
{
"panels": {
"activities": {
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
},
"history": {
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
},
"tasks": {
"name": "tasks",
"label": "Tasks",
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
}
}
}
@@ -32,29 +32,21 @@
"detail": [ "detail": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
} }
], ],
"detailSmall": [ "detailSmall": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
} }
] ]
}, },
@@ -66,4 +58,4 @@
"filter": "activePortal" "filter": "activePortal"
}, },
"iconClass": "far fa-user-circle" "iconClass": "far fa-user-circle"
} }
@@ -73,41 +73,31 @@
"detail": [ "detail": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
}, },
{ {
"name": "tasks", "name": "tasks",
"label": "Tasks", "reference": "tasks",
"view": "crm:views/user/record/panels/tasks", "view": "crm:views/user/record/panels/tasks"
"aclScope": "Task"
} }
], ],
"detailSmall": [ "detailSmall": [
{ {
"name": "activities", "name": "activities",
"label": "Activities", "reference": "activities"
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
}, },
{ {
"name": "history", "name": "history",
"label": "History", "reference": "history"
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
}, },
{ {
"name": "tasks", "name": "tasks",
"label": "Tasks", "reference": "tasks",
"view": "crm:views/user/record/panels/tasks", "view": "crm:views/user/record/panels/tasks"
"aclScope": "Task"
} }
] ]
}, },
@@ -82,7 +82,14 @@ class LayoutBottomPanelsDetail extends LayoutSidePanelsDetailView {
(this.getMetadata() (this.getMetadata()
.get(['clientDefs', this.scope, 'bottomPanels', this.viewType]) || [] .get(['clientDefs', this.scope, 'bottomPanels', this.viewType]) || []
).forEach(item => { ).forEach(/** Record */item => {
if (item.reference) {
item = {
...this.getMetadata().get(`app.clientRecord.panels.${item.reference}`),
...item,
};
}
if (!item.name) { if (!item.name) {
return; return;
} }
@@ -150,7 +150,14 @@ class LayoutSidePanelsDetailView extends LayoutRowsView {
} }
(this.getMetadata().get(['clientDefs', this.scope, 'sidePanels', this.viewType]) || []) (this.getMetadata().get(['clientDefs', this.scope, 'sidePanels', this.viewType]) || [])
.forEach(item => { .forEach(/** Record */item => {
if (item.reference) {
item = {
...this.getMetadata().get(`app.clientRecord.panels.${item.reference}`),
...item,
};
}
if (!item.name) { if (!item.name) {
return; return;
} }
+17 -3
View File
@@ -50,9 +50,23 @@ class DetailBottomRecordView extends PanelsContainerRecordView {
setupPanels() { setupPanels() {
const scope = this.scope; const scope = this.scope;
this.panelList = Espo.Utils.clone( this.panelList = this.getMetadata().get(['clientDefs', scope, 'bottomPanels', this.type]) ||
this.getMetadata() this.panelList || [];
.get(['clientDefs', scope, 'bottomPanels', this.type]) || this.panelList || []);
this.panelList = [...this.panelList].map(item => {
if ('reference' in item && item.reference) {
// noinspection UnnecessaryLocalVariableJS
/** @type {module:views/record/panels-container~panel} */
const newItem = {
...this.getMetadata().get(`app.clientRecord.panels.${item.reference}`),
...item,
};
return newItem;
}
return item;
});
this.panelList.forEach(item => { this.panelList.forEach(item => {
if ('index' in item) { if ('index' in item) {
+15
View File
@@ -111,6 +111,21 @@ class DetailSideRecordView extends PanelsContainerRecordView {
}); });
} }
this.panelList = this.panelList.map(item => {
if ('reference' in item && item.reference) {
// noinspection UnnecessaryLocalVariableJS
/** @type {module:views/record/panels-container~panel} */
const newItem = {
...this.getMetadata().get(`app.clientRecord.panels.${item.reference}`),
...item,
};
return newItem;
}
return item;
});
this.panelList = this.panelList.filter((p) => { this.panelList = this.panelList.filter((p) => {
if (p.aclScope) { if (p.aclScope) {
if (!this.getAcl().checkScope(p.aclScope)) { if (!this.getAcl().checkScope(p.aclScope)) {
+18
View File
@@ -0,0 +1,18 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://www.espocrm.com/schema/metadata/app/clientRecord.json",
"title": "app/navbar",
"description": "Client record definitions.",
"type": "object",
"properties": {
"panels": {
"description": "Detail view panels. Can be references from clientDefs > sidePanels/bottomPanels. As of v9.0.",
"type": "object",
"additionalProperties": {
"description": "A panel.",
"type": "object",
"$ref": "../clientDefs.json#/definitions/panel"
}
}
}
}
+60 -53
View File
@@ -330,59 +330,7 @@
"anyOf": [ "anyOf": [
{"const": "__APPEND__"}, {"const": "__APPEND__"},
{ {
"type": "object", "$ref": "#/definitions/panel"
"properties": {
"name": {
"description": "A name.",
"type": "string"
},
"label": {
"description": "A translatable label.",
"type": "string"
},
"view": {
"description": "A view class.",
"type": "string"
},
"options": {
"description": "Options to be passed to the view.",
"type": "object"
},
"isForm": {
"description": "Whether the panel should display a form.",
"type": "boolean"
},
"notRefreshable": {
"description": "Disable the ability to refresh the panel.",
"type": "boolean"
},
"style": {
"description": "A style.",
"enum": ["default", "success", "warning", "danger"]
},
"hidden": {
"description": "Hidden by default.",
"type": "boolean"
},
"aclScope": {
"description": "A scope access to which is required for the panel being visible.",
"type": "string"
},
"acl": {
"description": "An ACL action access to which is required for the panel being visible.",
"type": "string",
"enum": [
"create",
"read",
"edit",
"delete",
"stream"
]
},
"accessDataList": {
"$ref": "#/definitions/accessDataList"
}
}
} }
] ]
} }
@@ -1247,6 +1195,65 @@
} }
} }
} }
},
"panel": {
"type": "object",
"properties": {
"name": {
"description": "A name.",
"type": "string"
},
"label": {
"description": "A translatable label.",
"type": "string"
},
"view": {
"description": "A view class.",
"type": "string"
},
"options": {
"description": "Options to be passed to the view.",
"type": "object"
},
"isForm": {
"description": "Whether the panel should display a form.",
"type": "boolean"
},
"notRefreshable": {
"description": "Disable the ability to refresh the panel.",
"type": "boolean"
},
"style": {
"description": "A style.",
"enum": ["default", "success", "warning", "danger"]
},
"hidden": {
"description": "Hidden by default.",
"type": "boolean"
},
"aclScope": {
"description": "A scope access to which is required for the panel being visible.",
"type": "string"
},
"acl": {
"description": "An ACL action access to which is required for the panel being visible.",
"type": "string",
"enum": [
"create",
"read",
"edit",
"delete",
"stream"
]
},
"accessDataList": {
"$ref": "#/definitions/accessDataList"
},
"reference": {
"type": "string",
"description": "A panel reference name. Panels are defined in app > clientRecord > panels. As of v9.0."
}
}
} }
} }
} }