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>
</value>
</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">
<value>
<SchemaInfo>
+6
View File
@@ -184,6 +184,12 @@
],
"url": "./schema/metadata/app/client.json"
},
{
"fileMatch": [
"*/Resources/metadata/app/clientRecord.json"
],
"url": "./schema/metadata/app/clientRecord.json"
},
{
"fileMatch": [
"*/Resources/metadata/app/clientRoutes.json"
@@ -5,21 +5,15 @@
"detail": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
},
{
"name": "tasks",
"label": "Tasks",
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
"reference": "tasks"
}
]
}
@@ -5,21 +5,15 @@
"detail": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
},
{
"name": "tasks",
"label": "Tasks",
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
"reference": "tasks"
}
]
}
@@ -5,21 +5,15 @@
"detail": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
},
{
"name": "tasks",
"label": "Tasks",
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
"reference": "tasks"
}
]
}
@@ -8,41 +8,29 @@
"detail": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
},
{
"name": "tasks",
"label": "Tasks",
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
"reference": "tasks"
}
],
"detailSmall": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
},
{
"name": "tasks",
"label": "Tasks",
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
"reference": "tasks"
}
]
},
@@ -19,45 +19,35 @@
"checkVisibilityFunction": "isRejectAvailable"
}
],
"sidePanels":{
"detail":[
"sidePanels": {
"detail": [
{
"name":"activities",
"label":"Activities",
"view":"crm:views/case/record/panels/activities",
"aclScope": "Activities"
"name": "activities",
"reference": "activities",
"view": "crm:views/case/record/panels/activities"
},
{
"name":"history",
"label":"History",
"view":"crm:views/record/panels/history",
"aclScope": "Activities"
"name": "history",
"reference": "history"
},
{
"name":"tasks",
"label":"Tasks",
"view":"crm:views/record/panels/tasks",
"aclScope": "Task"
"name": "tasks",
"reference": "tasks"
}
],
"detailSmall":[
"detailSmall": [
{
"name":"activities",
"label":"Activities",
"view":"crm:views/case/record/panels/activities",
"aclScope": "Activities"
"name": "activities",
"reference": "activities",
"view": "crm:views/case/record/panels/activities"
},
{
"name":"history",
"label":"History",
"view":"crm:views/record/panels/history",
"aclScope": "Activities"
"name": "history",
"reference": "history"
},
{
"name":"tasks",
"label":"Tasks",
"view":"crm:views/record/panels/tasks",
"aclScope": "Task"
"name": "tasks",
"reference": "tasks"
}
]
},
@@ -12,41 +12,29 @@
"detail": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
},
{
"name": "tasks",
"label": "Tasks",
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
"reference": "tasks"
}
],
"detailSmall": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
},
{
"name": "tasks",
"label": "Tasks",
"view": "crm:views/record/panels/tasks",
"aclScope": "Task"
"reference": "tasks"
}
]
},
@@ -6,8 +6,8 @@
"recordViews":{
"detail":"crm:views/lead/record/detail"
},
"sidePanels":{
"detail":[
"sidePanels": {
"detail": [
{
"name":"convertedTo",
"label":"Converted To",
@@ -18,22 +18,16 @@
"isForm": true
},
{
"name":"activities",
"label":"Activities",
"view":"crm:views/record/panels/activities",
"aclScope":"Activities"
"name": "activities",
"reference": "activities"
},
{
"name":"history",
"label":"History",
"view":"crm:views/record/panels/history",
"aclScope":"Activities"
"name": "history",
"reference": "history"
},
{
"name":"tasks",
"label":"Tasks",
"view":"crm:views/record/panels/tasks",
"aclScope":"Task"
"name": "tasks",
"reference": "tasks"
}
],
"edit":[
@@ -47,7 +41,7 @@
"isForm": true
}
],
"detailSmall":[
"detailSmall": [
{
"name":"convertedTo",
"label":"Converted To",
@@ -58,22 +52,16 @@
"isForm": true
},
{
"name":"activities",
"label":"Activities",
"view":"crm:views/record/panels/activities",
"aclScope":"Activities"
"name": "activities",
"reference": "activities"
},
{
"name":"history",
"label":"History",
"view":"crm:views/record/panels/history",
"aclScope":"Activities"
"name": "history",
"reference": "history"
},
{
"name":"tasks",
"label":"Tasks",
"view":"crm:views/record/panels/tasks",
"aclScope":"Task"
"name": "tasks",
"reference": "tasks"
}
],
"editSmall":[
@@ -10,45 +10,35 @@
"list":"crm:views/opportunity/record/list",
"kanban": "crm:views/opportunity/record/kanban"
},
"sidePanels":{
"detail":[
"sidePanels": {
"detail": [
{
"name":"activities",
"label":"Activities",
"view":"crm:views/opportunity/record/panels/activities",
"aclScope": "Activities"
"name": "activities",
"reference": "activities",
"view": "crm:views/opportunity/record/panels/activities"
},
{
"name":"history",
"label":"History",
"view":"crm:views/record/panels/history",
"aclScope": "Activities"
"name": "history",
"reference": "history"
},
{
"name":"tasks",
"label":"Tasks",
"view":"crm:views/record/panels/tasks",
"aclScope": "Task"
"name": "tasks",
"reference": "tasks"
}
],
"detailSmall":[
"detailSmall": [
{
"name":"activities",
"label":"Activities",
"view":"crm:views/record/panels/activities",
"aclScope": "Activities"
"name": "activities",
"reference": "activities",
"view": "crm:views/opportunity/record/panels/activities"
},
{
"name":"history",
"label":"History",
"view":"crm:views/record/panels/history",
"aclScope": "Activities"
"name": "history",
"reference": "history"
},
{
"name":"tasks",
"label":"Tasks",
"view":"crm:views/record/panels/tasks",
"aclScope": "Task"
"name": "tasks",
"reference": "tasks"
}
]
},
@@ -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": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
}
],
"detailSmall": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
}
]
},
@@ -73,41 +73,31 @@
"detail": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
},
{
"name": "tasks",
"label": "Tasks",
"view": "crm:views/user/record/panels/tasks",
"aclScope": "Task"
"reference": "tasks",
"view": "crm:views/user/record/panels/tasks"
}
],
"detailSmall": [
{
"name": "activities",
"label": "Activities",
"view": "crm:views/record/panels/activities",
"aclScope": "Activities"
"reference": "activities"
},
{
"name": "history",
"label": "History",
"view": "crm:views/record/panels/history",
"aclScope": "Activities"
"reference": "history"
},
{
"name": "tasks",
"label": "Tasks",
"view": "crm:views/user/record/panels/tasks",
"aclScope": "Task"
"reference": "tasks",
"view": "crm:views/user/record/panels/tasks"
}
]
},
@@ -82,7 +82,14 @@ class LayoutBottomPanelsDetail extends LayoutSidePanelsDetailView {
(this.getMetadata()
.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) {
return;
}
@@ -150,7 +150,14 @@ class LayoutSidePanelsDetailView extends LayoutRowsView {
}
(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) {
return;
}
+17 -3
View File
@@ -50,9 +50,23 @@ class DetailBottomRecordView extends PanelsContainerRecordView {
setupPanels() {
const scope = this.scope;
this.panelList = Espo.Utils.clone(
this.getMetadata()
.get(['clientDefs', scope, 'bottomPanels', this.type]) || this.panelList || []);
this.panelList = this.getMetadata().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 => {
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) => {
if (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": [
{"const": "__APPEND__"},
{
"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"
}
}
"$ref": "#/definitions/panel"
}
]
}
@@ -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."
}
}
}
}
}