From 4f510dfcde4e177050a54a78f27421deb40b08d7 Mon Sep 17 00:00:00 2001 From: Dennis Bock Date: Mon, 27 Nov 2023 17:31:42 +0100 Subject: [PATCH] The dropdown entry for "Select the project type variant" (Please select) is not grayed out anymore (#464) prevent selecting documentation tab if not all parameters are set fixed problem where an empty id of "Externe Kopiervorlage" crashed the site save product templates inside the zip file in folder structure of disciplines --- client/public/style.css | 8 ++ client/src/components/header/SiteHeader.tsx | 87 +++++++++++-------- .../documentation/content/Content.tsx | 6 +- .../documentation/navigation/Navigation.tsx | 22 ++--- .../produktvorlagen/SubmitArea.tsx | 1 + .../server/model/ProductOfProject.java | 11 ++- .../server/model/SingleProduct.java | 11 ++- .../server/util/ProductBuilder.java | 14 ++- 8 files changed, 101 insertions(+), 59 deletions(-) diff --git a/client/public/style.css b/client/public/style.css index 5772a61d..2b21cb9d 100644 --- a/client/public/style.css +++ b/client/public/style.css @@ -136,3 +136,11 @@ ul.sideMenu > li > ul > li > ul > li > div { /* margin-top: 24px;*/ /*}*/ +/* Otherwise, the drop-down lists look as if they are disabled */ +.ant-select-selector > .ant-select-selection-placeholder { + color: rgba(0, 0, 0, 0.88); +} + +.disable-link{ + pointer-events: none; +} diff --git a/client/src/components/header/SiteHeader.tsx b/client/src/components/header/SiteHeader.tsx index 1650e0b7..cf7d533b 100644 --- a/client/src/components/header/SiteHeader.tsx +++ b/client/src/components/header/SiteHeader.tsx @@ -8,37 +8,6 @@ import { LinkWithQuery } from '../LinkWithQuery'; const { Header } = Layout; -const items: MenuProps['items'] = [ - { - label: Tailoring, - // Tailoring, - key: 'tailoring', - icon: , - }, - { - label: Dokumentation, - // label: Dokumentation, - key: 'dokumentation', - icon: , - }, - { - label: Produktvorlagen, - // label: Produktvorlagen, - key: 'productTemplates', - icon: , - }, - { - label: ( - Info - // - // Home - // - ), - key: 'info', - icon: , - }, -]; - // // // Home @@ -59,13 +28,55 @@ const items: MenuProps['items'] = [ export const SiteHeader = (props: any) => { const { tailoringParameter } = useTailoring(); - // const navigate = useNavigate(); - - // const handleMenuClick = ({ key: string }) => { - // if (key) { - // navigate(key); - // } - // }; + const items: MenuProps['items'] = [ + { + label: Tailoring, + key: 'tailoring', + icon: , + }, + { + label: ( + + Dokumentation + + ), + key: 'dokumentation', + icon: , + disabled: !tailoringParameter.projectTypeId, + }, + { + label: ( + + Produktvorlagen + + ), + key: 'productTemplates', + icon: , + disabled: !tailoringParameter.projectTypeId, + }, + { + label: ( + + Info + + ), + key: 'info', + icon: , + disabled: !tailoringParameter.modelVariantId, + }, + ]; const { error, image } = useImage(tailoringParameter.modelVariantId + '/ALLG-Logo-Farbe.gif'); diff --git a/client/src/components/projekthandbuch/documentation/content/Content.tsx b/client/src/components/projekthandbuch/documentation/content/Content.tsx index 190b034b..f282fae6 100644 --- a/client/src/components/projekthandbuch/documentation/content/Content.tsx +++ b/client/src/components/projekthandbuch/documentation/content/Content.tsx @@ -11,6 +11,7 @@ import { fixLinksInText, flatten, getJsonDataFromXml, + getMenuItemByAttributeValue, getSearchStringFromHash, replaceUrlInText, } from '../../../../shares/utils'; @@ -1949,10 +1950,13 @@ export function Content() { ); }; + const disciplineMenuEntry = getMenuItemByAttributeValue(navigationData, 'key', disciplineId); + const headerLabel = disciplineMenuEntry ? disciplineMenuEntry.label : ''; + return { id: 'externalTemplateContent', //jsonDataFromXml.attributes.id, // menuEntryId: jsonDataFromXml.attributes.id, - header: 'Disziplin', //jsonDataFromXml.attributes.name, + header: headerLabel, //jsonDataFromXml.attributes.name, descriptionText: '', tableEntries: [], dataSource: data, diff --git a/client/src/components/projekthandbuch/documentation/navigation/Navigation.tsx b/client/src/components/projekthandbuch/documentation/navigation/Navigation.tsx index ba2fb2dd..1df2c6ad 100644 --- a/client/src/components/projekthandbuch/documentation/navigation/Navigation.tsx +++ b/client/src/components/projekthandbuch/documentation/navigation/Navigation.tsx @@ -794,16 +794,18 @@ export function Navigation() { jsonDataFromXml.getElementsByTagName('ExterneKopiervorlage').map((externalMasterTemplate) => { const productRef = externalMasterTemplate.getElementsByTagName('ProduktRef')[0]; - const productToDisciplineEntryKey = productToDisciplineMap.get(productRef.attributes.id)!.key; - - if (!disciplineEntriesMap.get(productToDisciplineEntryKey)) { - disciplineEntriesMap.set(productToDisciplineEntryKey, { - key: 'td_' + productToDisciplineEntryKey, // TODO: check ! - parent: target, - label: productToDisciplineMap.get(productRef.attributes.id)!.title, // TODO: check ! - dataType: NavTypeEnum.TEMPLATE_DISCIPLINE, - onClick: (item: any) => handleSelectedItem(item.key), - }); + if (productRef.attributes.id) { + const productToDisciplineEntryKey = productToDisciplineMap.get(productRef.attributes.id)!.key; + + if (!disciplineEntriesMap.get(productToDisciplineEntryKey)) { + disciplineEntriesMap.set(productToDisciplineEntryKey, { + key: 'td_' + productToDisciplineEntryKey, // TODO: check ! + parent: target, + label: productToDisciplineMap.get(productRef.attributes.id)!.title, // TODO: check ! + dataType: NavTypeEnum.TEMPLATE_DISCIPLINE, + onClick: (item: any) => handleSelectedItem(item.key), + }); + } } }); diff --git a/client/src/components/projekthandbuch/produktvorlagen/SubmitArea.tsx b/client/src/components/projekthandbuch/produktvorlagen/SubmitArea.tsx index 86889dd9..66912832 100644 --- a/client/src/components/projekthandbuch/produktvorlagen/SubmitArea.tsx +++ b/client/src/components/projekthandbuch/produktvorlagen/SubmitArea.tsx @@ -59,6 +59,7 @@ export function SubmitArea() { if (product) { productOfProjectMap.set(product.product.id, { productName: product.product.title, + disciplineName: product.discipline.title, responsible: '', participants: [], chapters: getChaptersData(product.topics), diff --git a/server/src/main/java/online/projektassistent/server/model/ProductOfProject.java b/server/src/main/java/online/projektassistent/server/model/ProductOfProject.java index 72daf97b..2f5099e2 100644 --- a/server/src/main/java/online/projektassistent/server/model/ProductOfProject.java +++ b/server/src/main/java/online/projektassistent/server/model/ProductOfProject.java @@ -1,10 +1,9 @@ package online.projektassistent.server.model; -import java.util.List; -import java.util.Objects; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; +import java.util.List; +import java.util.Objects; @SuppressWarnings("unused") public class ProductOfProject { @@ -12,6 +11,8 @@ public class ProductOfProject { @NotBlank(message = "productName is mandatory") private String productName; + private String disciplineName; + @NotBlank(message = "responsible is mandatory") private String responsible; @@ -24,6 +25,10 @@ public String getProductName() { return productName; } + public String getDisciplineName() { + return disciplineName; + } + public String getResponsible() { return responsible; } diff --git a/server/src/main/java/online/projektassistent/server/model/SingleProduct.java b/server/src/main/java/online/projektassistent/server/model/SingleProduct.java index 6338f65e..901447c2 100644 --- a/server/src/main/java/online/projektassistent/server/model/SingleProduct.java +++ b/server/src/main/java/online/projektassistent/server/model/SingleProduct.java @@ -1,10 +1,9 @@ package online.projektassistent.server.model; -import java.util.List; -import java.util.Objects; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; +import java.util.List; +import java.util.Objects; @SuppressWarnings("unused") public class SingleProduct { @@ -12,6 +11,8 @@ public class SingleProduct { @NotBlank(message = "productName is mandatory") private String productName; + private String disciplineName; + @NotBlank(message = "responsible is mandatory") private String responsible; @@ -26,6 +27,10 @@ public String getProductName() { return productName; } + public String getDisciplineName() { + return disciplineName; + } + public String getResponsible() { return responsible; } diff --git a/server/src/main/java/online/projektassistent/server/util/ProductBuilder.java b/server/src/main/java/online/projektassistent/server/util/ProductBuilder.java index 99ef4679..5d21f153 100644 --- a/server/src/main/java/online/projektassistent/server/util/ProductBuilder.java +++ b/server/src/main/java/online/projektassistent/server/util/ProductBuilder.java @@ -36,10 +36,10 @@ public class ProductBuilder implements Placeholders { private final Logger logger = LoggerFactory.getLogger(ProductBuilder.class); /** - * Creates a single product and returns a byte array in doxc format + * Creates a single product and returns a byte array in docx format * * @param singleProduct container for all parameters - * @return bytes in doxc format + * @return bytes in docx format */ public byte[] createSingleProduct(SingleProduct singleProduct) throws IOException { Map dataParams = new HashMap<>(); @@ -84,7 +84,7 @@ public Path createMultipleProducts(MultiProducts multiProducts) throws IOExcepti } /** - * Creates multiple doxc files in temp directory + * Creates multiple docx files in temp directory * * @param products list of product parameters * @param dataParams map with project parameters @@ -109,7 +109,13 @@ private Map createProductTempFiles(List products template.write(out); Files.write(tempFile, out.toByteArray()); } - productsMap.put(FileUtil.sanitizeFilename(product.getProductName()) + ".docx", tempFile); + + String sanitizedDirectory = product.getDisciplineName(); + String sanitizedFilename = FileUtil.sanitizeFilename(product.getProductName()); + + String filename = sanitizedDirectory != null ? sanitizedDirectory + "/" + sanitizedFilename : sanitizedFilename; + + productsMap.put(filename + ".docx", tempFile); } catch (InvalidFormatException e) { throw new RuntimeException(e); }