package kornell.gui.client.presentation.admin.institution.generic; import java.util.ArrayList; import java.util.List; import com.github.gwtbootstrap.client.ui.CheckBox; import com.github.gwtbootstrap.client.ui.Form; import com.github.gwtbootstrap.client.ui.ListBox; import com.github.gwtbootstrap.client.ui.Modal; import com.github.gwtbootstrap.client.ui.Tab; import com.github.gwtbootstrap.client.ui.TabPanel; import com.github.gwtbootstrap.client.ui.constants.Device; import com.google.gwt.core.client.Callback; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.place.shared.PlaceChangeEvent; import com.google.gwt.place.shared.PlaceController; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.EventBus; import kornell.api.client.KornellSession; import kornell.core.entity.BillingType; import kornell.core.entity.ContentRepository; import kornell.core.entity.EntityFactory; import kornell.core.entity.Institution; import kornell.core.entity.InstitutionType; import kornell.gui.client.ViewFactory; import kornell.gui.client.personnel.Dean; import kornell.gui.client.presentation.admin.institution.AdminInstitutionPlace; import kornell.gui.client.presentation.admin.institution.AdminInstitutionView; import kornell.gui.client.util.CSSInjector; import kornell.gui.client.util.forms.FormHelper; import kornell.gui.client.util.forms.formfield.KornellFormFieldWrapper; import kornell.gui.client.util.forms.formfield.ListBoxFormField; import kornell.gui.client.util.view.LoadingPopup; public class GenericAdminInstitutionView extends Composite implements AdminInstitutionView { interface MyUiBinder extends UiBinder<Widget, GenericAdminInstitutionView> { } private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); public static final EntityFactory entityFactory = GWT.create(EntityFactory.class); private KornellSession session; private FormHelper formHelper = GWT.create(FormHelper.class); private boolean isCreationMode, isPlatformAdmin, isInstitutionAdmin; boolean isCurrentUser, showContactDetails, isRegisteredWithCPF; private Presenter presenter; @UiField TabPanel tabsPanel; @UiField Tab editTab; @UiField Tab hostnamesTab; @UiField FlowPanel hostnamesPanel; @UiField Tab emailWhitelistTab; @UiField FlowPanel emailWhitelistPanel; @UiField Tab reportsTab; @UiField FlowPanel reportsPanel; @UiField Tab adminsTab; @UiField FlowPanel adminsPanel; @UiField Tab assetsTab; @UiField FlowPanel assetsPanel; @UiField Tab repoTab; @UiField FlowPanel repoPanel; @UiField HTMLPanel titleEdit; @UiField Form form; @UiField FlowPanel institutionFields; @UiField Button btnOK; @UiField Button btnCancel; @UiField Modal confirmModal; @UiField Label confirmText; @UiField Button btnModalOK; @UiField Button btnModalCancel; private Institution institution; private ContentRepository repo; private KornellFormFieldWrapper name, fullName, institutionType, terms, assetsRepositoryUUID, baseURL, billingType, demandsPersonContactDetails, validatePersonContactDetails, allowRegistration, allowRegistrationByUsername, useEmailWhitelist, timeZone, skin, institutionSupportEmail; private List<KornellFormFieldWrapper> fields; private GenericInstitutionReportsView reportsView; private GenericInstitutionAdminsView adminsView; private GenericInstitutionAssetsView assetsView; private GenericInstitutionHostnamesView hostnamesView; private GenericInstitutionEmailWhitelistView emailWhitelistView; private GenericInstitutionRepositoryView repoView; private EventBus bus; public GenericAdminInstitutionView(final KornellSession session, EventBus bus, PlaceController placeCtrl, ViewFactory viewFactory) { this.session = session; this.bus = bus; this.isPlatformAdmin = session.isPlatformAdmin(); this.isInstitutionAdmin = session.isInstitutionAdmin(); initWidget(uiBinder.createAndBindUi(this)); // i18n btnOK.setText("Salvar".toUpperCase()); btnCancel.setText(isCreationMode ? "Cancelar".toUpperCase() : "Limpar".toUpperCase()); btnModalOK.setText("OK".toUpperCase()); btnModalCancel.setText("Cancelar".toUpperCase()); this.institution = session.getInstitution(); if (isPlatformAdmin) { session.repository().getRepository(institution.getAssetsRepositoryUUID(), new kornell.api.client.Callback<ContentRepository>() { @Override public void ok(ContentRepository to) { repo = to; buildRepoView(); repoTab.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { buildRepoView(); } }); } }); buildReportsView(); reportsTab.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { buildReportsView(); } }); } else { FormHelper.hideTab(reportsTab); FormHelper.hideTab(repoTab); } initData(); bus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() { @Override public void onPlaceChange(PlaceChangeEvent event) { if(event.getNewPlace() instanceof AdminInstitutionPlace) initData(); } }); if (session.isInstitutionAdmin()) { hostnamesTab.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { buildHostnamesView(); } }); emailWhitelistTab.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { buildEmailWhitelistView(); } }); adminsTab.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { buildAdminsView(); } }); assetsTab.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { buildAssetsView(); } }); } } public void buildHostnamesView() { hostnamesView = new GenericInstitutionHostnamesView(session, presenter, institution); hostnamesPanel.clear(); hostnamesPanel.add(hostnamesView); } public void buildEmailWhitelistView() { emailWhitelistView = new GenericInstitutionEmailWhitelistView(session, presenter, institution); emailWhitelistPanel.clear(); emailWhitelistPanel.add(emailWhitelistView); } public void buildReportsView() { if (reportsView == null) { reportsView = new GenericInstitutionReportsView(session, bus, institution); } reportsPanel.clear(); reportsPanel.add(reportsView); } public void buildRepoView() { if (repoView == null) { repoView = new GenericInstitutionRepositoryView(session, presenter, institution, repo); } repoPanel.clear(); repoPanel.add(repoView); } public void buildAdminsView() { adminsView = new GenericInstitutionAdminsView(session, presenter, institution); adminsPanel.clear(); adminsPanel.add(adminsView); } public void buildAssetsView() { assetsView = new GenericInstitutionAssetsView(session, presenter, institution); assetsPanel.clear(); assetsPanel.add(assetsView); } public void initData() { institutionFields.setVisible(false); this.fields = new ArrayList<KornellFormFieldWrapper>(); institutionFields.clear(); btnOK.setVisible(isInstitutionAdmin|| isCreationMode); btnCancel.setVisible(isInstitutionAdmin); fullName = new KornellFormFieldWrapper("Nome da Instituição", formHelper.createTextBoxFormField(institution.getFullName()), isInstitutionAdmin); fields.add(fullName); institutionFields.add(fullName); name = new KornellFormFieldWrapper("Sub-domínio da Instituição", formHelper.createTextBoxFormField(institution.getName()), isPlatformAdmin); fields.add(name); institutionFields.add(name); baseURL = new KornellFormFieldWrapper("URL Base", formHelper.createTextBoxFormField(institution.getBaseURL()), isPlatformAdmin); fields.add(baseURL); institutionFields.add(baseURL); if(isPlatformAdmin){ final ListBox institutionTypes = new ListBox(); institutionTypes.addItem("Padrão", InstitutionType.DEFAULT.toString()); institutionTypes.addItem("Dashboard", InstitutionType.DASHBOARD.toString()); if (!isCreationMode) { institutionTypes.setSelectedValue(institution.getInstitutionType().toString()); } institutionType = new KornellFormFieldWrapper("Tipo de Instituição", new ListBoxFormField(institutionTypes), isPlatformAdmin); fields.add(institutionType); institutionFields.add(institutionType); assetsRepositoryUUID = new KornellFormFieldWrapper("UUID do repositório", formHelper.createTextBoxFormField(institution.getAssetsRepositoryUUID()), isPlatformAdmin); fields.add(assetsRepositoryUUID); institutionFields.add(assetsRepositoryUUID); final ListBox billingTypes = new ListBox(); billingTypes.addItem("Mensal", BillingType.monthly.toString()); billingTypes.addItem("Matrícula", BillingType.enrollment.toString()); if (!isCreationMode) { billingTypes.setSelectedValue(institution.getBillingType().toString()); } billingType = new KornellFormFieldWrapper("Tipo de Cobrança", new ListBoxFormField(billingTypes), isPlatformAdmin); fields.add(billingType); institutionFields.add(billingType); } demandsPersonContactDetails = new KornellFormFieldWrapper("Exige Detalhes de Contato", formHelper.createCheckBoxFormField(institution.isDemandsPersonContactDetails()), isInstitutionAdmin); fields.add(demandsPersonContactDetails); institutionFields.add(demandsPersonContactDetails); ((CheckBox)demandsPersonContactDetails.getFieldWidget()).addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { if(event.getValue()){ } } }); validatePersonContactDetails = new KornellFormFieldWrapper("Validação dos Detalhes de Contato", formHelper.createCheckBoxFormField(institution.isValidatePersonContactDetails()), isInstitutionAdmin); fields.add(validatePersonContactDetails); institutionFields.add(validatePersonContactDetails); ((CheckBox)validatePersonContactDetails.getFieldWidget()).addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { if(event.getValue()){ } } }); allowRegistration = new KornellFormFieldWrapper("Permitir Registro", formHelper.createCheckBoxFormField(institution.isAllowRegistration()), isInstitutionAdmin); fields.add(allowRegistration); institutionFields.add(allowRegistration); ((CheckBox)allowRegistration.getFieldWidget()).addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { if(event.getValue()){ } } }); if(isPlatformAdmin){ useEmailWhitelist = new KornellFormFieldWrapper("Configurar domínios para emails?", formHelper.createCheckBoxFormField(institution.isUseEmailWhitelist()), isInstitutionAdmin); fields.add(useEmailWhitelist); institutionFields.add(useEmailWhitelist); ((CheckBox)useEmailWhitelist.getFieldWidget()).addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { if(event.getValue()){ } } }); allowRegistrationByUsername = new KornellFormFieldWrapper("Permitir Registro por Usuário", formHelper.createCheckBoxFormField(institution.isAllowRegistrationByUsername()), isPlatformAdmin); fields.add(allowRegistrationByUsername); institutionFields.add(allowRegistrationByUsername); ((CheckBox)allowRegistrationByUsername.getFieldWidget()).addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { if(event.getValue()){ } } }); } terms = new KornellFormFieldWrapper("Termos de Uso", formHelper.createTextAreaFormField(institution.getTerms(), 20), isInstitutionAdmin); terms.addStyleName("heightAuto"); terms.addStyleName("marginBottom25"); fields.add(terms); institutionFields.add(terms); final ListBox timeZones = formHelper.getTimeZonesList(); if(institution.getTimeZone() != null){ timeZones.setSelectedValue(institution.getTimeZone()); } timeZone = new KornellFormFieldWrapper("Fuso horário", new ListBoxFormField(timeZones), isInstitutionAdmin); fields.add(timeZone); institutionFields.add(timeZone); final ListBox skins = formHelper.getSkinsList(); if(institution.getSkin() != null){ skins.setSelectedValue(institution.getSkin()); } else { skins.setSelectedValue(""); } skin = new KornellFormFieldWrapper("Tema visual", new ListBoxFormField(skins), isPlatformAdmin); fields.add(skin); institutionFields.add(skin); ((ListBox)skin.getFieldWidget()).addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { Dean.showContentNative(false); Callback<Void, Exception> callback = new Callback<Void, Exception>() { public void onFailure(Exception reason) { Window.Location.reload(); } public void onSuccess(Void result) { Dean.showContentNative(true); } }; CSSInjector.updateSkin(skin.getFieldPersistText(), callback); } }); institutionSupportEmail = new KornellFormFieldWrapper("E-mail de suporte", formHelper.createTextBoxFormField(institution.getInstitutionSupportEmail()), isPlatformAdmin); fields.add(institutionSupportEmail); institutionFields.add(institutionSupportEmail); institutionFields.add(formHelper.getImageSeparator()); institutionFields.setVisible(true); } private boolean validateFields() { if (!formHelper.isLengthValid(name.getFieldPersistText(), 2, 20)) { name.setError("Insira o sub-domínio da instituição."); } if (!formHelper.isLengthValid(fullName.getFieldPersistText(), 2, 50)) { fullName.setError("Insira o nome da instituição."); } if (!formHelper.isLengthValid(baseURL.getFieldPersistText(), 10, 200)) { baseURL.setError("Insira a URL base."); } if(isPlatformAdmin){ if (!formHelper.isLengthValid(assetsRepositoryUUID.getFieldPersistText(), 10, 200)) { assetsRepositoryUUID.setError("Insira o UUID do repositório."); } } if(!formHelper.isLengthValid(timeZone.getFieldPersistText(), 2, 100)){ timeZone.setError("Escolha o fuso horário."); } return !formHelper.checkErrors(fields); } @UiHandler("btnOK") void doOK(ClickEvent e) { formHelper.clearErrors(fields); if (isInstitutionAdmin && validateFields()) { LoadingPopup.show(); Institution institution = getInstitutionInfoFromForm(); presenter.updateInstitution(institution); } } private Institution getInstitutionInfoFromForm() { institution.setName(name.getFieldPersistText()); institution.setFullName(fullName.getFieldPersistText()); institution.setTerms(terms.getFieldPersistText()); institution.setBaseURL(baseURL.getFieldPersistText()); institution.setDemandsPersonContactDetails(demandsPersonContactDetails.getFieldPersistText().equals("true")); institution.setValidatePersonContactDetails(validatePersonContactDetails.getFieldPersistText().equals("true")); institution.setAllowRegistration(allowRegistration.getFieldPersistText().equals("true")); institution.setTimeZone(timeZone.getFieldPersistText()); if(isPlatformAdmin){ institution.setAssetsRepositoryUUID(assetsRepositoryUUID.getFieldPersistText()); institution.setBillingType(BillingType.valueOf(billingType.getFieldPersistText())); institution.setInstitutionType(InstitutionType.valueOf(institutionType.getFieldPersistText())); institution.setAllowRegistrationByUsername(allowRegistrationByUsername.getFieldPersistText().equals("true")); institution.setUseEmailWhitelist(useEmailWhitelist.getFieldPersistText().equals("true")); institution.setSkin(skin.getFieldPersistText()); institution.setInstitutionSupportEmail(institutionSupportEmail.getFieldPersistText()); } return institution; } @UiHandler("btnCancel") void doCancel(ClickEvent e) { initData(); } @Override public void setPresenter(Presenter presenter) { this.presenter = presenter; } }