diff --git a/sci-types-project/package.json b/sci-types-project/package.json new file mode 100644 index 0000000..ece91f8 --- /dev/null +++ b/sci-types-project/package.json @@ -0,0 +1,29 @@ +{ + "name": "sci-types-project", + "version: "7.0.0", + "description": "JavaScript parts of the UI of sci-types-project", + "main": "index.js", + "scripts": { + "build": "npm-run-all build:*", + "build:js": "webpack" + }, + "author": "Jens Pelzetter", + "license": "LGPL-3.0-or-later", + "devDependencies": { + "@types/jquery": "^3.5.6", + "@types/sortablejs": "^1.10.7", + "npm-run-all": "^4.1.5", + "sass": "^1.42.1", + "ts-loader": "^9.2.6", + "typescript": "^4.4.3", + "webpack": "^5.55.1", + "webpack-cli": "^4.8.0" + }, + "dependencies": { + "@librecms/ccm-cms": "7.0.0" + }, + "targets": { + "main": false + } + +} diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionContactsModel.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionContactsModel.java index 7b218f8..fbbd055 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionContactsModel.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionContactsModel.java @@ -20,6 +20,8 @@ public class SciProjectDescriptionContactsModel { private boolean canEdit; private List contacts; + + private String baseUrl; public boolean getCanEdit() { return canEdit; @@ -40,4 +42,12 @@ public class SciProjectDescriptionContactsModel { public String getContactableType() { return ContactableEntity.class.getName(); } + + public String getBaseUrl() { + return baseUrl; + } + + protected void setBaseUrl(final String baseUrl) { + this.baseUrl = baseUrl; + } } diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionMembersModel.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionMembersModel.java index 7e38396..dbfb255 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionMembersModel.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionMembersModel.java @@ -28,6 +28,8 @@ public class SciProjectDescriptionMembersModel { private List members; private Map statusValues; + + private String baseUrl; public boolean getCanEdit() { return canEdit; @@ -56,4 +58,12 @@ public class SciProjectDescriptionMembersModel { protected void setStatusValues(final Map statusValues) { this.statusValues = new LinkedHashMap<>(statusValues); } + + public String getBaseUrl() { + return baseUrl; + } + + protected void setBaseUrl(final String baseUrl) { + this.baseUrl = baseUrl; + } } diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionStep.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionStep.java index c495267..0885683 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionStep.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionStep.java @@ -20,6 +20,7 @@ package org.scientificcms.contenttypes.sciproject.ui; import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.security.AuthorizationRequired; +import org.libreccm.ui.BaseUrl; import org.librecms.assets.ContactableEntity; import org.librecms.assets.Person; import org.librecms.contentsection.AssetRepository; @@ -53,12 +54,14 @@ import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.mvc.Controller; import javax.mvc.Models; +import javax.servlet.http.HttpServletRequest; import javax.transaction.Transactional; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; +import javax.ws.rs.core.Context; /** * @@ -80,6 +83,9 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { @Inject private AssetRepository assetRepo; + + @Inject + private BaseUrl baseUrl; @Inject private ContentItemRepository itemRepo; @@ -93,6 +99,9 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { @Inject private GlobalizationHelper globalizationHelper; + @Context + private HttpServletRequest request; + @Inject private ItemPermissionChecker itemPermissionChecker; @@ -179,7 +188,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -222,7 +231,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -256,7 +265,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -291,7 +300,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -325,7 +334,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -369,7 +378,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -421,7 +430,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -469,7 +478,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -525,7 +534,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -580,7 +589,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -628,7 +637,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -683,6 +692,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { .map(this::buildContactModel) .collect(Collectors.toList()) ); + contactsModel.setBaseUrl(baseUrl.getBaseUrl(request)); membersModel.setCanEdit(canEdit); membersModel.setMembers( @@ -709,6 +719,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep { ) ) ); + membersModel.setBaseUrl(baseUrl.getBaseUrl(request)); } } diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectFundingSponsoringModel.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectFundingSponsoringModel.java index af8b0eb..0743616 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectFundingSponsoringModel.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectFundingSponsoringModel.java @@ -1,5 +1,7 @@ package org.scientificcms.contenttypes.sciproject.ui; +import org.librecms.assets.Organization; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -9,18 +11,20 @@ import javax.inject.Named; /** * - * + * * @author Jens Pelzetter */ @RequestScoped @Named("SciProjectFundingSponsoring") public class SciProjectFundingSponsoringModel { - + private boolean canEdit; - + private List sponsoring; - - public boolean getCanEdit() { + + private String baseUrl; + + public boolean getCanEdit() { return canEdit; } @@ -37,5 +41,17 @@ public class SciProjectFundingSponsoringModel { ) { this.sponsoring = new ArrayList<>(sponsoring); } - + + public String getSponsorType() { + return Organization.class.getName(); + } + + public String getBaseUrl() { + return baseUrl; + } + + protected void setBaseUrl(final String baseUrl) { + this.baseUrl = baseUrl; + } + } diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectFundingStep.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectFundingStep.java index 186b9f0..b96e601 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectFundingStep.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectFundingStep.java @@ -2,6 +2,7 @@ package org.scientificcms.contenttypes.sciproject.ui; import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.security.AuthorizationRequired; +import org.libreccm.ui.BaseUrl; import org.librecms.assets.Organization; import org.librecms.contentsection.AssetRepository; import org.librecms.contentsection.ContentItemRepository; @@ -28,12 +29,14 @@ import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.mvc.Controller; import javax.mvc.Models; +import javax.servlet.http.HttpServletRequest; import javax.transaction.Transactional; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; +import javax.ws.rs.core.Context; /** * @@ -55,6 +58,9 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { @Inject private AssetRepository assetRepo; + + @Inject + private BaseUrl baseUrl; @Inject private ContentItemRepository itemRepo; @@ -65,6 +71,9 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { @Inject private GlobalizationHelper globalizationHelper; + @Context + private HttpServletRequest request; + @Inject private ItemPermissionChecker itemPermissionChecker; @@ -115,7 +124,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -149,7 +158,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -191,7 +200,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -225,7 +234,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -260,7 +269,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -294,7 +303,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -328,7 +337,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -370,7 +379,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -404,7 +413,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -439,7 +448,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -473,7 +482,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -481,7 +490,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { @POST @Path("/sponsoring/add") @Transactional(Transactional.TxType.REQUIRED) - public String addSponsoringing( + public String addSponsoring( @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) final String sectionIdentifier, @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) @@ -516,7 +525,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -567,7 +576,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -615,7 +624,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getProject(), - sciProjectMessageBundle.getMessage("event.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } @@ -705,6 +714,7 @@ public class SciProjectFundingStep extends AbstractMvcAuthoringStep { .map(this::buildSponsoringModel) .collect(Collectors.toList()) ); + sponsoringModel.setBaseUrl(baseUrl.getBaseUrl(request)); } } diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectMembershipModel.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectMembershipModel.java index ffd5465..1c877e0 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectMembershipModel.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectMembershipModel.java @@ -106,6 +106,8 @@ public class SciProjectMembershipModel { builder.append(" "); builder.append(suffix); } + + return builder.toString(); } public String getGivenName() { diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectPropertiesStep.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectPropertiesStep.java index 45f3255..6548138 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectPropertiesStep.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectPropertiesStep.java @@ -184,7 +184,7 @@ public class SciProjectPropertiesStep extends AbstractMvcAuthoringStep { return documentUi.showAccessDenied( getContentSection(), getDocument(), - sciProjectMessageBundle.getMessage("project.edit.denied") + sciProjectMessageBundle.getMessage("sciproject.edit.denied") ); } } diff --git a/sci-types-project/src/main/java/org/scientificcms/pagemodel/contentitems/SciProjectRenderer.java b/sci-types-project/src/main/java/org/scientificcms/pagemodel/contentitems/SciProjectRenderer.java deleted file mode 100644 index 7478dc4..0000000 --- a/sci-types-project/src/main/java/org/scientificcms/pagemodel/contentitems/SciProjectRenderer.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.scientificcms.pagemodel.contentitems; - -import org.librecms.assets.ContactableEntity; -import org.librecms.assets.Organization; -import org.librecms.assets.Person; -import org.librecms.contentsection.ContentItem; -import org.librecms.pagemodel.assets.AbstractAssetRenderer; -import org.librecms.pagemodel.assets.AssetRenderers; -import org.librecms.pagemodel.contentitems.AbstractContentItemRenderer; -import org.librecms.pagemodel.contentitems.ContentItemRenderer; -import org.scientificcms.contenttypes.sciproject.Contact; -import org.scientificcms.contenttypes.sciproject.Membership; -import org.scientificcms.contenttypes.sciproject.SciProject; -import org.scientificcms.contenttypes.sciproject.Sponsoring; - -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.stream.Collectors; - -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; - -/** - * - * @author Jens Pelzetter - */ -@ContentItemRenderer(renders = SciProject.class) -@RequestScoped -public class SciProjectRenderer extends AbstractContentItemRenderer { - - private static final long serialVersionUID = 1L; - - @Inject - private AssetRenderers assetRenderers; - - @Override - protected void renderItem(final ContentItem item, - final Locale language, - final Map result) { - - final SciProject project; - if (item instanceof SciProject) { - project = (SciProject) item; - } else { - return; - } - - result.put("begin", project.getBegin()); - result.put("end", project.getEnd()); - - result.put("shortDescription", - project.getShortDescription().getValue(language)); - result.put("projectDescription", - project.getProjectDescription().getValue(language)); - result.put("funding", - project.getFunding().getValue(language)); - result.put("fundingVolume", - project.getFundingVolume().getValue(language)); - - result.put("contacts", - project - .getContacts() - .stream() - .map(contact -> renderContact(contact, language)) - .collect(Collectors.toList()) - ); - result.put("members", - project - .getMembers() - .stream() - .map(member -> renderMember(member, language)) - .collect(Collectors.toList())); - result.put("sponsoring", - project - .getSponsoring() - .stream() - .map(sponsoring -> renderSponsoring(sponsoring, language)) - .collect(Collectors.toList())); - } - - @Override - protected AssetRenderers getAssetRenderers() { - return assetRenderers; - } - - private Map renderContact(final Contact contact, - final Locale language) { - - final Map result = new HashMap<>(); - result.put("contactId", contact.getContactId()); - result.put("contactType", contact.getContactType()); - result.put("order", contact.getOrder()); - - final ContactableEntity contactable = contact.getContactable(); - final AbstractAssetRenderer contactableRenderer = assetRenderers - .findRenderer(contactable.getClass()); - result.put("contactable", contactableRenderer.render(contactable, - language)); - - return result; - } - - private Map renderMember(final Membership membership, - final Locale language) { - - final Map result = new HashMap<>(); - result.put("membershipId", membership.getMembershipId()); - result.put("role", membership.getRole()); - result.put("status", membership.getStatus().toString()); - - final Person member = membership.getMember(); - final AbstractAssetRenderer memberRenderer = assetRenderers - .findRenderer(member.getClass()); - result.put("member", memberRenderer.render(member, language)); - - return result; - } - - private Map renderSponsoring(final Sponsoring sponsoring, - final Locale language) { - - final Map result = new HashMap<>(); - result.put("sponsoringId", sponsoring.getSponsoringId()); - result.put("fundingCode", sponsoring.getFundingCode()); - result.put("order", sponsoring.getOrder()); - - final Organization sponsor = sponsoring.getSponsor(); - final AbstractAssetRenderer sponsorRenderer = assetRenderers - .findRenderer(sponsor.getClass()); - result.put("sponsor", sponsorRenderer.render(sponsor, language)); - - return result; - } - -} diff --git a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/description/edit.xhtml b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/description/edit.xhtml new file mode 100644 index 0000000..b1f4d1f --- /dev/null +++ b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/description/edit.xhtml @@ -0,0 +1,44 @@ +]> + + + + +
+ + + #{SciProjectMessageBundle['description_step.back']} + + +

#{SciProjectMessageBundle['description_step.description.header.edit']}

+
+ + + + + +
+ + + + + +
+ + diff --git a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/description/view.xhtml b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/description/view.xhtml new file mode 100644 index 0000000..346d2ca --- /dev/null +++ b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/description/view.xhtml @@ -0,0 +1,37 @@ +]> + + + + +
+ + + #{SciProjectMessageBundle['description_step.back']} + + +

#{SciProjectMessageBundle['description_step.description.header.view']}

+
+ + + + +
+ +
+ +
+ + diff --git a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingtext/edit.xhtml b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingtext/edit.xhtml new file mode 100644 index 0000000..420157e --- /dev/null +++ b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingtext/edit.xhtml @@ -0,0 +1,44 @@ +]> + + + + +
+ + + #{SciProjectMessageBundle['funding_step.back']} + + +

#{SciProjectMessageBundle['funding_step.fundingtext.header.edit']}

+
+ + + + + +
+ + + + + +
+ + diff --git a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingtext/view.xhtml b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingtext/view.xhtml new file mode 100644 index 0000000..a75c218 --- /dev/null +++ b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingtext/view.xhtml @@ -0,0 +1,37 @@ +]> + + + + +
+ + + #{SciProjectMessageBundle['funding_step.back']} + + +

#{SciProjectMessageBundle['funding_step.fundingtext.header.view']}

+
+ + + + +
+ +
+ +
+ + diff --git a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingvolume/edit.xhtml b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingvolume/edit.xhtml new file mode 100644 index 0000000..2267b1e --- /dev/null +++ b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingvolume/edit.xhtml @@ -0,0 +1,44 @@ +]> + + + + +
+ + + #{SciProjectMessageBundle['funding_step.back']} + + +

#{SciProjectMessageBundle['funding_step.fundingvolume.header.edit']}

+
+ + + + + +
+ + + + + +
+ + diff --git a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingvolume/view.xhtml b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingvolume/view.xhtml new file mode 100644 index 0000000..0222aa5 --- /dev/null +++ b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/fundingvolume/view.xhtml @@ -0,0 +1,37 @@ +]> + + + + +
+ + + #{SciProjectMessageBundle['funding_step.back']} + + +

#{SciProjectMessageBundle['funding_step.fundingvolume.header.view']}

+
+ + + + +
+ +
+ +
+ + diff --git a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/sciproject-basic-properties.xhtml b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/sciproject-basic-properties.xhtml index a4839ce..85042f6 100644 --- a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/sciproject-basic-properties.xhtml +++ b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/sciproject-basic-properties.xhtml @@ -11,7 +11,7 @@ value="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documents/#{CmsSelectedDocumentModel.itemPath}/@sciproject-basicproperties" /> -

#{SciProjectMessageBundle.getMessage('basicproperties.header', [SciProjectPropertiesSteo.name])}

+

#{SciProjectMessageBundle.getMessage('basicproperties.header', [SciProjectPropertiesStep.name])}

#{SciProjectMessageBundle['basicproperties.name.header']}

@@ -152,13 +152,13 @@
@@ -258,12 +260,12 @@ @@ -271,8 +273,11 @@ - - +
+ + + + + + + + + diff --git a/sci-types-project/src/main/resources/org/scientificcms/contenttypes/sciproject/ui/SciProjectBundle.properties b/sci-types-project/src/main/resources/org/scientificcms/contenttypes/sciproject/ui/SciProjectBundle.properties new file mode 100644 index 0000000..e0be634 --- /dev/null +++ b/sci-types-project/src/main/resources/org/scientificcms/contenttypes/sciproject/ui/SciProjectBundle.properties @@ -0,0 +1,148 @@ + +sciproject.edit.denied=Access denied +members.status.active=Active +members.status.associated=Associated +members.status.former=Former +basicproperties.header=Edit basic properties of project {0} +basicproperties.name.header=Name +basicproperties.name.edit=Edit name +basicproperties.name.edit.title=Edit name +basicproperties.name.edit.close=Cancel +basicproperties.name.help=The name of the project. Also used as URL fragment. +basicproperties.name.label=Name +basicproperties.name.edit.submit=Save +basicproperties.title.add=Add a localized title +basicproperties.title.add.cancel=Cancel +basicproperties.title.add.locale.help=The locale of the localized title. +basicproperties.title.add.locale.label=Locale +basicproperties.title.add.submit=Add +basicproperties.title.add.header=Add localized title +basicproperties.title.add.value.help=The localized title. +basicproperties.title.add.value.label=Title +basicproperties.title.edit=Edit +basicproperties.title.edit.cancel=Cancel +basicproperties.title.edit.submit=Save +basicproperties.title.edit.header=Edit localized title +basicproperties.title.edit.value.help=The localized title. +basicproperties.title.edit.value.label=Title +basicproperties.title.remove=Remove +basicproperties.title.remove.cancel=Cancel +basicproperties.title.remove.submit=Remove +basicproperties.title.remove.text=Are you sure to remove this localized title? +basicproperties.title.remove.header=Confirm removal of localized title +basicproperties.title.header=Title +basicproperties.begin.header=Begin of the project +basicproperties.begin.edit=Edit +basicproperties.begin.label=Begin +basicproperties.begin.edit.dialog.title=Edit +basicproperties.begin.edit.dialog.close=Cancel +basicproperties.begin.edit.dialog.startdate.help=The begin of the project +basicproperties.begin.edit.dialog.startdate.label=Begin +basicproperties.begin.edit.dialog.submit=Save +basicproperties.end.header=End of the project +basicproperties.end.edit=Edit +basicproperties.end.label=End +basicproperties.end.edit.dialog.title=Edit end of the project +basicproperties.end.edit.dialog.close=Cancel +basicproperties.end.edit.dialog.enddate.help=The end of the project +basicproperties.end.edit.dialog.enddate.label=End +basicproperties.end.edit.dialog.submit=Save +basicproperties.shortdescription.add=Add +basicproperties.shortdescription.add.cancel=Cancel +basicproperties.shortdescription.add.locale.help=The locale of the localized short description. +basicproperties.shortdescription.add.locale.label=Locale +basicproperties.shortdescription.add.submit=Add +basicproperties.shortdescription.add.header=Add a localized short description +basicproperties.shortdescription.add.value.help=The localized short description. +basicproperties.shortdescription.add.value.label=Short description +basicproperties.shortdescription.edit=Edit +basicproperties.shortdescription.edit.cancel=Cancel +basicproperties.shortdescription.edit.submit=Save +basicproperties.shortdescription.edit.header=Edit localized short description +basicproperties.shortdescription.edit.value.help=The localized short description. +basicproperties.shortdescription.edit.value.label=Short description +basicproperties.shortdescription.remove=Remove +basicproperties.shortdescription.remove.cancel=Cancel +basicproperties.shortdescription.remove.submit=Remove +basicproperties.shortdescription.remove.text=Are you sure to remove this localized short description? +basicproperties.shortdescription.remove.header=Confirm removal of localized short description +basicproperties.shortdescription.header=Short description +description_step.header=Project description +description.editor.add_variant=Add +description.editor.add.locale.help=The locale of the localized description +description.editor.header=Description +contacts.header=Contacts +contacts.add_button.label=Add +contacts.type.help=The type of the contact. +contacts.type.label=Type +contacts.cols.contactable=Contact +contacts.cols.type=Type +contacts.cols.actions=Actions +contacts.edit.label=Edit +contacts.edit.title=Add a contact +contacts.edit.cancel=Cancel +contacts.edit.type.help=The type of the contact. +contacts.edit.type.label=Type +contacts.edit.submit=Add +contacts.delete.label=Remove +contacts.delete.cancel=Cancel +contacts.delete.confirm=Remove +contacts.delete.title=Confirm removal of contact +contacts.delete.message=Are you sure to remove the contact {0} of type {1}? +memberships.header=Members +memberships.add_button.label=Add +memberships.role.help=The role of the member in the project. +memberships.role.label=Role +memberships.status.help=The status of the membership. +memberships.status.label=Status +memberships.cols.name=Name +memberships.cols.role=Role +memberships.cols.status=Status +memberships.cols.actions=Actions +memberships.edit.label=Edit +memberships.edit.cancel=Cancel +memberships.edit.role.help=The role of the member in the project. +memberships.edit.role.label=Role +memberships.edit.status.help=The status of the membership. +memberships.edit.status.label=Status +members.edit.cancel=Cancel +members.edit.submit=Save +memberships.delete.label=Remove +memberships.delete.cancel=Cancel +memberships.delete.confirm=Remove +memberships.delete.title=Confirm removal of member +memberships.delete.message=Are your sure to remove the member {0} from the project? +funding_step.header=Funding +funding.editor.add_variant=Add +funding.editor.add.locale.help=The locale of the localized text. +funding.editor.header=Funding +fundingvolume.editor.add_variant=Add +fundingvolume.editor.add.locale.help=The locale of the localized text. +fundingvolume.editor.header=Volume of funding +sponsoring.header=Sponsoring +sponsoring.add_button.label=Add +sponsoring.fundingcode.help=An optional funding code of the sponsor. +sponsoring.fundingcode.label=Funding code +sponsoring.cols.sponsor=Organization +sponsoring.cols.fundingcode=Funding code +sponsoring.cols.actions=Actions +sponsoring.edit.label=Edit +sponsoring.edit.title=Edit sponsoring +sponsoring.edit.cancel=Cancel +sponsoring.edit.submit=Save +sponsoring.remove.label=Remove +sponsoring.remove.cancel=Cancel +sponsoring.remove.confirm=Remove +sponsoring.remove.title=Remove sponsoring +sponsoring.remove.message=Are you sure to remove the sponsoring of {0} from the project? +description_step.back=Back +description_step.description.header.edit=Edit the description of the project +description_step.description.header.view=Project description +description_step.edit=Edit project description +funding_step.back=Back +funding_step.fundingtext.header.edit=Edit description of funding +fundingtext.editor.header=Funding +funding_step.fundingtext.header.view=Description of funding +funding_step.edit=Edit +funding_step.fundingvolume.header.edit=Edit description of volume of funding +funding_step.fundingvolume.header.view=Description of the volume of funding diff --git a/sci-types-project/src/main/resources/org/scientificcms/contenttypes/sciproject/ui/SciProjectBundle_de.properties b/sci-types-project/src/main/resources/org/scientificcms/contenttypes/sciproject/ui/SciProjectBundle_de.properties new file mode 100644 index 0000000..e12ccd8 --- /dev/null +++ b/sci-types-project/src/main/resources/org/scientificcms/contenttypes/sciproject/ui/SciProjectBundle_de.properties @@ -0,0 +1,148 @@ + +sciproject.edit.denied=Zugriff verweigert +members.status.active=Aktiv +members.status.associated=Assoziert +members.status.former=Ehemalig +basicproperties.header=Basiseigenschaften des Projektes {0} bearbeiten +basicproperties.name.header=Name +basicproperties.name.edit=Name bearbeiten +basicproperties.name.edit.title=Name bearbeiten +basicproperties.name.edit.close=Abbrechen +basicproperties.name.help=Der Name des Projektes. Wird auch als URL fragment verwendet. +basicproperties.name.label=Name +basicproperties.name.edit.submit=Speichern +basicproperties.title.add=Lokalisierten Titel hinzuf\u00fcgen +basicproperties.title.add.cancel=Abbrechen +basicproperties.title.add.locale.help=Die Sprache des lokalisierten Titels. +basicproperties.title.add.locale.label=Sprache +basicproperties.title.add.submit=Hinzuf\u00fcgen +basicproperties.title.add.header=Lokalisierten Titel hinzuf\u00fcgen +basicproperties.title.add.value.help=Der lokalisierte Titel. +basicproperties.title.add.value.label=Titel +basicproperties.title.edit=Bearbeiten +basicproperties.title.edit.cancel=Abbrechen +basicproperties.title.edit.submit=Speichern +basicproperties.title.edit.header=Lokalisierten Titel bearbeiten +basicproperties.title.edit.value.help=Der lokalisierte Titel. +basicproperties.title.edit.value.label=Titel +basicproperties.title.remove=Entfernen +basicproperties.title.remove.cancel=Abbrechen +basicproperties.title.remove.submit=Entfernen +basicproperties.title.remove.text=Sind Sie sicher dass Sie diesen lokalisierten Titel entfernen wollen? +basicproperties.title.remove.header=Entfernen eines lokalisierten Titels entfernen +basicproperties.title.header=Titel +basicproperties.begin.header=Beginn des Projektes +basicproperties.begin.edit=Bearbeiten +basicproperties.begin.label=Beginn +basicproperties.begin.edit.dialog.title=Bearbeiten +basicproperties.begin.edit.dialog.close=Abbrechen +basicproperties.begin.edit.dialog.startdate.help=Der Beginn des Projektes +basicproperties.begin.edit.dialog.startdate.label=Beginn +basicproperties.begin.edit.dialog.submit=Speichern +basicproperties.end.header=Ende des Projektes +basicproperties.end.edit=Bearbeiten +basicproperties.end.label=Ende +basicproperties.end.edit.dialog.title=Ende des Projektes bearbeiten +basicproperties.end.edit.dialog.close=Abbrechen +basicproperties.end.edit.dialog.enddate.help=Das Ende des Projektes +basicproperties.end.edit.dialog.enddate.label=Ende +basicproperties.end.edit.dialog.submit=Speichern +basicproperties.shortdescription.add=Hinzuf\u00fcgen +basicproperties.shortdescription.add.cancel=Abbrechen +basicproperties.shortdescription.add.locale.help=Die Sprache der lokaliserten Kurzbeschreibung. +basicproperties.shortdescription.add.locale.label=Sprache +basicproperties.shortdescription.add.submit=Hinzuf\u00fcgen +basicproperties.shortdescription.add.header=Eine lokaliserte Kurzbeschreibung hinzuf\u00fcgen +basicproperties.shortdescription.add.value.help=Die lokalisierte Kurzbeschreibung. +basicproperties.shortdescription.add.value.label=Kurzbeschreibung +basicproperties.shortdescription.edit=Bearbeiten +basicproperties.shortdescription.edit.cancel=Abbrechen +basicproperties.shortdescription.edit.submit=Speichern +basicproperties.shortdescription.edit.header=Lokalisierte Kurzbeschreibung bearbeiten +basicproperties.shortdescription.edit.value.help=Die lokalisierte Kurzbeschreibung. +basicproperties.shortdescription.edit.value.label=Kurzbeschreibung +basicproperties.shortdescription.remove=Entfernen +basicproperties.shortdescription.remove.cancel=Abbrechen +basicproperties.shortdescription.remove.submit=Entfernen +basicproperties.shortdescription.remove.text=Sind Sie sicher, dass Sie diese lokaliserte Kurzbeschreibung entfernen wollen? +basicproperties.shortdescription.remove.header=Entfernen einer lokalisierten Kurzbeschreibung best\u00e4tigen +basicproperties.shortdescription.header=Kurzbeschreibung +description_step.header=Projektbeschreibung +description.editor.add_variant=Hinzuf\u00fcgen +description.editor.add.locale.help=Die Sprache der lokalisierten Beschreibung +description.editor.header=Beschreibung +contacts.header=Kontakte +contacts.add_button.label=Hinzuf\u00fcgen +contacts.type.help=Der Typ des Kontaktes. +contacts.type.label=Typ +contacts.cols.contactable=Kontakt +contacts.cols.type=Typ +contacts.cols.actions=Aktionen +contacts.edit.label=Bearbeiten +contacts.edit.title=Kontakt hinzuf\u00fcgen +contacts.edit.cancel=Abbrechen +contacts.edit.type.help=Der Typ des Kontaktes. +contacts.edit.type.label=Typ +contacts.edit.submit=Hinzuf\u00fcgen +contacts.delete.label=Entfernen +contacts.delete.cancel=Abbrechen +contacts.delete.confirm=Entfernen +contacts.delete.title=Entfernen des Kontaktes best\u00e4tigen +contacts.delete.message=Sind Sie sicher, dass Sie den Kontakt {0} vom Type {1} entfernen wollen? +memberships.header=Mitglieder +memberships.add_button.label=Entfernen +memberships.role.help=Die Rolle des Mitglieds im Projekt. +memberships.role.label=Rolle +memberships.status.help=Der Status der Mitgliedschaft. +memberships.status.label=Status +memberships.cols.name=Name +memberships.cols.role=Rolle +memberships.cols.status=Status +memberships.cols.actions=Aktionen +memberships.edit.label=Bearbeiten +memberships.edit.cancel=Abbrechen +memberships.edit.role.help=Die Rolle des Mitglieds im Projekt. +memberships.edit.role.label=Rolle +memberships.edit.status.help=Der Status der Mitgliedschaft. +memberships.edit.status.label=Status +members.edit.cancel=Abbrechen +members.edit.submit=Speichern +memberships.delete.label=Entfernen +memberships.delete.cancel=Abbrechen +memberships.delete.confirm=Entfernen +memberships.delete.title=Entfernen eines Mitglieds best\u00e4tigen +memberships.delete.message=Sind Sie sicher, dass Sie das Mitglied {0} aus dem Projekt entfernen wollen? +funding_step.header=Finanzierung +funding.editor.add_variant=Hinzuf\u00fcgen +funding.editor.add.locale.help=The Sprache des lokalisierten Textes. +funding.editor.header=Finanzierung +fundingvolume.editor.add_variant=Hinzuf\u00fcgen +fundingvolume.editor.add.locale.help=The Sprache des lokalisierten Textes. +fundingvolume.editor.header=Volumen der Finanzierung +sponsoring.header=Finanziert durch +sponsoring.add_button.label=Hinzuf\u00fcgen +sponsoring.fundingcode.help=Eine optinale Angabe zur Finanzierung +sponsoring.fundingcode.label=Bezeichnung +sponsoring.cols.sponsor=Organisation +sponsoring.cols.fundingcode=Bezeichnung +sponsoring.cols.actions=Aktionen +sponsoring.edit.label=Bearbeiten +sponsoring.edit.title=Finanzierung bearbeiten +sponsoring.edit.cancel=Abbrechen +sponsoring.edit.submit=Speichern +sponsoring.remove.label=Entfernen +sponsoring.remove.cancel=Abbrechen +sponsoring.remove.confirm=Entfernen +sponsoring.remove.title=Finanzierung entfernen +sponsoring.remove.message=Sind Sie sicher dass Sie die Finanzierung durch {0} aus dem Projekt entfernen wollen? +description_step.back=Zur\u00fcck +description_step.description.header.edit=Projektbeschreibung bearbeiten +description_step.description.header.view=Projektbeschreibung +description_step.edit=Projektbeschreibung bearbeiten +funding_step.back=Zur\u00fcck +funding_step.fundingtext.header.edit=Beschreibung der Finanzierung bearbeiten +fundingtext.editor.header=Finanzierung +funding_step.fundingtext.header.view=Beschreibung der Finanzierung +funding_step.edit=Bearbeiten +funding_step.fundingvolume.header.edit=Beschreibung des Volumens der Finanzierung bearbeiten +funding_step.fundingvolume.header.view=Beschreibung des Volumens der Finanzierung diff --git a/sci-types-project/src/main/typescript/sciproject-description.ts b/sci-types-project/src/main/typescript/sciproject-description.ts new file mode 100644 index 0000000..4ba941f --- /dev/null +++ b/sci-types-project/src/main/typescript/sciproject-description.ts @@ -0,0 +1,51 @@ +import { CmsEditorBuilder, CmsEditor} from @librecms/ccm-cms; + +document.addEventListener("DOMContentLoaded", (event) => { + const editorElem = document.querySelector("#sciproject-description-editor"); + + if (editorElem) { + const saveUrl = editorElem.getAttribute("data-save-url"); + const variantUrl = editorElem.getAttribute("data-variant-url"); + + if (!saveUrl) { + console.error("saveUrl is null"); + return; + } + + if (!variantUrl) { + console.error("variantUrl is null"); + return; + } + + const builder = new CmsEditorBuilder( + editorElem as HTMLElement, + saveUrl, + variantUrl + ); + + builder + .buildEditor() + .then((editor) => { + const submitButton = document.querySelector( + ".cms-editor-save-button" + ); + + if (submitButton) { + submitButton.addEventListener("click", (event) => { + event.preventDefault(); + + console.log("HTML output of editor: "); + console.log(editor.getEditor().getHTML()); + }); + } else { + console.error("Save button not found.") + } + }) + .catch((error) => { + console.error(error); + console.trace(error); + }); + } else { + console.error("Editor element not found.") + } +} diff --git a/sci-types-project/src/main/typescript/sciproject-fundingtext.ts b/sci-types-project/src/main/typescript/sciproject-fundingtext.ts new file mode 100644 index 0000000..8529626 --- /dev/null +++ b/sci-types-project/src/main/typescript/sciproject-fundingtext.ts @@ -0,0 +1,51 @@ +import { CmsEditorBuilder, CmsEditor} from "@librecms/ccm-cms"; + +document.addEventListener("DOMContentLoaded", (event) => { + const editorElem = document.querySelector("#sciproject-fundingtext-editor"); + + if (editorElem) { + const saveUrl = editorElem.getAttribute("data-save-url"); + const variantUrl = editorElem.getAttribute("data-variant-url"); + + if (!saveUrl) { + console.error("saveUrl is null"); + return; + } + + if (!variantUrl) { + console.error("variantUrl is null"); + return; + } + + const builder = new CmsEditorBuilder( + editorElem as HTMLElement, + saveUrl, + variantUrl + ); + + builder + .buildEditor() + .then((editor) => { + const submitButton = document.querySelector( + ".cms-editor-save-button" + ); + + if (submitButton) { + submitButton.addEventListener("click", (event) => { + event.preventDefault(); + + console.log("HTML output of editor: "); + console.log(editor.getEditor().getHTML()); + }); + } else { + console.error("Save button not found.") + } + }) + .catch((error) => { + console.error(error); + console.trace(error); + }); + } else { + console.error("Editor element not found.") + } +} diff --git a/sci-types-project/src/main/typescript/sciproject-fundingvolume.ts b/sci-types-project/src/main/typescript/sciproject-fundingvolume.ts new file mode 100644 index 0000000..bf2373c --- /dev/null +++ b/sci-types-project/src/main/typescript/sciproject-fundingvolume.ts @@ -0,0 +1,51 @@ +import { CmsEditorBuilder, CmsEditor} from "@librecms/ccm-cms"; + +document.addEventListener("DOMContentLoaded", (event) => { + const editorElem = document.querySelector("#sciproject-funding-volume-editor"); + + if (editorElem) { + const saveUrl = editorElem.getAttribute("data-save-url"); + const variantUrl = editorElem.getAttribute("data-variant-url"); + + if (!saveUrl) { + console.error("saveUrl is null"); + return; + } + + if (!variantUrl) { + console.error("variantUrl is null"); + return; + } + + const builder = new CmsEditorBuilder( + editorElem as HTMLElement, + saveUrl, + variantUrl + ); + + builder + .buildEditor() + .then((editor) => { + const submitButton = document.querySelector( + ".cms-editor-save-button" + ); + + if (submitButton) { + submitButton.addEventListener("click", (event) => { + event.preventDefault(); + + console.log("HTML output of editor: "); + console.log(editor.getEditor().getHTML()); + }); + } else { + console.error("Save button not found.") + } + }) + .catch((error) => { + console.error(error); + console.trace(error); + }); + } else { + console.error("Editor element not found.") + } +} diff --git a/sci-types-project/src/main/typescript/sciproject-members.ts b/sci-types-project/src/main/typescript/sciproject-members.ts new file mode 100644 index 0000000..3c15878 --- /dev/null +++ b/sci-types-project/src/main/typescript/sciproject-members.ts @@ -0,0 +1,148 @@ +import Sortable, { SortableEvent } from "sortablejs"; + +let membersSortable: Sortable; + +document.addEventListener("DOMContentLoaded", (event) => { + const members = document.querySelector("members-list"); + + if (members) { + membersSortable = initMembers(members as HTMLElement); + } + + const saveOrderButtons = document.querySelectorAll( + ".members-save-order-button" + ); + for (let i = 0; i < saveOrderButtons.length; i++) { + saveOrderButtons[i].addEventListener("click", saveOrder); + } +}); + +function initMembers(members: HTMLElement): Sortable { + return new Sortable( + members, + { + animation: 150, + group: "members-list", + handle: ".member-sort-handle", + onEnd: enableSaveButton + } + ) +} + +function enableSaveButton(event: SortableEvent) { + console.log("Enabling save buttons..."); + const saveOrderButtons = document.querySelectorAll( + ".members-save-order-button" + ); + for (let i = 0; i < saveOrderButtons.length; i++) { + const saveOrderButton: HTMLButtonElement = saveOrderButtons[ + i + ] as HTMLButtonElement; + saveOrderButton.disabled = false; + } +} + +function saveOrder() { + const baseUrl = cmsMedia.getAttribute("data-baseUrl"); + if (!baseUrl) { + showGeneralError(); + throw Error( + "data-baseUrl attribute on cms-media-lists container is missing or empty." + ); + } + + console.log("spinner on"); + const saveOrderButtons = document.querySelectorAll(".members-save-order-button"); + for (let i = 0; i < saveOrderButtons.length; i++) { + const saveOrderButton: HTMLButtonElement = saveOrderButtons[ + i + ] as HTMLButtonElement; + saveOrderButton.disabled = true; + const saveIcon = saveOrderButton.querySelector(".save-icon"); + const spinner = saveOrderButton.querySelector(".save-spinner"); + saveIcon?.classList.toggle("d-none"); + spinner?.classList.toggle("d-none"); + } + + console.log("fetch POST"); + const headers = new Headers(); + headers.append("Content-Type", "application/json"); + fetch(baseUrl, { + credentials: "include", + body: JSON.stringify(membersSortable.toArray()), + headers, + method: "POST" + }) + .then(response => { + if (response.ok) { + for(let i = 0; i < saveOrderButtons.length; i++) { + const saveOrderButton: HTMLButtonElement = saveOrderButtons[ + i + ] as HTMLButtonElement; + // saveOrderButton.disabled = true; + const saveIcon = + saveOrderButton.querySelector(".save-icon"); + const spinner = + saveOrderButton.querySelector(".save-spinner"); + saveIcon?.classList.toggle("d-none"); + spinner?.classList.toggle("d-none"); + } + } else { + showSaveError(); + for (let i = 0; i < saveOrderButtons.length; i++) { + const saveOrderButton: HTMLButtonElement = saveOrderButtons[ + i + ] as HTMLButtonElement; + saveOrderButton.disabled = false; + const saveIcon = + saveOrderButton.querySelector(".save-icon"); + const spinner = + saveOrderButton.querySelector(".save-spinner"); + saveIcon?.classList.toggle("d-none"); + spinner?.classList.toggle("d-none"); + } + throw Error( + `Failed to save media order. Response status: ${response.status}, statusText: ${response.statusText}` + ); + } + }) + .catch(error => { + showSaveError(); + for (let i = 0; i < saveOrderButtons.length; i++) { + const saveOrderButton: HTMLButtonElement = saveOrderButtons[ + i + ] as HTMLButtonElement; + saveOrderButton.disabled = false; + const saveIcon = saveOrderButton.querySelector(".save-icon"); + const spinner = saveOrderButton.querySelector(".save-spinner"); + saveIcon?.classList.toggle("d-none"); + spinner?.classList.toggle("d-none"); + } + throw new Error(`Failed to save media order: ${error}`); + }); +} + +function showGeneralError(): void { + const alertTemplate = document.querySelector( + "#member-sort-error-general" + ) as HTMLTemplateElement; + const alert = alertTemplate.content.cloneNode(true) as Element; + + const container = document.querySelector("#messages"); + if (container) { + container.appendChild(alert); + } +} + +function showSaveError(): void { + const alertTemplate = document.querySelector( + "#member-sort-error-save" + ) as HTMLTemplateElement; + const alert = alertTemplate.content.cloneNode(true) as Element; + + const container = document.querySelector("#messages"); + if (container) { + container.appendChild(alert); + } +} + diff --git a/sci-types-project/tsconfig.json b/sci-types-project/tsconfig.json new file mode 100644 index 0000000..257cb29 --- /dev/null +++ b/sci-types-project/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "declaration": true, + "lib": [ + "DOM", + "ES2016" + ], + "module": "commonjs", + "moduleResolution": "node", + "outDir": "target/generated-resources/assets/@content-sections", + "sourceMap": true, + "strict": true, + "target": "ES5" + }, + "include": [ + "src/main/typescript/**/*" + ] +} diff --git a/sci-types-project/webpack.config.js b/sci-types-project/webpack.config.js new file mode 100644 index 0000000..e25946c --- /dev/null +++ b/sci-types-project/webpack.config.js @@ -0,0 +1,27 @@ +module.exports = { + mode: "development", + devtool: "source-map", + optimization: { + chunkIds: false + }, + entry: { + "sciproject-description": "./src/main/typescript/sciproject/sciproject-description.ts", + "sciproject-contacts": "./src/main/typescript/sciproject/sciproject-contacts.ts", + "sciproject-members": "./src/main/typescript/sciproject/sciproject-members.ts", + "sciproject-sponsoring": "./src/main/typescript/sciproject/sciproject-sponsoring.ts" + }, + output: { + filename: "[name].js", + path: __dirname + "/target/generated-resources/assets/@sciproject" + }, + resolve: { + extensions: [".tsx", ".ts", ".js", ".json"] + }, + module: { + rules: [ + // all files with a '.ts' or '.tsx' extension will be handled by 'ts-loader' + { test: /\.tsx?$/, use: ["ts-loader"], exclude: /node_modules/ } + ] + } + +}