diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceToDataset.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceToDataset.java index 9ec97ee..ef8bde5 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceToDataset.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceToDataset.java @@ -54,7 +54,7 @@ public class AddResourceToDataset extends Composite{ @UiField Button addResourceButton; @UiField AlertBlock infoBlock; @UiField Button goToDatasetButton; - + public AddResourceToDataset(HandlerManager eventBus, String datasetId, String owner, final String datasetUrl) { initWidget(uiBinder.createAndBindUi(this)); @@ -71,14 +71,14 @@ public class AddResourceToDataset extends Composite{ @Override public void onClick(ClickEvent event) { - String currentPath = Window.Location.getHref(); - int datasetIndex = datasetUrl.indexOf("/dataset"); - if(datasetIndex == -1) - return; - - String finalPart = datasetUrl.substring(datasetIndex); - String finalPath = currentPath + "?" + "path" + "=" + finalPart; - Window.Location.assign(finalPath); + // String currentPath = Window.Location.getHref(); + // int datasetIndex = datasetUrl.indexOf("/dataset"); + // if(datasetIndex == -1) + // return; + // + // String finalPart = datasetUrl.substring(datasetIndex); + // String finalPath = currentPath + "?" + "path" + "=" + finalPart; + Window.Location.assign(datasetUrl); } }); } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.java index 10004b5..b3df790 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.java @@ -328,43 +328,322 @@ public class CreateDatasetForm extends Composite{ if(lBean != null && !lBean.getLicenses().isEmpty()){ - licenseBean = lBean; + licenseBean = lBean; - // sort the list - List listOfNames = licenseBean.getLicenses(); - Collections.sort(listOfNames); + // sort the list + List listOfNames = licenseBean.getLicenses(); + Collections.sort(listOfNames); - // fill the listbox - for(int i = 0; i < listOfNames.size(); i++){ - licenseListbox.addItem(listOfNames.get(i)); - if(listOfNames.get(i).equals("Creative Commons Attribution")) - licenseListbox.setItemSelected(i, true); + // fill the listbox + for(int i = 0; i < listOfNames.size(); i++){ + licenseListbox.addItem(listOfNames.get(i)); + if(listOfNames.get(i).equals("Creative Commons Attribution")) + licenseListbox.setItemSelected(i, true); - } - - - // everything went ok - setAlertBlock("", AlertType.ERROR, false); - continueButton.setEnabled(true); - resetButton.setEnabled(true); - - }else{ - setAlertBlock("Error while retrieving licenses, try to refresh the page", AlertType.ERROR, true); } + + + // everything went ok + setAlertBlock("", AlertType.ERROR, false); + continueButton.setEnabled(true); + resetButton.setEnabled(true); + + }else{ + setAlertBlock("Error while retrieving licenses, try to refresh the page", AlertType.ERROR, true); } + } + + @Override + public void onFailure(Throwable caught){ + + setAlertBlock("Error while retrieving licenses, try to refresh the page", AlertType.ERROR, true); + + } + }); + + }else{ + + setAlertBlock("Error while retrieving information, try to refresh the page", AlertType.ERROR, true); + } + + } + + @Override + public void onFailure(Throwable caught) { + + setAlertBlock("Error while retrieving information, try to refresh the page", AlertType.ERROR, true); + + } + }); + + } + + /** + * Add the items to the listbox and put data into the metadataPanel + * @param receivedBean + */ + protected void prepareMetadataList(DatasetMetadataBean receivedBean) { + + List beans = receivedBean.getMetadataList(); + + for(MetaDataProfileBean metadataBean: beans){ + + metadataProfilesFormatListbox.addItem(metadataBean.getType().getName()); + + // add handler on select + metadataProfilesFormatListbox.addChangeHandler(new ChangeHandler() { + + @Override + public void onChange(ChangeEvent event) { + + String selectedItem = metadataProfilesFormatListbox.getSelectedItemText(); + + if(selectedItem.equals("none")){ + // hide the panel + metadataFieldsPanel.clear(); + metadataFieldsPanel.setVisible(false); + }else{ + + metadataFieldsPanel.clear(); + addFields(selectedItem); + } + } + }); + } + } + + protected void addFields(String selectedItem) { + + for(MetaDataProfileBean bean: receivedBean.getMetadataList()){ + + if(bean.getType().getName().equals(selectedItem)){ + + // prepare the data + List fields = bean.getMetadataFields(); + + // clear old data + listOfMetadataFields.clear(); + + for (MetadataFieldWrapper field : fields) { + MetaDataFieldSkeleton fieldWidget = new MetaDataFieldSkeleton(field); + metadataFieldsPanel.add(fieldWidget); + listOfMetadataFields.add(fieldWidget); + } + + metadataFieldsPanel.setVisible(true); + } + } + } + + /** + * Bind on events + */ + private void bind() { + + // when a custom field is removed, remove it from the list + eventBus.addHandler(DeleteCustomFieldEvent.TYPE, new DeleteCustomFieldEventHandler() { + + @Override + public void onRemoveEntry(DeleteCustomFieldEvent event) { + + customFieldEntriesList.remove(event.getRemovedEntry()); + customFields.remove(event.getRemovedEntry()); + + } + }); + + } + + @UiHandler("addCustomFieldButton") + void addCustomFieldEvent(ClickEvent e){ + + CustomFieldEntry toAdd = new CustomFieldEntry(eventBus, "", "", true); + customFieldEntriesList.add(toAdd); + customFields.add(toAdd); + + } + + @UiHandler("continueButton") + void onContinueButton(ClickEvent e){ + + // validate data + String errorMsg = validateDataOnContinue(); + + if(errorMsg == null){ + formFirstStep.setVisible(false); + formSecondStep.setVisible(true); + selectedProfile.setText("Selected Profile is " + metadataProfilesFormatListbox.getSelectedItemText()); + }else{ + alertOnContinue("Please check inserted data [" + errorMsg + "]", AlertType.ERROR); + } + + } + + @UiHandler("goBackButton") + void onGoBackButton(ClickEvent e){ + + // swap forms + formFirstStep.setVisible(true); + formSecondStep.setVisible(false); + + } + + @UiHandler("createButton") + void createDatasetEvent(ClickEvent e){ + + boolean profileDataValid = areProfileDataValid(); + + if(profileDataValid){ + + String title = titleTextBox.getValue(); + String description = descriptionTextarea.getText(); + String selectedLicense = licenseListbox.getSelectedItemText(); + String visibility = visibilityListbox.getSelectedItemText(); + long version = Long.valueOf(versionTextbox.getValue()); + String author = authorTextbox.getValue(); + String authorEmail = authorEmailTextbox.getValue(); + String maintainer = maintainerTextbox.getValue(); + String maintainerEmail = maintainerEmailTextbox.getValue(); + String chosenOrganization = organizationsListbox.getSelectedItemText(); + boolean addResources = addResourcesCheckBox.getValue(); + + // fill the bean + receivedBean.setAuthor(author); + receivedBean.setAuthorEmail(authorEmail); + receivedBean.setDescription(description); + receivedBean.setLicense(selectedLicense); + receivedBean.setMaintainer(maintainer); + receivedBean.setMaintainerEmail(maintainerEmail); + receivedBean.setVersion(version); + receivedBean.setVisibility(visibility.equals("Public")); + receivedBean.setTitle(title); + receivedBean.setTags(tagsList); + receivedBean.setSelectedOrganization(chosenOrganization); + receivedBean.setAddResources(addResources); + + Map customFieldsMap = new HashMap(); + + // prepare custom fields + for (MetaDataFieldSkeleton field : listOfMetadataFields) { + + customFieldsMap.put(field.getFieldName(), field.getFieldCurrentValue()); + + } + + for(CustomFieldEntry customEntry : customFieldEntriesList){ + + String key = customEntry.getKey(); + String value = customEntry.getValue(); + customFieldsMap.put(key, value); + + } + + receivedBean.setCustomFields(customFieldsMap); + + // alert + alertOnCreate("Trying to create dataset, please wait", AlertType.INFO); + + // invoke the create method + createButton.setEnabled(false); + goBackButton.setEnabled(false); + + ckanServices.createCKanDataset(receivedBean, isWorkspaceRequest, new AsyncCallback() { + + @Override + public void onSuccess(final DatasetMetadataBean createdDatasetBean) { + + if(createdDatasetBean != null){ + + alertOnCreate("Dataset correctly created!", AlertType.SUCCESS); + + // disable dataset fields + disableDatasetFields(); + + // disable reset + resetButton.setEnabled(false); + + // show the go to dataset button + final String datasetUrl = createdDatasetBean.getSource(); + goToDatasetButton.setVisible(true); + goToDatasetButton.addClickHandler(new ClickHandler() { @Override - public void onFailure(Throwable caught){ - - setAlertBlock("Error while retrieving licenses, try to refresh the page", AlertType.ERROR, true); + public void onClick(ClickEvent event) { + // String currentPath = Window.Location.getHref(); + // int datasetIndex = datasetUrl.indexOf("/dataset"); + // if(datasetIndex == -1) + // return; + // + // String finalPart = datasetUrl.substring(datasetIndex); + // String finalPath = currentPath + "?" + "path" + "=" + finalPart; + Window.Location.assign(datasetUrl); } }); + // if we are in the "general case" we need to show a form for adding resources + if(isWorkspaceRequest) + { + + // leave to back button, but remove create and add go to dataset + createButton.removeFromParent(); + + // set go to dataset as primary + goToDatasetButton.setType(ButtonType.PRIMARY); + + }else{ + + // remove create button + createButton.removeFromParent(); + + // show the add resources button + addResourcesButton.setVisible(true); + + addResourcesButton.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + + // remove content of the main panel + createDatasetMainPanel.clear(); + + // TabPanel + tabPanel = new TabPanel(Tabs.ABOVE); + tabPanel.setWidth("100%"); + + // add the form + resourceForm = new AddResourceToDataset(eventBus, createdDatasetBean.getId(), owner, datasetUrl); + + // tab for the form + Tab formContainer = new Tab(); + formContainer.add(resourceForm); + formContainer.setHeading("Add New Resource"); + tabPanel.add(formContainer); + + // tab for the added resources + Tab addedResources = new Tab(); + addedResources.add(new AddedResourcesSummary(eventBus, owner)); + addedResources.setHeading("Added Resource"); + tabPanel.add(addedResources); + + // add tabs to resources panel + tabPanel.selectTab(0); + + + // form container + AddResourceContainer container = new AddResourceContainer(datasetUrl); + container.add(tabPanel); + + // add the new content of the main panel + createDatasetMainPanel.add(container); + } + }); + } + }else{ - setAlertBlock("Error while retrieving information, try to refresh the page", AlertType.ERROR, true); + alertOnCreate("Unable to create this dataset, maybe it already exists?", AlertType.ERROR); } } @@ -372,600 +651,321 @@ public class CreateDatasetForm extends Composite{ @Override public void onFailure(Throwable caught) { - setAlertBlock("Error while retrieving information, try to refresh the page", AlertType.ERROR, true); + alertOnCreate("Unable to create this dataset, maybe it already exists?", AlertType.ERROR); } }); + }else{ - } - - /** - * Add the items to the listbox and put data into the metadataPanel - * @param receivedBean - */ - protected void prepareMetadataList(DatasetMetadataBean receivedBean) { - - List beans = receivedBean.getMetadataList(); - - for(MetaDataProfileBean metadataBean: beans){ - - metadataProfilesFormatListbox.addItem(metadataBean.getType().getName()); - - // add handler on select - metadataProfilesFormatListbox.addChangeHandler(new ChangeHandler() { - - @Override - public void onChange(ChangeEvent event) { - - String selectedItem = metadataProfilesFormatListbox.getSelectedItemText(); - - if(selectedItem.equals("none")){ - // hide the panel - metadataFieldsPanel.clear(); - metadataFieldsPanel.setVisible(false); - }else{ - - metadataFieldsPanel.clear(); - addFields(selectedItem); - } - } - }); - } - } - - protected void addFields(String selectedItem) { - - for(MetaDataProfileBean bean: receivedBean.getMetadataList()){ - - if(bean.getType().getName().equals(selectedItem)){ - - // prepare the data - List fields = bean.getMetadataFields(); - - // clear old data - listOfMetadataFields.clear(); - - for (MetadataFieldWrapper field : fields) { - MetaDataFieldSkeleton fieldWidget = new MetaDataFieldSkeleton(field); - metadataFieldsPanel.add(fieldWidget); - listOfMetadataFields.add(fieldWidget); - } - - metadataFieldsPanel.setVisible(true); - } - } - } - - /** - * Bind on events - */ - private void bind() { - - // when a custom field is removed, remove it from the list - eventBus.addHandler(DeleteCustomFieldEvent.TYPE, new DeleteCustomFieldEventHandler() { - - @Override - public void onRemoveEntry(DeleteCustomFieldEvent event) { - - customFieldEntriesList.remove(event.getRemovedEntry()); - customFields.remove(event.getRemovedEntry()); - - } - }); - - } - - @UiHandler("addCustomFieldButton") - void addCustomFieldEvent(ClickEvent e){ - - CustomFieldEntry toAdd = new CustomFieldEntry(eventBus, "", "", true); - customFieldEntriesList.add(toAdd); - customFields.add(toAdd); - - } - - @UiHandler("continueButton") - void onContinueButton(ClickEvent e){ - - // validate data - String errorMsg = validateDataOnContinue(); - - if(errorMsg == null){ - formFirstStep.setVisible(false); - formSecondStep.setVisible(true); - selectedProfile.setText("Selected Profile is " + metadataProfilesFormatListbox.getSelectedItemText()); - }else{ - alertOnContinue("Please check inserted data [" + errorMsg + "]", AlertType.ERROR); - } - - } - - @UiHandler("goBackButton") - void onGoBackButton(ClickEvent e){ - - // swap forms - formFirstStep.setVisible(true); - formSecondStep.setVisible(false); - - } - - @UiHandler("createButton") - void createDatasetEvent(ClickEvent e){ - - boolean profileDataValid = areProfileDataValid(); - - if(profileDataValid){ - - String title = titleTextBox.getValue(); - String description = descriptionTextarea.getText(); - String selectedLicense = licenseListbox.getSelectedItemText(); - String visibility = visibilityListbox.getSelectedItemText(); - long version = Long.valueOf(versionTextbox.getValue()); - String author = authorTextbox.getValue(); - String authorEmail = authorEmailTextbox.getValue(); - String maintainer = maintainerTextbox.getValue(); - String maintainerEmail = maintainerEmailTextbox.getValue(); - String chosenOrganization = organizationsListbox.getSelectedItemText(); - boolean addResources = addResourcesCheckBox.getValue(); - - // fill the bean - receivedBean.setAuthor(author); - receivedBean.setAuthorEmail(authorEmail); - receivedBean.setDescription(description); - receivedBean.setLicense(selectedLicense); - receivedBean.setMaintainer(maintainer); - receivedBean.setMaintainerEmail(maintainerEmail); - receivedBean.setVersion(version); - receivedBean.setVisibility(visibility.equals("Public")); - receivedBean.setTitle(title); - receivedBean.setTags(tagsList); - receivedBean.setSelectedOrganization(chosenOrganization); - receivedBean.setAddResources(addResources); - - Map customFieldsMap = new HashMap(); - - // prepare custom fields - for (MetaDataFieldSkeleton field : listOfMetadataFields) { - - customFieldsMap.put(field.getFieldName(), field.getFieldCurrentValue()); - - } - - for(CustomFieldEntry customEntry : customFieldEntriesList){ - - String key = customEntry.getKey(); - String value = customEntry.getValue(); - customFieldsMap.put(key, value); - - } - - receivedBean.setCustomFields(customFieldsMap); - - // alert - alertOnCreate("Trying to create dataset, please wait", AlertType.INFO); - - // invoke the create method - createButton.setEnabled(false); - goBackButton.setEnabled(false); - - ckanServices.createCKanDataset(receivedBean, isWorkspaceRequest, new AsyncCallback() { - - @Override - public void onSuccess(final DatasetMetadataBean createdDatasetBean) { - - if(createdDatasetBean != null){ - - alertOnCreate("Dataset correctly created!", AlertType.SUCCESS); - - // disable dataset fields - disableDatasetFields(); - - // disable reset - resetButton.setEnabled(false); - - // show the go to dataset button - final String datasetUrl = createdDatasetBean.getSource(); - goToDatasetButton.setVisible(true); - goToDatasetButton.addClickHandler(new ClickHandler() { - - @Override - public void onClick(ClickEvent event) { - - String currentPath = Window.Location.getHref(); - int datasetIndex = datasetUrl.indexOf("/dataset"); - if(datasetIndex == -1) - return; - - String finalPart = datasetUrl.substring(datasetIndex); - String finalPath = currentPath + "?" + "path" + "=" + finalPart; - Window.Location.assign(finalPath); - } - }); - - // if we are in the "general case" we need to show a form for adding resources - if(isWorkspaceRequest) - { - - // leave to back button, but remove create and add go to dataset - createButton.removeFromParent(); - - // set go to dataset as primary - goToDatasetButton.setType(ButtonType.PRIMARY); - - }else{ - - // remove create button - createButton.removeFromParent(); - - // show the add resources button - addResourcesButton.setVisible(true); - - addResourcesButton.addClickHandler(new ClickHandler() { - - @Override - public void onClick(ClickEvent event) { - - // remove content of the main panel - createDatasetMainPanel.clear(); - - // TabPanel - tabPanel = new TabPanel(Tabs.ABOVE); - tabPanel.setWidth("100%"); - - // add the form - resourceForm = new AddResourceToDataset(eventBus, createdDatasetBean.getId(), owner, datasetUrl); - - // tab for the form - Tab formContainer = new Tab(); - formContainer.add(resourceForm); - formContainer.setHeading("Add New Resource"); - tabPanel.add(formContainer); - - // tab for the added resources - Tab addedResources = new Tab(); - addedResources.add(new AddedResourcesSummary(eventBus, owner)); - addedResources.setHeading("Added Resource"); - tabPanel.add(addedResources); - - // add tabs to resources panel - tabPanel.selectTab(0); - - - // form container - AddResourceContainer container = new AddResourceContainer(datasetUrl); - container.add(tabPanel); - - // add the new content of the main panel - createDatasetMainPanel.add(container); - } - }); - } - - }else{ - - alertOnCreate("Unable to create this dataset, maybe it already exists?", AlertType.ERROR); - } - - } - - @Override - public void onFailure(Throwable caught) { - - alertOnCreate("Unable to create this dataset, maybe it already exists?", AlertType.ERROR); - - } - }); - }else{ - - alertOnCreate("Please check the inserted values and the mandatory fields", AlertType.ERROR); - - } - } - - /** - * Test if profile data are valid - * @return - */ - private boolean areProfileDataValid() { - - for (MetaDataFieldSkeleton field : listOfMetadataFields) { - - if(!field.isFieldValueValid()) - return false; - } - - return true; - } - - /** - * On continue show alert box and enable buttons - * @param text - * @param type - */ - private void alertOnContinue(String text, AlertType type){ - - onContinueAlertBlock.setText(text); - onContinueAlertBlock.setType(type); - onContinueAlertBlock.setVisible(true); - continueButton.setEnabled(true); - resetButton.setEnabled(true); - - // hide after some seconds - Timer t = new Timer() { - - @Override - public void run() { - - onContinueAlertBlock.setVisible(false); - - } - }; - - t.schedule(4000); - } - - /** - * On continue show alert box and enable buttons - * @param text - * @param type - */ - private void alertOnCreate(String text, AlertType type){ - - onCreateAlertBlock.setText(text); - onCreateAlertBlock.setType(type); - onCreateAlertBlock.setVisible(true); - createButton.setEnabled(true); - goBackButton.setEnabled(true); - - // hide after some seconds - Timer t = new Timer() { - - @Override - public void run() { - - onCreateAlertBlock.setVisible(false); - - } - }; - - t.schedule(4000); - } - - /** - * Validate data - * @return true on success, false otherwise - */ - private String validateDataOnContinue() { - - String errorMessage = null; - - if(titleTextBox.getText().isEmpty()){ - errorMessage = "Missing title"; - return errorMessage; - } - - // better check for the title - String regexTitleSubWord = "^[a-zA-Z0-9_]+$"; - String[] splittedTitle = titleTextBox.getText().split(" "); - - for (String word : splittedTitle) { - - if(!word.matches(regexTitleSubWord)) - return "Please note that only alphanumeric characters are allowed for the title"; - - } - - // name reg expression - String regexName = "^[a-zA-Z\\s]+"; - if(!validateByRegExpression(maintainerTextbox.getText(), regexName)){ - errorMessage = "Not valid maintainer name"; - return errorMessage; - } - - // email reg expression - String regexMail = "\\b[\\w.%-]+@[-.\\w]+\\.[A-Za-z]{2,4}\\b"; - if(!validateByRegExpression(maintainerEmailTextbox.getText(), regexMail)){ - errorMessage = "Not valid maintainer email"; - return errorMessage; - } - - // check if metadata profile is different from none and its mandatory fields have been fulfilled - if(checkSelectedMetaDataProfile()){ - errorMessage = "You must select a metadata profile different frome none"; - } - - if(organizationsListbox.getSelectedItemText() == null){ - errorMessage = "You must select an organization in which you want to publish"; - } - - return errorMessage; - } - - /** - * Checks if a metadata profile has been chosen and its fields have been fulfilled - * @return - */ - private boolean checkSelectedMetaDataProfile() { - return metadataProfilesFormatListbox.getSelectedItemText().equals("none"); - } - - /** - * Validate a text against a regular expression. - * @param textToValidate - * @param regex - * @return - */ - private boolean validateByRegExpression(String textToValidate, String regex){ - return textToValidate.matches(regex); - } - - @UiHandler("resetButton") - void resetFormEvent(ClickEvent e){ - - // reset main fields - titleTextBox.setText(""); - descriptionTextarea.setText(""); - versionTextbox.setText(""); - maintainerTextbox.setText(""); - maintainerEmailTextbox.setText(""); - removeTags(); - - // delete custom fields - for (CustomFieldEntry customField : customFieldEntriesList) { - customField.removeFromParent(); - } - customFieldEntriesList.clear(); - - } - - /** - * Disable dataset editable fields once the dataset has been - * Successfully created. - */ - protected void disableDatasetFields() { - - titleTextBox.setEnabled(false); - descriptionTextarea.setEnabled(false); - versionTextbox.setEnabled(false); - maintainerTextbox.setEnabled(false); - maintainerEmailTextbox.setEnabled(false); - visibilityListbox.setEnabled(false); - tagsEnterTextBox.setEnabled(false); - licenseListbox.setEnabled(false); - organizationsListbox.setEnabled(false); - addCustomFieldButton.setEnabled(false); - - // freeze tags - for(int i = 0; i < tagsList.size(); i++){ - - // get tag widget - ListItem tagWidget = (ListItem)tagsPanel.getWidget(i); - - // get the "x" span - tagWidget.getWidget(1).removeFromParent(); - - } - - // disable profile fields - for (MetaDataFieldSkeleton field : listOfMetadataFields) { - - field.freeze(); - - } - - } - - /** - * change alert block behavior. - * @param textToShow - * @param type - * @param visible - */ - private void setAlertBlock(String textToShow, AlertType type, boolean visible){ - - infoBlock.setText(textToShow); - infoBlock.setType(type); - infoBlock.setVisible(visible); - - } - - @UiHandler("tagsEnterTextBox") - void onAddTag(KeyDownEvent event){ - - if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { - if (!"".equals(tagsEnterTextBox.getValue().trim())) { - - addTagElement(tagsEnterTextBox); - - } - } - } - - /** - * Add the tag as an element - */ - private void addTagElement(TextBox itemBox){ - - if (itemBox.getValue() != null && !"".equals(itemBox.getValue().trim())) { - - if(tagsList.contains(itemBox.getValue())) - return; - - // ckan accepts only alphanumeric values - if(!itemBox.getValue().matches("^[a-zA-Z0-9]*$")) - return; - - if(itemBox.getValue().length() <= 1) - return; - - final String value = itemBox.getValue(); - final ListItem displayItem = new ListItem(); - displayItem.setStyleName("tag-style"); - Span tagText = new Span(itemBox.getValue()); - - Span tagRemove = new Span("x"); - tagRemove.setTitle("Remove this tag"); - tagRemove.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent clickEvent) { - removeTag(displayItem, value); - } - }); - - tagRemove.setStyleName("tag-style-x"); - displayItem.add(tagText); - displayItem.add(tagRemove); - itemBox.setValue(""); - itemBox.setFocus(true); - tagsPanel.add(displayItem); - tagsList.add(value); - } - } - - /** - * Add the tag as an element - */ - private void addTagElement(final String tag){ - - if(tagsList.contains(tag)) - return; - - final ListItem displayItem = new ListItem(); - displayItem.setStyleName("tag-style"); - Span p = new Span(tag); - - Span span = new Span("x"); - span.setTitle("Remove this tag"); - span.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent clickEvent) { - removeTag(displayItem, tag); - } - }); - - span.setStyleName("tag-style-x"); - displayItem.add(p); - displayItem.add(span); - tagsPanel.add(displayItem); - tagsList.add(tag); - } - - /** - * Remove a tag from the list - * @param displayItem - */ - private void removeTag(ListItem displayItem, String value) { - - tagsList.remove(value); - tagsPanel.remove(displayItem); - - } - - /** - * Remove all inserted tags - */ - private void removeTags(){ - - tagsList.clear(); - tagsPanel.clear(); + alertOnCreate("Please check the inserted values and the mandatory fields", AlertType.ERROR); } } + + /** + * Test if profile data are valid + * @return + */ + private boolean areProfileDataValid() { + + for (MetaDataFieldSkeleton field : listOfMetadataFields) { + + if(!field.isFieldValueValid()) + return false; + } + + return true; + } + + /** + * On continue show alert box and enable buttons + * @param text + * @param type + */ + private void alertOnContinue(String text, AlertType type){ + + onContinueAlertBlock.setText(text); + onContinueAlertBlock.setType(type); + onContinueAlertBlock.setVisible(true); + continueButton.setEnabled(true); + resetButton.setEnabled(true); + + // hide after some seconds + Timer t = new Timer() { + + @Override + public void run() { + + onContinueAlertBlock.setVisible(false); + + } + }; + + t.schedule(4000); + } + + /** + * On continue show alert box and enable buttons + * @param text + * @param type + */ + private void alertOnCreate(String text, AlertType type){ + + onCreateAlertBlock.setText(text); + onCreateAlertBlock.setType(type); + onCreateAlertBlock.setVisible(true); + createButton.setEnabled(true); + goBackButton.setEnabled(true); + + // hide after some seconds + Timer t = new Timer() { + + @Override + public void run() { + + onCreateAlertBlock.setVisible(false); + + } + }; + + t.schedule(4000); + } + + /** + * Validate data + * @return true on success, false otherwise + */ + private String validateDataOnContinue() { + + String errorMessage = null; + + if(titleTextBox.getText().isEmpty()){ + errorMessage = "Missing title"; + return errorMessage; + } + + // better check for the title + String regexTitleSubWord = "^[a-zA-Z0-9_]+$"; + String[] splittedTitle = titleTextBox.getText().split(" "); + + for (String word : splittedTitle) { + + if(!word.matches(regexTitleSubWord)) + return "Please note that only alphanumeric characters are allowed for the title"; + + } + + // name reg expression + String regexName = "^[a-zA-Z\\s]+"; + if(!validateByRegExpression(maintainerTextbox.getText(), regexName)){ + errorMessage = "Not valid maintainer name"; + return errorMessage; + } + + // email reg expression + String regexMail = "\\b[\\w.%-]+@[-.\\w]+\\.[A-Za-z]{2,4}\\b"; + if(!validateByRegExpression(maintainerEmailTextbox.getText(), regexMail)){ + errorMessage = "Not valid maintainer email"; + return errorMessage; + } + + // check if metadata profile is different from none and its mandatory fields have been fulfilled + if(checkSelectedMetaDataProfile()){ + errorMessage = "You must select a metadata profile different frome none"; + } + + if(organizationsListbox.getSelectedItemText() == null){ + errorMessage = "You must select an organization in which you want to publish"; + } + + return errorMessage; + } + + /** + * Checks if a metadata profile has been chosen and its fields have been fulfilled + * @return + */ + private boolean checkSelectedMetaDataProfile() { + return metadataProfilesFormatListbox.getSelectedItemText().equals("none"); + } + + /** + * Validate a text against a regular expression. + * @param textToValidate + * @param regex + * @return + */ + private boolean validateByRegExpression(String textToValidate, String regex){ + return textToValidate.matches(regex); + } + + @UiHandler("resetButton") + void resetFormEvent(ClickEvent e){ + + // reset main fields + titleTextBox.setText(""); + descriptionTextarea.setText(""); + versionTextbox.setText(""); + maintainerTextbox.setText(""); + maintainerEmailTextbox.setText(""); + removeTags(); + + // delete custom fields + for (CustomFieldEntry customField : customFieldEntriesList) { + customField.removeFromParent(); + } + customFieldEntriesList.clear(); + + } + + /** + * Disable dataset editable fields once the dataset has been + * Successfully created. + */ + protected void disableDatasetFields() { + + titleTextBox.setEnabled(false); + descriptionTextarea.setEnabled(false); + versionTextbox.setEnabled(false); + maintainerTextbox.setEnabled(false); + maintainerEmailTextbox.setEnabled(false); + visibilityListbox.setEnabled(false); + tagsEnterTextBox.setEnabled(false); + licenseListbox.setEnabled(false); + organizationsListbox.setEnabled(false); + addCustomFieldButton.setEnabled(false); + + // freeze tags + for(int i = 0; i < tagsList.size(); i++){ + + // get tag widget + ListItem tagWidget = (ListItem)tagsPanel.getWidget(i); + + // get the "x" span + tagWidget.getWidget(1).removeFromParent(); + + } + + // disable profile fields + for (MetaDataFieldSkeleton field : listOfMetadataFields) { + + field.freeze(); + + } + + } + + /** + * change alert block behavior. + * @param textToShow + * @param type + * @param visible + */ + private void setAlertBlock(String textToShow, AlertType type, boolean visible){ + + infoBlock.setText(textToShow); + infoBlock.setType(type); + infoBlock.setVisible(visible); + + } + + @UiHandler("tagsEnterTextBox") + void onAddTag(KeyDownEvent event){ + + if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { + if (!"".equals(tagsEnterTextBox.getValue().trim())) { + + addTagElement(tagsEnterTextBox); + + } + } + } + + /** + * Add the tag as an element + */ + private void addTagElement(TextBox itemBox){ + + if (itemBox.getValue() != null && !"".equals(itemBox.getValue().trim())) { + + if(tagsList.contains(itemBox.getValue())) + return; + + // ckan accepts only alphanumeric values + if(!itemBox.getValue().matches("^[a-zA-Z0-9]*$")) + return; + + if(itemBox.getValue().length() <= 1) + return; + + final String value = itemBox.getValue(); + final ListItem displayItem = new ListItem(); + displayItem.setStyleName("tag-style"); + Span tagText = new Span(itemBox.getValue()); + + Span tagRemove = new Span("x"); + tagRemove.setTitle("Remove this tag"); + tagRemove.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent clickEvent) { + removeTag(displayItem, value); + } + }); + + tagRemove.setStyleName("tag-style-x"); + displayItem.add(tagText); + displayItem.add(tagRemove); + itemBox.setValue(""); + itemBox.setFocus(true); + tagsPanel.add(displayItem); + tagsList.add(value); + } + } + + /** + * Add the tag as an element + */ + private void addTagElement(final String tag){ + + if(tagsList.contains(tag)) + return; + + final ListItem displayItem = new ListItem(); + displayItem.setStyleName("tag-style"); + Span p = new Span(tag); + + Span span = new Span("x"); + span.setTitle("Remove this tag"); + span.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent clickEvent) { + removeTag(displayItem, tag); + } + }); + + span.setStyleName("tag-style-x"); + displayItem.add(p); + displayItem.add(span); + tagsPanel.add(displayItem); + tagsList.add(tag); + } + + /** + * Remove a tag from the list + * @param displayItem + */ + private void removeTag(ListItem displayItem, String value) { + + tagsList.remove(value); + tagsPanel.remove(displayItem); + + } + + /** + * Remove all inserted tags + */ + private void removeTags(){ + + tagsList.clear(); + tagsPanel.clear(); + + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java index 80554de..85e0381 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java @@ -330,7 +330,6 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C UserManager liferUserManager = new LiferayUserManager(); GCubeUser userOwner = liferUserManager.getUserByUsername(owner); - // build bean logger.debug("Building bean"); bean = new DatasetMetadataBean(); @@ -466,6 +465,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C ASLSession aslSession = getASLSession(); String user = aslSession.getUsername(); + CKanUtilsImpl utils = getCkanUtilsObj(); try{ @@ -530,7 +530,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C } - String datasetId = getCkanUtilsObj().createCKanDataset(getUserCKanTokenFromSession(), withId, title, organizationNameOrId, author, + String datasetId = utils.createCKanDataset(getUserCKanTokenFromSession(), withId, title, organizationNameOrId, author, authorMail, maintainer, maintainerMail, version, description, licenseId, listOfTags, customFields, resources, setPublic); @@ -540,7 +540,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C toCreate.setId(datasetId); // retrieve the url - String datasetUrl = getCkanUtilsObj().getUrlFromDatasetIdOrName(getUserCKanTokenFromSession(), datasetId); + String datasetUrl = utils.getPortletUrl() + "?path=" + utils.getUrlFromDatasetIdOrName(getUserCKanTokenFromSession(), datasetId, true); toCreate.setSource(datasetUrl); return toCreate;