Zum Hauptinhalt springen

Umstieg auf das neue React-File-Cover

Vorgehen​

Ist eine Migration überhaupt notwendig?​

Als erstes muss überprüft werden, ob ein Skript ou.cust.ptpINV.filetype.field.html.cover.ts existiert. Wenn nein, ist keine Migration notwendig.

Migration durchführen​

1. In der Funktion getCockpit muss folgender Code angepasst werden​

Vorher:

badges: {
discount: discountBadge,
netAmount: netAmountBadge
},
/* Code ab hier anpassen */
statusCodes,
verification: verifications,
/* Code anpassen Ende */

Nachher:

badges: {
discount: discountBadge,
netAmount: netAmountBadge
},
/* Neuer Code */
statusCodes: {
table: {
select: false,
showOptions: false,
showHeader: false,
showFooter: false,
hover: false,
border: false,
bordered: false,
striped: false,
columns: {
status: {
type: "icon",
label: "Status",
width: "30px"
},
message: {
label: "Info",
attributes: {
title: (_value, opts) => {
return opts.row.code || "";
}
}
}
},
rows: statusCodes
}
},
verification: {
table: {
select: false,
showOptions: false,
showHeader: false,
showFooter: false,
hover: false,
border: false,
bordered: false,
striped: false,
rowStyle: opts => {
return opts.row.isCurrent ? "font-weight: bold;" : "";
},
columns: {
status: {
type: "icon",
label: "Status",
width: "30px"
},
message: {
disableInternationalization: true,
label: "Info",
attributes: {
title: (value, opts) => {
return opts.row.tooltip || "";
}
}
}
},
rows: verifications
}
},
/* Ende neuer Code */

2. In der Funktion getHistory muss folgender Code angepasst werden​

Vorher:

/* Code ab hier anpassen */
rowStyle: opt => {
// @ts-expect-error untyped in client
if (!window.ptpInvoiceCoverInstance.history.selectedInvoice) {
return "";
}
// @ts-expect-error untyped in client
if (window.ptpInvoiceCoverInstance.history.selectedInvoice.invoiceNumber == opt.row.invoiceNumber) {
return "background-color: #f2f2f2";
}
return "";
},
/* Code anpassen Ende */

Nachher:

/* Neuer Code */
rowStyle: opt => {
if (!opt.table.additionalParams.selectedInvoice) {
return "";
}
if (typeof opt.table.additionalParams.selectedInvoice === "object" && "invoiceNumber" in opt.table.additionalParams.selectedInvoice && opt.table.additionalParams.selectedInvoice.invoiceNumber === opt.row.invoiceNumber) {
return "background-color: #f2f2f2";
}
return "";
},
/* Ende neuer Code */

3. In den Funktionen getVerificationData und getVerificationDataOther muss jeweils folgender Code angepasst werden​

Vorher:

rowStyle: opt => {
/* Code ab hier anpassen */
// @ts-expect-error untyped in client
if (window.ptpInvoiceCoverInstance.verification.current == opt.row.editor) {
return "cursor: default; border-left: 10px solid #4caf50;";
}
/* Code anpassen Ende */
return "";
},
columns: {
editor: {
label: "de:Rechnungsprüfer;en:verification user",
render: opt => {
/* Code ab hier anpassen */
// @ts-expect-error untyped in client
if (window.ptpInvoiceCoverInstance.verification.current == opt.row.editor) {
return `✔ <b>${opt.row.login}</b>`;
}
/* Code anpassen Ende */
return opt.row.login;
},
attributes: {
title: (value, opt) => {
/* Code ab hier anpassen */
// @ts-expect-error untyped in client
if (window.ptpInvoiceCoverInstance.verification.current == opt.row.editor) {
return `${opt.row.login} ist der aktuelle Rechnungsprüfer.`;
}
/* Code anpassen Ende */
return "";
}
}
},

Nachher:

rowStyle: opt => {
/* Neuer Code */
if (opt.table.additionalParams.current === opt.row.editor) {
return "cursor: default; border-left: 10px solid #4caf50;";
}
/* Ende neuer Code */
return "";
},
columns: {
editor: {
label: "de:Rechnungsprüfer;en:verification user",
render: opt => {
/* Neuer Code */
if (opt.table.additionalParams.current === opt.row.editor) {
return `✔ <b>${opt.row.login}</b>`;
}
/* Ende neuer Code */
return opt.row.login;
},
attributes: {
title: (value, opt) => {
/* Neuer Code */
if (opt.table.additionalParams.current === opt.row.editor) {
return `${opt.row.login} ist der aktuelle Rechnungsprüfer.`;
}
/* Ende neuer Code */
return "";
}
}
},

4. Hier muss noch der Export angepasst werden​

Vorher:

/* Code ab hier anpassen */
module.exports = docFile => {
/* Ende Code anpassen */
return {
// templates: {
// global: {
// start: getHtmlTemplate("ou.cust.ptpINV.filetype.field.html.cover.globalStart"),
// end: getHtmlTemplate("ou.cust.ptpINV.filetype.field.html.cover.globalEnd"),
// },
// vendor: {
// start: getHtmlTemplate("ou.cust.ptpINV.filetype.field.html.cover.vendorStart"),
// end: get

Nachher:

/* Neuer Code */
exports.getData = getData;

function getData(docFile) {
/* Ende neuer Code */
return {

5. Überprüfen, ob im HTML-Code selbst customizing vorgenommen wurde​

Dazu überprüfen, ob in diesem Skript im Daten-Objekt, das das Cover definiert, eine Eigenschaft templateUrl existiert, z.B. ou.cust.ptpINV.cover.html. Das bedeutet, es wurden Anpassungen am Invoice-Cover über ein Custom-Template vorgenommen. Andernfalls ist keine weitere Migration notwendig.

6. HTML-Customizing migrieren​

Falls ein anderes Custom Property hinterlegt ist als ou.sp.ptpINV.cover.html, muss der Unterschied zwischen dem Inhalt der beiden Custom Properties evaluiert und anhand der Anleitung unter React File-Cover Customizing eine Customizing-Strategie gewählt werden. Auch CSS-Anpassungen müssen hier beachtet werden.

tipp

Je nach Komplexität des vorhandenen Customizings lohnt es sich möglicherweise, hier einen Entwickler hinzuzuziehen.

7. Weitere Breaking Changes​

gefahr

Der clientseitige Zugriff auf das Cover über window.ptpInvoiceCoverInstance ist nicht mehr möglich.