public ContextMenuPage() {
    ContextMenuItem menuItem1 = new ContextMenuItem();
    menuItem1.setLabel("Option 1");
    menuItem1.setAction("alert('Option 1');");
    ContextMenuItem menuItem2 = new ContextMenuItem();
    menuItem2.setDisabled(true);
    menuItem2.setLabel("Option 2");
    menuItem2.setAction("alert('Option 2');");
    ContextMenuItem menuItem3 = new ContextMenuItem();
    menuItem3.setLabel("Option 3");
    menuItem3.setAction("alert('Option 3');");
    menuItem3.setHoverTitle("Option3 plays an important role.");

    ContextMenuBehavior menuBehavior1 = new ContextMenuBehavior();
    WebMarkupContainer divContainer = new WebMarkupContainer("divmenu");
    divContainer.add(menuBehavior1);
    add(divContainer);
    menuBehavior1.addMenuItem(menuItem1);
    menuBehavior1.addMenuItem(menuItem2);

    ContextMenuBehavior menuBehavior2 = new ContextMenuBehavior();
    Button button = new Button("menuButton");
    button.add(menuBehavior2);
    add(button);
    menuBehavior2.addMenuItem(menuItem1);
    menuBehavior2.addSeperator();
    menuBehavior2.addMenuItem(menuItem2);
    menuBehavior2.addSeperator();
    menuBehavior2.addMenuItem(menuItem3);

    menuBehavior2.setThemes(ContextMenuBehavior.Theme.VISTA);
    menuBehavior2.setOpenOnLeftClick(true);
  }
  protected void constructPanel() {
    Form<AgentPortalCustomCashInConfirmPanel> form =
        new Form<AgentPortalCustomCashInConfirmPanel>(
            "cashInConfirmForm",
            new CompoundPropertyModel<AgentPortalCustomCashInConfirmPanel>(this));

    form.add(new FeedbackPanel("errorMessages"));

    form.add(new Label("cashInBean.accountNumber"));
    form.add(new Label("cashInBean.msisdn"));
    form.add(new Label("cashInBean.displayName"));
    form.add(new AmountLabel("cashInBean.cashinAmount", true, true));

    // Add Confirm button
    Button confirmButton =
        new Button("submitConfirm") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            if (!PortalUtils.exists(cashInBean)) {
              cashInBean = new AgentCustomCashInBean();
            }

            performCashIn();
          };
        };

    confirmButton.add(new AttributePrepender("onclick", Model.of("loading(submitConfirm)"), ";"));

    form.add(confirmButton);

    // Add Back button
    form.add(
        new Button("submitBack") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(new AgentPortalCustomCashInPage());
          };
        });

    // Add Cancel button
    form.add(
        new Button("submitCancle") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            basePage.handleCancelButtonRedirectToHomePage(AgentPortalHomePage.class);
          };
        });

    add(form);
  }
Beispiel #3
0
  @Override
  protected void onComponentTag(ComponentTag tag) {
    // WICKET-5594 prevent non-Ajax submit
    tag.put("type", "button");

    super.onComponentTag(tag);
  }
  @Override
  protected void onInitialize() {
    super.onInitialize();
    InjectorHolder.getInjector().inject(this);
    modelName.setObject(_user.getName());
    addFeedback(this, "feedback");

    Form<String> form =
        new Form<String>("form") {
          @Override
          protected void onSubmit() {
            onSubmitForm();
          }
        };

    Button cancel =
        new Button("cancel") {
          public void onSubmit() {
            setResponsePage(UserOverviewPage.class);
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    addTextInputField(form, "username", modelName, true);
    form.add(new PasswordTextField("password1", modelPassword1));
    form.add(new PasswordTextField("password2", modelPassword2));

    form.add(new Button("submit"));

    List<UserRoles> current = new ArrayList<UserRoles>();
    current.add(UserRoles.NONE);
    modelRoles = new MyModel(current);

    List<? extends UserRoles> choices = UserRoles.asList();
    ListMultipleChoice<UserRoles> roleSelect =
        new ListMultipleChoice<UserRoles>("roleSelect", modelRoles, choices);
    form.add(roleSelect);

    List<String> providers = facade.availableProviders();
    selectedProvider = providers.get(0);
    ListChoice<String> providerSelect =
        new ListChoice<String>(
            "providerSelect", new PropertyModel<String>(this, "selectedProvider"), providers);
    form.add(providerSelect);
    add(form);
  }
 @Override
 protected void onInitialize() {
   super.onInitialize();
   add(new FeedbackPanel("feedback").setOutputMarkupId(true));
   _form =
       new Form<String>("form") {
         @Override
         protected void onSubmit() {
           onSubmitForm();
         }
       };
   Button cancel =
       new Button("cancel") {
         public void onSubmit() {
           onCancel();
         }
       };
   cancel.setDefaultFormProcessing(false);
   _form.add(cancel);
   _form.add(new Button("submit"));
   initForm(_form);
   add(_form);
 }
  private Button novoBotaoConsultar() {
    Button btnConsultar =
        new Button("btnConsultar") {
          @Override
          public void onSubmit() {
            if (edtDataDeReferencia.getValue().isEmpty()) {
              error("A data de referência deve ser informada.");
            } else {
              try {
                transacoes =
                    AutorizadorAdapter.get()
                        .consultaTransacoes(UtilHelper.getData(edtDataDeReferencia.getValue()));
              } catch (Exception e) {
                error(e.getMessage());
              }
            }
          }
        };

    btnConsultar.setDefaultFormProcessing(false);

    return btnConsultar;
  }
Beispiel #7
0
  public void initialiseDetailForm() {
    customFieldGroupTxtFld = new TextField<String>("customFieldGroup.name");
    description = new TextArea<String>("customFieldGroup.description");
    publishedStatusCb = new CheckBox("customFieldGroup.published");
    publishedStatusCb.add(
        new AjaxFormComponentUpdatingBehavior("onChange") {

          private static final long serialVersionUID = 1L;

          @Override
          protected void onUpdate(AjaxRequestTarget target) {
            // Check what was selected and then toggle
            if (publishedStatusCb.getModelObject().booleanValue()) {
              error("Custom Fields may not be added or removed once the Data Set is published.");
              target.add(feedBackPanel);
            } else {
              target.add(feedBackPanel);
            }
          }
        });

    fileUploadField = new FileUploadField("customFieldFileUploadField");
    fileUploadButton =
        new Button("uploadCustomFieldField") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setSelectedCustomFieldsFromFile();
          }
        };
    fileUploadButton.setDefaultFormProcessing(false);

    if (addCustomFieldDisplayList) {
      initCustomFieldDataListPanel();
    } else {
      arkCrudContainerVO
          .getWmcForCustomFieldDisplayListPanel()
          .addOrReplace(new EmptyPanel("cfdListPanel"));
    }

    initCustomFieldPalette();
    addDetailFormComponents();
    attachValidators();
  }
  @SuppressWarnings("serial")
  public IncluirUsuarioPage(final PageParameters parameters) {
    super(parameters, "Usuário", "Incluir usuário");
    @SuppressWarnings("rawtypes")
    Form form = new Form("form");
    add(form);

    form.add(new FeedbackPanel("mensagem"));

    TextField<String> textFieldNome =
        new TextField<String>("nome", new PropertyModel<String>(this, "usuario.nome"));
    textFieldNome.setRequired(true);

    form.add(textFieldNome);

    TextField<String> textFieldLogin =
        new TextField<String>("login", new PropertyModel<String>(this, "usuario.login"));
    textFieldLogin.setRequired(true);
    form.add(textFieldLogin);

    form.add(new PasswordTextField("senha", new PropertyModel<String>(this, "usuario.senha")));

    form.add(
        new PasswordTextField(
            "confirmarSenha", new PropertyModel<String>(this, "senhaConfirmada")));

    List<Permissao> permissoes = (List<Permissao>) new PermissaoBO().getListaTodasPermissoes();

    @SuppressWarnings("rawtypes")
    IChoiceRenderer renderer = new ChoiceRenderer("descricao", "codigo");

    @SuppressWarnings({"rawtypes", "unchecked"})
    final Palette palette =
        new Palette(
            "palette",
            new ListModel<Permissao>(new ArrayList<Permissao>()),
            new CollectionModel<Permissao>(permissoes),
            renderer,
            10,
            true);

    form.add(palette);

    form.add(
        new Button("btnSalvar") {

          @Override
          public void onSubmit() {
            // Verifica se o login já foi cadastrado
            UsuarioBO usuarioBO = new UsuarioBO();

            if (isSenhaValida()) {
              usuario.setLogin(usuario.getLogin().toLowerCase());
              if (!usuarioBO.isLoginCadastrado(usuario)) {
                @SuppressWarnings("unchecked")
                ListModel<Permissao> modelPermissao =
                    (ListModel<Permissao>) palette.getDefaultModel();
                usuario.setListaPermissao(modelPermissao.getObject());
                usuarioBO.inserir(usuario);

                setResponsePage(new ListarUsuarioPage(usuario.getId()));
              } else {
                error("Login já cadastrado.");
              }

            } else {
              error("A Senha confirmada é diferente da Senha informada.");
            }
          }
        });

    Button btnVoltar =
        new Button("btnVoltar") {
          @Override
          public void onSubmit() {
            setResponsePage(ListarUsuarioPage.class);
          }
        };

    btnVoltar.setDefaultFormProcessing(false);

    form.add(btnVoltar);
  }
  protected void setupPage(final RepositoryModel repositoryModel) {
    // ensure this user can create or edit this repository
    checkPermissions(repositoryModel);

    List<String> federationSets = new ArrayList<String>();
    List<String> repositoryUsers = new ArrayList<String>();
    if (isCreate) {
      super.setupPage(getString("gb.newRepository"), "");
    } else {
      super.setupPage(getString("gb.edit"), repositoryModel.name);
      if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
        repositoryUsers.addAll(GitBlit.self().getRepositoryUsers(repositoryModel));
        Collections.sort(repositoryUsers);
      }
      federationSets.addAll(repositoryModel.federationSets);
    }

    final String oldName = repositoryModel.name;
    // users palette
    final Palette<String> usersPalette =
        new Palette<String>(
            "users",
            new ListModel<String>(repositoryUsers),
            new CollectionModel<String>(GitBlit.self().getAllUsernames()),
            new ChoiceRenderer<String>("", ""),
            10,
            false);

    // federation sets palette
    List<String> sets = GitBlit.getStrings(Keys.federation.sets);
    final Palette<String> federationSetsPalette =
        new Palette<String>(
            "federationSets",
            new ListModel<String>(federationSets),
            new CollectionModel<String>(sets),
            new ChoiceRenderer<String>("", ""),
            10,
            false);

    CompoundPropertyModel<RepositoryModel> model =
        new CompoundPropertyModel<RepositoryModel>(repositoryModel);
    Form<RepositoryModel> form =
        new Form<RepositoryModel>("editForm", model) {

          private static final long serialVersionUID = 1L;

          @Override
          protected void onSubmit() {
            try {
              // confirm a repository name was entered
              if (StringUtils.isEmpty(repositoryModel.name)) {
                error("Please set repository name!");
                return;
              }

              // automatically convert backslashes to forward slashes
              repositoryModel.name = repositoryModel.name.replace('\\', '/');
              // Automatically replace // with /
              repositoryModel.name = repositoryModel.name.replace("//", "/");

              // prohibit folder paths
              if (repositoryModel.name.startsWith("/")) {
                error("Leading root folder references (/) are prohibited.");
                return;
              }
              if (repositoryModel.name.startsWith("../")) {
                error("Relative folder references (../) are prohibited.");
                return;
              }
              if (repositoryModel.name.contains("/../")) {
                error("Relative folder references (../) are prohibited.");
                return;
              }

              // confirm valid characters in repository name
              Character c = StringUtils.findInvalidCharacter(repositoryModel.name);
              if (c != null) {
                error(MessageFormat.format("Illegal character ''{0}'' in repository name!", c));
                return;
              }

              // confirm access restriction selection
              if (repositoryModel.accessRestriction == null) {
                error("Please select access restriction!");
                return;
              }

              // save federation set preferences
              if (repositoryModel.federationStrategy.exceeds(FederationStrategy.EXCLUDE)) {
                repositoryModel.federationSets.clear();
                Iterator<String> sets = federationSetsPalette.getSelectedChoices();
                while (sets.hasNext()) {
                  repositoryModel.federationSets.add(sets.next());
                }
              }

              // save the repository
              GitBlit.self().updateRepositoryModel(oldName, repositoryModel, isCreate);

              // save the repository access list
              if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
                Iterator<String> users = usersPalette.getSelectedChoices();
                List<String> repositoryUsers = new ArrayList<String>();
                while (users.hasNext()) {
                  repositoryUsers.add(users.next());
                }
                // ensure the owner is added to the user list
                if (repositoryModel.owner != null
                    && !repositoryUsers.contains(repositoryModel.owner)) {
                  repositoryUsers.add(repositoryModel.owner);
                }
                GitBlit.self().setRepositoryUsers(repositoryModel, repositoryUsers);
              }
            } catch (GitBlitException e) {
              error(e.getMessage());
              return;
            }
            setRedirect(false);
            setResponsePage(RepositoriesPage.class);
          }
        };

    // field names reflective match RepositoryModel fields
    form.add(new TextField<String>("name").setEnabled(isCreate || isAdmin));
    form.add(new TextField<String>("description"));
    form.add(
        new DropDownChoice<String>("owner", GitBlit.self().getAllUsernames())
            .setEnabled(GitBlitWebSession.get().canAdmin()));
    form.add(
        new DropDownChoice<AccessRestrictionType>(
            "accessRestriction",
            Arrays.asList(AccessRestrictionType.values()),
            new AccessRestrictionRenderer()));
    form.add(new CheckBox("isFrozen"));
    // TODO enable origin definition
    form.add(new TextField<String>("origin").setEnabled(false /* isCreate */));

    // federation strategies - remove ORIGIN choice if this repository has
    // no origin.
    List<FederationStrategy> federationStrategies =
        new ArrayList<FederationStrategy>(Arrays.asList(FederationStrategy.values()));
    if (StringUtils.isEmpty(repositoryModel.origin)) {
      federationStrategies.remove(FederationStrategy.FEDERATE_ORIGIN);
    }
    form.add(
        new DropDownChoice<FederationStrategy>(
            "federationStrategy", federationStrategies, new FederationTypeRenderer()));
    form.add(new CheckBox("useTickets"));
    form.add(new CheckBox("useDocs"));
    form.add(new CheckBox("showRemoteBranches"));
    form.add(new CheckBox("showReadme"));
    form.add(usersPalette);
    form.add(federationSetsPalette);

    form.add(new Button("save"));
    Button cancel =
        new Button("cancel") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(RepositoriesPage.class);
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    add(form);
  }
  private void createAttachmentsListDataView(
      WebMarkupContainer attachmentContainer, final Form form) {
    WebMarkupContainer msgAttachmentsContainer = new WebMarkupContainer("msgAttachmentsContainer");

    dataProvider = new MessageAttachmentDataProvider(WICKET_ID_name, basePage);

    msgAttachmentList = new ArrayList<MessageAttachment>();

    final DataView<MessageAttachment> dataView =
        new DataView<MessageAttachment>(WICKET_ID_pageable, dataProvider) {

          @Override
          protected void onBeforeRender() {

            try {
              if (!isCreateMode) dataProvider.loadMsgAttachmentsList(message.getId(), forceReload);
              forceReload = false;
              refreshTotalItemCount();
              // reset rowIndex
              rowIndex = 1;
            } catch (DataProviderLoadException dple) {
              LOG.error("# An error occurred while loading friends and family list", dple);
              error(getLocalizer().getString("msgAttachments.load.error", this));
            }

            refreshTotalItemCount();

            super.onBeforeRender();
          }

          @Override
          protected void populateItem(final Item<MessageAttachment> item) {

            final MessageAttachment entry = item.getModelObject();

            msgAttachmentList.add(entry);

            // Select box
            AjaxCheckBox selectedCheckBox =
                new AjaxCheckBoxImpl(WICKET_ID_selected, new Model(isSelected(entry)), entry);

            selectedCheckBox.setOutputMarkupId(true);
            selectedCheckBox.setMarkupId(WICKET_ID_selected + rowIndex++);
            item.add(selectedCheckBox);

            item.add(new Label(WICKET_ID_name, entry.getName()));

            // set items in even/odd rows to different css style classes
            item.add(
                new AttributeModifier(
                    Constants.CSS_KEYWARD_CLASS,
                    true,
                    new AbstractReadOnlyModel<String>() {
                      @Override
                      public String getObject() {
                        return (item.getIndex() % 2 == 1)
                            ? Constants.CSS_STYLE_ODD
                            : Constants.CSS_STYLE_EVEN;
                      }
                    }));
          }

          private void refreshTotalItemCount() {
            totalItemString = new Integer(dataProvider.size()).toString();
            int total = getItemCount();
            if (total > 0) {
              startIndex = getCurrentPage() * getItemsPerPage() + 1;
              endIndex = startIndex + getItemsPerPage() - 1;
              if (endIndex > total) endIndex = total;
            } else {
              startIndex = 0;
              endIndex = 0;
            }
          }

          class AjaxCheckBoxImpl extends AjaxCheckBox {

            private final MessageAttachment entry;

            public AjaxCheckBoxImpl(String id, IModel<Boolean> model, MessageAttachment entry) {
              super(id, model);
              this.entry = entry;
            }

            @Override
            public boolean isEnabled() {
              return true;
            }

            @Override
            protected void onComponentTag(final ComponentTag tag) {
              super.onComponentTag(tag);
              if (getModelObject()) {
                tag.put("checked", "checked");
              }
            }

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
              boolean checkBoxSelected = getModelObject();
              if (checkBoxSelected) {
                LOG.info("Added {} to deletion list", entry.getId());
                selectedAttachments.add(entry);
              } else {
                LOG.info("Removed {} from deletion list", entry.getId());
                selectedAttachments.remove(entry);
              }
            }
          }
        };

    dataView.setItemsPerPage(10);
    msgAttachmentsContainer.add(dataView);

    msgAttachmentsContainer.add(
        new OrderByBorder(WICKET_ID_orderByName, WICKET_ID_name, dataProvider) {
          @Override
          protected void onSortChanged() {
            // For some reasons the dataView can be null when the page is
            // loading
            // and the sort is clicked (clicking the name header), so handle
            // it
            if (dataView != null) {
              dataView.setCurrentPage(0);
            }
          }
        });

    Button removeButton =
        new Button("removeAttachment") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            handleRemove();
            createAttachmentContainer(form);
          };

          @Override
          public boolean isVisible() {
            if (dataView.getItemCount() > 0) {
              return super.isVisible();
            } else {
              return false;
            }
          }
        }.setDefaultFormProcessing(false);

    removeButton.add(
        new SimpleAttributeModifier(
            "onclick",
            "return confirm('"
                + getLocalizer().getString("msgAttachments.remove.confirm", this)
                + "');"));

    msgAttachmentsContainer.add(removeButton);

    msgAttachmentsContainer.add(
        new MultiLineLabel(
            WICKET_ID_noItemsMsg,
            getLocalizer().getString("msgAttachments.noItemsMsg", this)
                + "\n"
                + getLocalizer().getString("msgAttachments.addMsgAttachmentsHelp", this)) {
          @Override
          public boolean isVisible() {
            if (dataView.getItemCount() > 0) {
              return false;
            } else {
              return super.isVisible();
            }
          }
        });

    // Navigator example: << < 1 2 > >>
    msgAttachmentsContainer.add(new CustomPagingNavigator(WICKET_ID_navigator, dataView));

    msgAttachmentsContainer.add(
        new Label(WICKET_ID_totalItems, new PropertyModel<String>(this, "totalItemString")));

    msgAttachmentsContainer.add(
        new Label(WICKET_ID_startIndex, new PropertyModel(this, "startIndex")));

    msgAttachmentsContainer.add(new Label(WICKET_ID_endIndex, new PropertyModel(this, "endIndex")));
    attachmentContainer.addOrReplace(msgAttachmentsContainer);
  }
  @Override
  public void onInitialize() {
    super.onInitialize();

    // unpack model
    final ImportWizardModel importWizardModel = this.model.getObject();

    final CheckGroup<ProcessedGradeItem> group =
        new CheckGroup<ProcessedGradeItem>("group", new ArrayList<ProcessedGradeItem>());

    final Form<?> form =
        new Form("form") {
          private static final long serialVersionUID = 1L;

          @Override
          protected void onSubmit() {
            boolean validated = true;

            final List<ProcessedGradeItem> selectedGradeItems =
                (List<ProcessedGradeItem>) group.getModelObject();
            log.debug("Processed items: " + selectedGradeItems.size());

            // this has an odd model so we need to have the validation in the onSubmit.
            if (selectedGradeItems.size() == 0) {
              validated = false;
              error(getString("importExport.selection.noneselected"));
            }

            if (validated) {

              // clear any previous errors
              final ImportExportPage page = (ImportExportPage) getPage();
              page.clearFeedback();

              // Process the selected items into the create/update lists
              final List<ProcessedGradeItem> itemsToUpdate =
                  filterListByStatus(
                      selectedGradeItems,
                      Arrays.asList(
                          ProcessedGradeItemStatus.STATUS_UPDATE,
                          ProcessedGradeItemStatus.STATUS_NA));
              final List<ProcessedGradeItem> itemsToCreate =
                  filterListByStatus(
                      selectedGradeItems, Arrays.asList(ProcessedGradeItemStatus.STATUS_NEW));

              log.debug("Filtered Update items: " + itemsToUpdate.size());
              log.debug("Filtered Create items: " + itemsToCreate.size());

              final List<ProcessedGradeItem> gbItemsToCreate = new ArrayList<ProcessedGradeItem>();
              itemsToCreate.forEach(
                  item -> {
                    // Don't want comment items here
                    if (!"N/A".equals(item.getItemPointValue())) {
                      gbItemsToCreate.add(item);
                    }
                  });

              log.debug("Actual items to create: " + gbItemsToCreate.size());

              // repaint panel
              Component newPanel = null;
              importWizardModel.setSelectedGradeItems(selectedGradeItems);
              importWizardModel.setGbItemsToCreate(gbItemsToCreate);
              importWizardModel.setItemsToCreate(itemsToCreate);
              importWizardModel.setItemsToUpdate(itemsToUpdate);
              if (gbItemsToCreate.size() > 0) {
                importWizardModel.setStep(1);
                importWizardModel.setTotalSteps(gbItemsToCreate.size());
                newPanel =
                    new CreateGradeItemStep(
                        GradeItemImportSelectionStep.this.panelId, Model.of(importWizardModel));
              } else {
                newPanel =
                    new GradeImportConfirmationStep(
                        GradeItemImportSelectionStep.this.panelId, Model.of(importWizardModel));
              }
              newPanel.setOutputMarkupId(true);
              GradeItemImportSelectionStep.this.replaceWith(newPanel);
            }
          }
        };
    add(form);
    form.add(group);

    final Button backButton =
        new Button("backbutton") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {

            // clear any previous errors
            final ImportExportPage page = (ImportExportPage) getPage();
            page.clearFeedback();

            final Component newPanel =
                new GradeImportUploadStep(GradeItemImportSelectionStep.this.panelId);
            newPanel.setOutputMarkupId(true);
            GradeItemImportSelectionStep.this.replaceWith(newPanel);
          }
        };
    backButton.setDefaultFormProcessing(false);
    group.add(backButton);

    group.add(new Button("nextbutton"));

    group.add(new CheckGroupSelector("groupselector"));
    final ListView<ProcessedGradeItem> gradeList =
        new ListView<ProcessedGradeItem>("grades", importWizardModel.getProcessedGradeItems()) {
          private static final long serialVersionUID = 1L;

          @Override
          protected void populateItem(final ListItem<ProcessedGradeItem> item) {

            final Check<ProcessedGradeItem> checkbox = new Check<>("checkbox", item.getModel());
            final Label itemTitle =
                new Label(
                    "itemTitle", new PropertyModel<String>(item.getDefaultModel(), "itemTitle"));
            final Label itemPointValue =
                new Label(
                    "itemPointValue",
                    new PropertyModel<String>(item.getDefaultModel(), "itemPointValue"));
            final Label itemStatus = new Label("itemStatus");

            item.add(checkbox);
            item.add(itemTitle);
            item.add(itemPointValue);
            item.add(itemStatus);

            // Use the status code to look up the text representation
            final PropertyModel<ProcessedGradeItemStatus> statusProp =
                new PropertyModel<ProcessedGradeItemStatus>(item.getDefaultModel(), "status");
            final ProcessedGradeItemStatus status = statusProp.getObject();

            // For external items, set a different label and disable the control
            if (status.getStatusCode() == ProcessedGradeItemStatus.STATUS_EXTERNAL) {
              itemStatus.setDefaultModel(
                  new StringResourceModel(
                      "importExport.status." + status.getStatusCode(),
                      statusProp,
                      null,
                      status.getStatusValue()));
              item.setEnabled(false);
              item.add(new AttributeModifier("class", "external"));
            } else {

              itemStatus.setDefaultModel(
                  new ResourceModel("importExport.status." + status.getStatusCode()));

              // if no changes, grey it out and remove checkbox
              if (status.getStatusCode() == ProcessedGradeItemStatus.STATUS_NA) {
                checkbox.setVisible(false);
                item.add(new AttributeAppender("class", Model.of("no_changes"), " "));
              }
            }

            final String naString =
                getString("importExport.selection.pointValue.na", new Model(), "N/A");
            if (naString.equals(item.getModelObject().getItemPointValue())) {
              item.add(new AttributeAppender("class", Model.of("comment"), " "));
            }

            // add an additional row for the comments for each
            final PropertyModel<String> commentLabelProp =
                new PropertyModel<String>(item.getDefaultModel(), "commentLabel");
            final PropertyModel<ProcessedGradeItemStatus> commentStatusProp =
                new PropertyModel<ProcessedGradeItemStatus>(
                    item.getDefaultModel(), "commentStatus");
            final String commentLabel = commentLabelProp.getObject();
            final ProcessedGradeItemStatus commentStatus = commentStatusProp.getObject();

            item.add(
                new Behavior() {
                  private static final long serialVersionUID = 1L;

                  @Override
                  public void afterRender(final Component component) {
                    super.afterRender(component);
                    if (commentLabel != null) {
                      String rowClass = "comment";
                      String statusValue =
                          getString("importExport.status." + commentStatus.getStatusCode());
                      if (commentStatus.getStatusCode()
                          == ProcessedGradeItemStatus.STATUS_EXTERNAL) {
                        rowClass += " external";
                        statusValue =
                            new StringResourceModel(
                                    "importExport.status." + commentStatus.getStatusCode(),
                                    commentStatusProp,
                                    null,
                                    commentStatus.getStatusValue())
                                .getString();
                      }
                      if (commentStatus.getStatusCode() == ProcessedGradeItemStatus.STATUS_NA) {
                        rowClass += " no_changes";
                      }

                      component
                          .getResponse()
                          .write(
                              "<tr class=\""
                                  + rowClass
                                  + "\">"
                                  + "<td></td>"
                                  + "<td class=\"item_title\">"
                                  + commentLabel
                                  + "</td>"
                                  + "<td class=\"item_points\">"
                                  + naString
                                  + "</td>"
                                  + "<td class=\"item_status\">"
                                  + statusValue
                                  + "</td>"
                                  + "</tr>");
                    }
                  }
                });
          }
        };

    gradeList.setReuseItems(true);
    group.add(gradeList);
  }
Beispiel #12
0
    public TemplateForm(String id, final String section, boolean custom, UserData u) {
      super(id);
      this.user = u;
      this.section = section;
      final com.rectang.xsm.site.Site site = user.getSite();

      Button create =
          new Button("create") {
            public void onSubmit() {
              InputStream in = null;
              OutputStream out = null;
              try {
                in = getDefault(section, user.getSite());
                out = new FileOutputStream(getCustomFile(section));
                IOUtil.copyStream(in, out);

                if (section.equals("layout")) {
                  site.setLayout("custom");
                  site.save();
                } else if (section.equals("style")) {
                  site.setStylesheet("custom");
                  site.save();
                }

                // Here we need to redirect back to this page to refresh the models - not sure
                // why...
                setResponsePage(EditTemplate.class, getPageParameters());
              } catch (IOException e) {
                error("Unable to create custom copy of template " + section);
              } finally {
                if (in != null) {
                  IOUtil.close(in);
                }
                if (out != null) {
                  IOUtil.close(out);
                }
              }
            }
          };
      create.setDefaultFormProcessing(false);
      add(create);

      Button save = new Button("save");
      add(save);

      Button revert = new Button("revert");
      add(revert);

      Button delete =
          new Button("delete") {
            public void onSubmit() {
              if (getCustomFile(section).delete()) {
                if (section.equals("layout")) {
                  site.setLayout("menu-left");
                  site.save();
                } else if (section.equals("style")) {
                  site.setStylesheet("grey");
                  site.getPublishedDoc("style.css").delete();
                  site.save();
                }

                if (section.equals("template")) {
                  site.publish(user);
                } else {
                  site.publishTheme();
                }
                // Here we need to redirect back to this page to refresh the models - not sure
                // why...
                setResponsePage(EditTemplate.class, getPageParameters());
              } else {
                error("Unable to delete custom template " + section);
              }
            }
          };
      delete.setDefaultFormProcessing(false);
      add(delete);

      if (custom) {
        add(new TextArea("customise", new StringFileModel(getCustomFile(section))));

        create.setVisible(false);
      } else {
        StringBuffer content = new StringBuffer();
        BufferedReader reader = null;
        try {
          reader = new BufferedReader(new InputStreamReader(getDefault(section, site)));

          String line = reader.readLine();
          while (line != null) {
            content.append(line);
            content.append('\n');

            line = reader.readLine();
          }
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          if (reader != null) {
            IOUtil.close(reader);
          }
        }

        TextArea area = new TextArea("customise", new Model(content.toString()));

        area.setEnabled(false);
        add(area);

        save.setVisible(false);
        revert.setVisible(false);
        delete.setVisible(false);
      }

      BookmarkablePageLink back;
      back = new BookmarkablePageLink("back", Theme.class);
      back.add(new Label("back-label", "Back to Theme page"));
      add(back);
    }
Beispiel #13
0
  @Override
  protected void onInitialize() {
    super.onInitialize();

    add(newAjaxFormSubmitBehavior("click"));
  }
  @Override
  public void onInitialize() {
    super.onInitialize();

    // unpack model
    final ImportWizardModel importWizardModel = this.model.getObject();

    final List<ProcessedGradeItem> itemsToCreate = importWizardModel.getItemsToCreate();
    final List<ProcessedGradeItem> itemsToUpdate = importWizardModel.getItemsToUpdate();
    final List<Assignment> assignmentsToCreate = importWizardModel.getAssignmentsToCreate();

    final Form<?> form =
        new Form("form") {
          private static final long serialVersionUID = 1L;

          boolean errors = false;

          @Override
          protected void onSubmit() {

            final Map<String, Long> assignmentMap = new HashMap<>();

            // Create new GB items
            assignmentsToCreate.forEach(
                assignment -> {
                  final Long assignmentId =
                      GradeImportConfirmationStep.this.businessService.addAssignment(assignment);
                  assignmentMap.put(StringUtils.trim(assignment.getName()), assignmentId);
                });

            final List<ProcessedGradeItem> itemsToSave = new ArrayList<ProcessedGradeItem>();
            itemsToSave.addAll(itemsToUpdate);
            itemsToSave.addAll(itemsToCreate);

            itemsToSave.forEach(
                processedGradeItem -> {
                  log.debug("Looping through items to save");

                  List<ProcessedGradeItemDetail> processedGradeItemDetails =
                      processedGradeItem.getProcessedGradeItemDetails();

                  processedGradeItemDetails.forEach(
                      processedGradeItemDetail -> {
                        log.debug("Looping through detail items to save");

                        // get data
                        Long assignmentId = processedGradeItem.getItemId();
                        String assignmentTitle =
                            StringUtils.trim(
                                processedGradeItem
                                    .getItemTitle()); // trim to match the gbservice behaviour

                        if (assignmentId == null) {
                          // Should be a newly created GB item
                          assignmentId = assignmentMap.get(assignmentTitle);
                        }

                        final GradeSaveResponse saved =
                            GradeImportConfirmationStep.this.businessService.saveGrade(
                                assignmentId,
                                processedGradeItemDetail.getStudentUuid(),
                                processedGradeItemDetail.getGrade(),
                                processedGradeItemDetail.getComment());

                        // if no change, try just the comment
                        if (saved == GradeSaveResponse.NO_CHANGE) {

                          // Check for changed comments
                          final String currentComment =
                              StringUtils.trimToNull(
                                  GradeImportConfirmationStep.this.businessService
                                      .getAssignmentGradeComment(
                                          assignmentId, processedGradeItemDetail.getStudentUuid()));
                          final String newComment =
                              StringUtils.trimToNull(processedGradeItemDetail.getComment());

                          if (!StringUtils.equals(currentComment, newComment)) {
                            final boolean success =
                                GradeImportConfirmationStep.this.businessService
                                    .updateAssignmentGradeComment(
                                        assignmentId,
                                        processedGradeItemDetail.getStudentUuid(),
                                        newComment);
                            log.info(
                                "Saving comment: "
                                    + success
                                    + ", "
                                    + assignmentId
                                    + ", "
                                    + processedGradeItemDetail.getStudentEid()
                                    + ", "
                                    + processedGradeItemDetail.getComment());
                            if (!success) {
                              errors = true;
                            }
                          }
                        } else if (saved != GradeSaveResponse.OK) {
                          // Anything other than OK is bad
                          errors = true;
                        }
                        log.info(
                            "Saving grade: "
                                + saved
                                + ", "
                                + assignmentId
                                + ", "
                                + processedGradeItemDetail.getStudentEid()
                                + ", "
                                + processedGradeItemDetail.getGrade()
                                + ", "
                                + processedGradeItemDetail.getComment());
                      });
                });

            if (!errors) {
              getSession().success(getString("importExport.confirmation.success"));
              setResponsePage(new GradebookPage());
            } else {
              getSession().error(getString("importExport.confirmation.failure"));
            }
          }
        };
    add(form);

    // back button
    final Button backButton =
        new Button("backbutton") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            log.debug("Clicking back button...");
            Component newPanel = null;
            if (assignmentsToCreate.size() > 0) {
              newPanel =
                  new CreateGradeItemStep(
                      GradeImportConfirmationStep.this.panelId, Model.of(importWizardModel));
            } else {
              newPanel =
                  new GradeItemImportSelectionStep(
                      GradeImportConfirmationStep.this.panelId, Model.of(importWizardModel));
            }
            newPanel.setOutputMarkupId(true);
            GradeImportConfirmationStep.this.replaceWith(newPanel);
          }
        };
    backButton.setDefaultFormProcessing(false);
    form.add(backButton);

    // finish button
    form.add(new Button("finishbutton"));

    // items to be updated
    final boolean hasItemsToUpdate = !itemsToUpdate.isEmpty();
    final WebMarkupContainer gradesUpdateContainer =
        new WebMarkupContainer("grades_update_container") {
          private static final long serialVersionUID = 1L;

          @Override
          public boolean isVisible() {
            return hasItemsToUpdate;
          }
        };
    add(gradesUpdateContainer);

    if (hasItemsToUpdate) {
      final ListView<ProcessedGradeItem> updateList = makeListView("grades_update", itemsToUpdate);

      updateList.setReuseItems(true);
      gradesUpdateContainer.add(updateList);
    }

    // items to be created
    final boolean hasItemsToCreate = !itemsToCreate.isEmpty();
    final WebMarkupContainer gradesCreateContainer =
        new WebMarkupContainer("grades_create_container") {
          private static final long serialVersionUID = 1L;

          @Override
          public boolean isVisible() {
            return hasItemsToCreate;
          }
        };
    add(gradesCreateContainer);

    if (hasItemsToCreate) {
      final ListView<ProcessedGradeItem> createList = makeListView("grades_create", itemsToCreate);

      createList.setReuseItems(true);
      gradesCreateContainer.add(createList);
    }
  }
  protected void constructPanel() {

    final String chooseDtTxt = this.getLocalizer().getString("datepicker.chooseDate", mobBasePage);

    add(
        new HeaderContributor(
            new IHeaderContributor() {

              private static final long serialVersionUID = 1L;

              @Override
              public void renderHead(IHeaderResponse response) {

                // localize the jquery datepicker based on users locale setting
                // locale specific js includes for datepicker are available at
                // http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/
                String localeLang = getLocale().getLanguage().toLowerCase();

                LOG.debug("Using DatePicker for locale language: {}", localeLang);

                if (PortalUtils.exists(localeLang)) {
                  response.renderJavascriptReference(
                      "scripts/jquery/i18n/jquery.ui.datepicker-" + localeLang + ".js");
                }

                response.renderJavascript(
                    "\n"
                        + "jQuery(document).ready(function($) { \n"
                        + "  $('#birthDate').datepicker( { \n"
                        + "	'buttonText' : '"
                        + chooseDtTxt
                        + "', \n"
                        + "	'changeMonth' : true, \n"
                        + "	'changeYear' : true, \n"
                        + "       'yearRange' : '-100:+0', \n"
                        + "	'showOn': 'both', \n"
                        + "	'dateFormat' : '"
                        + Constants.DATE_FORMAT_PATTERN_PICKER
                        + "', \n"
                        + "	'buttonImage': 'images/calendar.gif', \n"
                        + "	'buttonOnlyImage': true} ); \n"
                        + "});\n",
                    "datePicker");
              }
            }));

    final Form<?> form =
        new Form("standingDataForm", new CompoundPropertyModel<StandingDataPanel>(this));

    if (!PortalUtils.exists(getCustomer().getTaskId()))
      mobBasePage.getMobiliserWebSession().setShowContact(true);
    form.add(new FeedbackPanel("errorMessages"));
    form.add(
            new RequiredTextField<String>("customer.address.firstName")
                .setRequired(true)
                .add(new PatternValidator(Constants.REGEX_FIRSTNAME))
                .add(Constants.mediumStringValidator)
                .add(Constants.mediumSimpleAttributeModifier))
        .add(new ErrorIndicator());

    form.add(
        new DateTextField(
                "birthDateField",
                new PropertyModel<Date>(this, "customer.birthDateString"),
                new PatternDateConverter(Constants.DATE_FORMAT_PATTERN_PARSE, false))
            .setRequired(true)
            .add(new ErrorIndicator()));

    form.add(
        new LocalizableLookupDropDownChoice<Integer>(
                "customer.customerTypeId",
                Integer.class,
                Constants.RESOURCE_BUNDLE_CUSTOMER_TYPE,
                this,
                Boolean.FALSE,
                true)
            .setNullValid(false)
            .setRequired(true));

    form.add(
            new RequiredTextField<String>("customer.address.lastName")
                .setRequired(true)
                .add(new PatternValidator(Constants.REGEX_FIRSTNAME))
                .add(Constants.mediumStringValidator)
                .add(Constants.mediumSimpleAttributeModifier))
        .add(new ErrorIndicator());

    form.add(
        new LocalizableLookupDropDownChoice<String>(
                "customer.language",
                String.class,
                Constants.RESOURCE_BUNDLE_LANGUAGES,
                this,
                false,
                true)
            .add(new ErrorIndicator()));

    form.add(
        new LocalizableLookupDropDownChoice<String>(
                "customer.timeZone",
                String.class,
                Constants.RESOURCE_BUNDLE_TIMEZONES,
                this,
                false,
                true)
            .add(new ErrorIndicator()));

    form.add(
        new TextField<String>("customer.address.street1")
            .add(new PatternValidator(Constants.REGEX_STREET1))
            .add(Constants.mediumStringValidator)
            .add(Constants.mediumSimpleAttributeModifier)
            .add(new ErrorIndicator()));

    form.add(
        new TextField<String>("customer.address.houseNo")
            .add(StringValidator.lengthBetween(1, 20))
            .add(Constants.mediumStringValidator)
            .add(Constants.mediumSimpleAttributeModifier)
            .add(new ErrorIndicator()));
    form.add(
        new TextField<String>("customer.address.state")
            .add(new PatternValidator(Constants.REGEX_STATE))
            .add(Constants.mediumStringValidator)
            .add(Constants.mediumSimpleAttributeModifier)
            .add(new ErrorIndicator()));

    form.add(
        new LocalizableLookupDropDownChoice<String>(
                "customer.address.kvCountry", String.class, "countries", this, false, true)
            .setNullValid(false)
            .setRequired(true)
            .add(new ErrorIndicator()));

    form.add(
        new TextField<String>("customer.address.street2")
            .add(new PatternValidator(Constants.REGEX_STREET1))
            .add(Constants.mediumStringValidator)
            .add(Constants.mediumSimpleAttributeModifier)
            .add(new ErrorIndicator()));

    form.add(
        new TextField<String>("customer.address.city")
            .setRequired(false)
            .add(new PatternValidator(Constants.REGEX_CITY))
            .add(Constants.mediumStringValidator)
            .add(Constants.mediumSimpleAttributeModifier)
            .add(new ErrorIndicator()));

    form.add(
        new TextField<String>("customer.address.zip")
            .add(new PatternValidator(Constants.REGEX_ZIP))
            .add(Constants.mediumStringValidator)
            .add(Constants.mediumSimpleAttributeModifier)
            .add(new ErrorIndicator()));

    TextField<String> msisdn = new TextField<String>("customer.msisdn");
    if (!mobBasePage.getConfiguration().isMsisdnOtpConfirmed()) {
      msisdn.add(new SimpleAttributeModifier("readonly", "readonly"));
      msisdn.add(new SimpleAttributeModifier("style", "background-color: #E6E6E6;"));
    }
    form.add(
        msisdn
            .add(new PatternValidator(Constants.REGEX_PHONE_NUMBER))
            .add(Constants.mediumStringValidator)
            .add(Constants.mediumSimpleAttributeModifier)
            .add(new ErrorIndicator()));

    form.add(
        new TextField<String>("customer.address.email")
            .setRequired(true)
            .add(EmailAddressValidator.getInstance())
            .add(Constants.mediumStringValidator)
            .add(Constants.mediumSimpleAttributeModifier)
            .add(new ErrorIndicator()));

    form.add(
        new LocalizableLookupDropDownChoice<Integer>(
                "customer.kvInfoMode", Integer.class, "sendModes", this, Boolean.FALSE, true)
            .setNullValid(false)
            .setRequired(true));

    WebMarkupContainer networkProviderDiv = new WebMarkupContainer("networkProviderDiv");

    networkProviderDiv.add(
        new LocalizableLookupDropDownChoice<String>(
                "customer.networkProvider", String.class, "networkproviders", this, false, true)
            .setNullValid(false)
            .setRequired(true)
            .add(new ErrorIndicator()));

    // network provider selection to be made only for mbanking customer
    // types
    if (customer.getCustomerTypeId() != null
        && customer.getCustomerTypeId().intValue() == Constants.MBANKING_CUSTOMER_TYPE) {
      networkProviderDiv.setVisible(true);
    } else {
      networkProviderDiv.setVisible(false);
    }

    form.add(networkProviderDiv);

    form.add(
        new KeyValueDropDownChoice<Long, String>(
            "customer.feeSetId", mobBasePage.getFeeSets(getCustomer().getFeeSetId())) {
          private static final long serialVersionUID = 1L;

          @Override
          protected CharSequence getDefaultChoice(Object selected) {
            return null;
          };
        }.setNullValid(false));

    form.add(
        new KeyValueDropDownChoice<Long, String>(
            "customer.limitId", getLimitSets(getCustomer().getLimitId())) {

          private static final long serialVersionUID = 1L;
        }.setNullValid(true));

    Button feeSetConfButton =
        new Button("feeSetConf") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(new IndividualFeeSetConfig(getCustomer()));
          };
        }.setDefaultFormProcessing(false);
    feeSetConfButton.add(new PrivilegedBehavior(mobBasePage, Constants.PRIV_CUST_WRITE));
    form.add(feeSetConfButton);

    Button limitSetConfButton =
        new Button("limitSetConf") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(new IndividualLimitSetConfig(getCustomer()));
          };
        }.setDefaultFormProcessing(false);
    limitSetConfButton.add(new PrivilegedBehavior(mobBasePage, Constants.PRIV_CUST_WRITE));
    form.add(limitSetConfButton);

    form.add(
        new LocalizableLookupDropDownChoice<String>(
                "customer.securityQuestion",
                String.class,
                Constants.RESOURCE_BUNDLE_SEC_QUESTIONS,
                this,
                false,
                true)
            .setNullValid(false)
            .setRequired(true)
            .add(new ErrorIndicator()));

    form.add(
        new TextField<String>("customer.userName")
            .add(new PatternValidator(Constants.REGEX_USERNAME))
            .add(Constants.mediumStringValidator)
            .add(Constants.mediumSimpleAttributeModifier)
            .add(new ErrorIndicator()));

    form.add(
        new RequiredTextField<String>("customer.SecQuesAns")
            .add(new PatternValidator(Constants.REGEX_SECURITY_ANSWER))
            .add(Constants.mediumStringValidator)
            .add(Constants.mediumSimpleAttributeModifier)
            .add(new ErrorIndicator()));

    PrivilegedBehavior cancelReasonBehavior =
        new PrivilegedBehavior(mobBasePage, Constants.PRIV_CUST_CANCEL);
    cancelReasonBehavior.setMissingPrivilegeHidesComponent(false);
    KeyValueDropDownChoice<Integer, String> custStatus =
        new KeyValueDropDownChoice<Integer, String>(
            "customer.active", mobBasePage.getCustomerStatus());
    custStatus.add(
        new SimpleAttributeModifier(
            "onchange",
            "confirmDeactivation('"
                + getLocalizer().getString("customer.deactivate.warning", mobBasePage)
                + "')"));
    form.add(custStatus.setNullValid(false).setRequired(true).add(cancelReasonBehavior));

    WebMarkupContainer blackListReasonDiv = new WebMarkupContainer("blackListReasonDiv");
    PrivilegedBehavior blackListBehavior =
        new PrivilegedBehavior(mobBasePage, Constants.PRIV_CUST_BLACKLIST);
    blackListBehavior.setMissingPrivilegeHidesComponent(false);
    blackListReasonDiv.add(
        new LocalizableLookupDropDownChoice<Integer>(
                "customer.blackListReason",
                Integer.class,
                "blackListReasons",
                this,
                Boolean.FALSE,
                true)
            .setNullValid(false)
            .setRequired(true)
            .add(blackListBehavior));

    form.add(blackListReasonDiv);

    WebMarkupContainer cancelDivContainer = new WebMarkupContainer("cancelDivContainer");
    LocalizableLookupDropDownChoice<Integer> cancelationreason =
        new LocalizableLookupDropDownChoice<Integer>(
            "customer.cancelationReason", Integer.class, "cancellationReasons", this, false, true);
    cancelationreason.add(
        new SimpleAttributeModifier(
            "onchange",
            "confirmCancellation('"
                + getLocalizer().getString("customer.cancel.warning", mobBasePage)
                + "')"));
    cancelDivContainer.add(
        cancelationreason.setNullValid(false).setRequired(true).add(cancelReasonBehavior));
    // cancelDivContainer
    // .setVisible(getCustomer().getCustomerTypeId() ==
    // Constants.CONSUMER_IDTYPE
    // || getCustomer().getCustomerTypeId() ==
    // Constants.CUSTOMER_ROLE_MONEY_MERCHANT);
    form.add(cancelDivContainer);
    Button changenMsisdnButton =
        new Button("changeMsisdn") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            Customer customer =
                mobBasePage.getCustomerByIdentification(
                    Constants.IDENT_TYPE_CUST_ID, String.valueOf(getCustomer().getId()));
            if (customer.getCancellationReasonId() != 0 || !customer.isActive()) {
              error(
                  getLocalizer()
                      .getString("customer.msisdn.change.error.customerinactive", mobBasePage));
              return;
            }
            mobBasePage.getMobiliserWebSession().setCustomerOtp(null);
            mobBasePage.getMobiliserWebSession().setCustomerOtpCount(0);
            mobBasePage.getMobiliserWebSession().setCustomerOtpLimitHit(false);
            setResponsePage(new ChangeMsisdnPage(getCustomer()));
          };
        }.setDefaultFormProcessing(false);
    changenMsisdnButton.setVisible(!mobBasePage.getConfiguration().isMsisdnOtpConfirmed());
    changenMsisdnButton.add(new PrivilegedBehavior(mobBasePage, Constants.PRIV_CUST_WRITE));

    form.add(changenMsisdnButton);
    changenMsisdnButton.setVisible(!mobBasePage.getConfiguration().isMsisdnOtpConfirmed());

    form.add(
        new Button("resetPin") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            Customer customer =
                mobBasePage.getCustomerByIdentification(
                    Constants.IDENT_TYPE_MSISDN, getCustomer().getMsisdn());
            if (!PortalUtils.exists(customer)) {
              error(getLocalizer().getString("customer.reset.password.noMsisdn", mobBasePage));
              return;
            }
            setResponsePage(new ResetCredentialPage(getCustomer(), this.getWebPage(), "pin"));
          };
        }.setDefaultFormProcessing(false)
            .add(new PrivilegedBehavior(mobBasePage, Constants.PRIV_CUST_PINCALL)));

    form.add(
        new Button("resetPassword") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            Address address = mobBasePage.getAddressByCustomer(getCustomer().getId());
            if (address == null || !PortalUtils.exists(address.getEmail())) {
              error(getLocalizer().getString("customer.reset.password.noEmail", mobBasePage));
              return;
            }
            setResponsePage(new ResetCredentialPage(getCustomer(), this.getWebPage(), "password"));
          };
        }.setDefaultFormProcessing(false)
            .add(new PrivilegedBehavior(mobBasePage, Constants.PRIV_CUST_PASSWORD)));

    form.add(
        new Button("update") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            if (updateCustomer()) {
              LOG.info(
                  "Data updated successfully for customer["
                      + mobBasePage.getMobiliserWebSession().getCustomer().getId()
                      + "]");
              getSession().info(getLocalizer().getString("data.update.successful", mobBasePage));
              setResponsePage(new StandingDataPage(getCustomer()));
            }
          };
        }.add(new PrivilegedBehavior(mobBasePage, Constants.PRIV_CUST_WRITE))
            .setVisible(!PortalUtils.exists(getCustomer().getTaskId())));

    form.add(
        new Button("approve") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            approveCustomer(true);
          };
        }.setDefaultFormProcessing(false)
            .setVisible(PortalUtils.exists(getCustomer().getTaskId())));

    form.add(
        new Button("reject") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            approveCustomer(false);
          };
        }.setDefaultFormProcessing(false)
            .setVisible(PortalUtils.exists(getCustomer().getTaskId())));

    if (PortalUtils.exists(getCustomer().getTaskId())) {
      Iterator iter = form.iterator();
      Component component;
      for (int i = 0; iter.hasNext(); i++) {
        component = (Component) iter.next();

        if (component.getId().equals("approve")
            || component.getId().equals("reject")
            || component instanceof FeedbackPanel) {
          continue;
        } else if (component instanceof Button) {
          component.setVisible(false);
        } else {

          if (component.getId().equals("blackListReasonDiv")
              || component.getId().equals("cancelDivContainer")) {
            Iterator iter1 = ((WebMarkupContainer) component).iterator();
            Component comp;
            for (int j = 0; iter1.hasNext(); j++) {
              comp = (Component) iter1.next();
              comp.setEnabled(false);
              comp.add(new SimpleAttributeModifier("readonly", "readonly"));
              comp.add(new SimpleAttributeModifier("style", "background-color: #E6E6E6;"));
            }

          } else {
            component.setEnabled(false);
            component.add(new SimpleAttributeModifier("readonly", "readonly"));
            component.add(new SimpleAttributeModifier("style", "background-color: #E6E6E6;"));
          }
        }
      }
    }

    add(form);

    LOG.debug(
        "PatternDateConverter format: "
            + Constants.DATE_FORMAT_PATTERN_PARSE
            + " DatePicker format: "
            + Constants.DATE_FORMAT_PATTERN_PICKER);
  }
  protected void setupPage(final UserModel userModel) {
    if (isCreate) {
      super.setupPage(getString("gb.newUser"), "");
    } else {
      super.setupPage(getString("gb.edit"), userModel.username);
    }

    final Model<String> confirmPassword =
        new Model<String>(StringUtils.isEmpty(userModel.password) ? "" : userModel.password);
    CompoundPropertyModel<UserModel> model = new CompoundPropertyModel<UserModel>(userModel);

    // build list of projects including all repositories wildcards
    List<String> repos = getAccessRestrictedRepositoryList(true, userModel);

    List<String> userTeams = new ArrayList<String>();
    for (TeamModel team : userModel.getTeams()) {
      userTeams.add(team.name);
    }
    Collections.sort(userTeams);

    final String oldName = userModel.username;
    final List<RegistrantAccessPermission> permissions =
        app().repositories().getUserAccessPermissions(userModel);

    final Palette<String> teams =
        new Palette<String>(
            "teams",
            new ListModel<String>(new ArrayList<String>(userTeams)),
            new CollectionModel<String>(app().users().getAllTeamNames()),
            new StringChoiceRenderer(),
            10,
            false);
    Form<UserModel> form =
        new Form<UserModel>("editForm", model) {

          private static final long serialVersionUID = 1L;

          /*
           * (non-Javadoc)
           *
           * @see org.apache.wicket.markup.html.form.Form#onSubmit()
           */
          @Override
          protected void onSubmit() {
            if (StringUtils.isEmpty(userModel.username)) {
              error(getString("gb.pleaseSetUsername"));
              return;
            }
            // force username to lower-case
            userModel.username = userModel.username.toLowerCase();
            String username = userModel.username;
            if (isCreate) {
              UserModel model = app().users().getUserModel(username);
              if (model != null) {
                error(MessageFormat.format(getString("gb.usernameUnavailable"), username));
                return;
              }
            }
            boolean rename = !StringUtils.isEmpty(oldName) && !oldName.equalsIgnoreCase(username);
            if (app().authentication().supportsCredentialChanges(userModel)) {
              if (!userModel.password.equals(confirmPassword.getObject())) {
                error(getString("gb.passwordsDoNotMatch"));
                return;
              }
              String password = userModel.password;
              if (!password.toUpperCase().startsWith(StringUtils.MD5_TYPE)
                  && !password.toUpperCase().startsWith(StringUtils.COMBINED_MD5_TYPE)) {
                // This is a plain text password.
                // Check length.
                int minLength = app().settings().getInteger(Keys.realm.minPasswordLength, 5);
                if (minLength < 4) {
                  minLength = 4;
                }
                if (password.trim().length() < minLength) {
                  error(MessageFormat.format(getString("gb.passwordTooShort"), minLength));
                  return;
                }

                // change the cookie
                userModel.cookie = StringUtils.getSHA1(userModel.username + password);

                // Optionally store the password MD5 digest.
                String type = app().settings().getString(Keys.realm.passwordStorage, "md5");
                if (type.equalsIgnoreCase("md5")) {
                  // store MD5 digest of password
                  userModel.password =
                      StringUtils.MD5_TYPE + StringUtils.getMD5(userModel.password);
                } else if (type.equalsIgnoreCase("combined-md5")) {
                  // store MD5 digest of username+password
                  userModel.password =
                      StringUtils.COMBINED_MD5_TYPE
                          + StringUtils.getMD5(username + userModel.password);
                }
              } else if (rename
                  && password.toUpperCase().startsWith(StringUtils.COMBINED_MD5_TYPE)) {
                error(getString("gb.combinedMd5Rename"));
                return;
              }
            }

            // update user permissions
            for (RegistrantAccessPermission repositoryPermission : permissions) {
              if (repositoryPermission.mutable) {
                userModel.setRepositoryPermission(
                    repositoryPermission.registrant, repositoryPermission.permission);
              }
            }

            Iterator<String> selectedTeams = teams.getSelectedChoices();
            userModel.removeAllTeams();
            while (selectedTeams.hasNext()) {
              TeamModel team = app().users().getTeamModel(selectedTeams.next());
              if (team == null) {
                continue;
              }
              userModel.addTeam(team);
            }

            try {
              if (isCreate) {
                app().gitblit().addUser(userModel);
              } else {
                app().gitblit().reviseUser(oldName, userModel);
              }
            } catch (GitBlitException e) {
              error(e.getMessage());
              return;
            }
            setRedirect(false);
            if (isCreate) {
              // create another user
              info(MessageFormat.format(getString("gb.userCreated"), userModel.username));
              setResponsePage(EditUserPage.class);
            } else {
              // back to users page
              setResponsePage(UsersPage.class);
            }
          }
        };

    // do not let the browser pre-populate these fields
    form.add(new SimpleAttributeModifier("autocomplete", "off"));

    // not all user providers support manipulating username and password
    boolean editCredentials = app().authentication().supportsCredentialChanges(userModel);

    // not all user providers support manipulating display name
    boolean editDisplayName = app().authentication().supportsDisplayNameChanges(userModel);

    // not all user providers support manipulating email address
    boolean editEmailAddress = app().authentication().supportsEmailAddressChanges(userModel);

    // not all user providers support manipulating team memberships
    boolean editTeams = app().authentication().supportsTeamMembershipChanges(userModel);

    // not all user providers support manipulating the admin role
    boolean changeAdminRole = app().authentication().supportsRoleChanges(userModel, Role.ADMIN);

    // not all user providers support manipulating the create role
    boolean changeCreateRole = app().authentication().supportsRoleChanges(userModel, Role.CREATE);

    // not all user providers support manipulating the fork role
    boolean changeForkRole = app().authentication().supportsRoleChanges(userModel, Role.FORK);

    // field names reflective match UserModel fields
    form.add(new TextField<String>("username").setEnabled(editCredentials));
    NonTrimmedPasswordTextField passwordField = new NonTrimmedPasswordTextField("password");
    passwordField.setResetPassword(false);
    form.add(passwordField.setEnabled(editCredentials));
    NonTrimmedPasswordTextField confirmPasswordField =
        new NonTrimmedPasswordTextField("confirmPassword", confirmPassword);
    confirmPasswordField.setResetPassword(false);
    form.add(confirmPasswordField.setEnabled(editCredentials));
    form.add(new TextField<String>("displayName").setEnabled(editDisplayName));
    form.add(new TextField<String>("emailAddress").setEnabled(editEmailAddress));

    if (userModel.canAdmin() && !userModel.canAdmin) {
      // user inherits Admin permission
      // display a disabled-yet-checked checkbox
      form.add(new CheckBox("canAdmin", Model.of(true)).setEnabled(false));
    } else {
      form.add(new CheckBox("canAdmin").setEnabled(changeAdminRole));
    }

    if (userModel.canFork() && !userModel.canFork) {
      // user inherits Fork permission
      // display a disabled-yet-checked checkbox
      form.add(new CheckBox("canFork", Model.of(true)).setEnabled(false));
    } else {
      final boolean forkingAllowed = app().settings().getBoolean(Keys.web.allowForking, true);
      form.add(new CheckBox("canFork").setEnabled(forkingAllowed && changeForkRole));
    }

    if (userModel.canCreate() && !userModel.canCreate) {
      // user inherits Create permission
      // display a disabled-yet-checked checkbox
      form.add(new CheckBox("canCreate", Model.of(true)).setEnabled(false));
    } else {
      form.add(new CheckBox("canCreate").setEnabled(changeCreateRole));
    }

    form.add(new CheckBox("excludeFromFederation"));
    form.add(new CheckBox("disabled"));

    form.add(
        new RegistrantPermissionsPanel(
            "repositories", RegistrantType.REPOSITORY, repos, permissions, getAccessPermissions()));
    form.add(teams.setEnabled(editTeams));

    form.add(new TextField<String>("organizationalUnit").setEnabled(editDisplayName));
    form.add(new TextField<String>("organization").setEnabled(editDisplayName));
    form.add(new TextField<String>("locality").setEnabled(editDisplayName));
    form.add(new TextField<String>("stateProvince").setEnabled(editDisplayName));
    form.add(new TextField<String>("countryCode").setEnabled(editDisplayName));
    form.add(new Button("save"));
    Button cancel =
        new Button("cancel") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(UsersPage.class);
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    add(form);
  }
Beispiel #17
0
  @SuppressWarnings({"rawtypes", "unchecked"})
  public DigitalRecSheetPage(
      Recommendation recommendation, final MobileSalesWorkspacePage mswPage) {
    final DailyRhythmPortalSession drpSession = getDailyRhythmPortalSession();

    if (recommendation == null) {
      recommendation = new Recommendation(); // check for null!
    }
    model = new DigitalRecSheetModel(recommendation);

    final boolean transferToBeast = recommendation.isTransferFlag();

    form.add(
        new Image(
            "transfer-to-beast", new ContextRelativeResource("/css/img/transfer-to-beast.png")) {

          private static final long serialVersionUID = 1L;

          @Override
          public boolean isVisible() {
            return transferToBeast;
          }
        });

    formChanged = false;

    FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");
    feedbackPanel.setOutputMarkupPlaceholderTag(true);
    add(feedbackPanel);

    DrpUser user = drpSession.getDrpUser();

    model.setUser(user);

    // Tools Menu components:
    final ModalWindow coverageCheckModal = new ModalWindow("coverageCheckModal");

    // tools menu links:
    form.add(new BookmarkablePageLink("toolsLink1", CustomerDashboardPage.class));

    AjaxLink alink =
        new AjaxLink("toolsLink2") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onClick(AjaxRequestTarget target) {

            coverageCheckModal.setContent(
                new CoverageCheckPanel(coverageCheckModal.getContentId(), coverageCheckModal));
            coverageCheckModal.show(target);
          }
        };
    add(coverageCheckModal);
    form.add(alink);

    // no-contract coverage maps link.
    AjaxLink ppcmLink =
        new AjaxLink("toolsLink3") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onClick(AjaxRequestTarget target) {
            coverageCheckModal.setContent(
                new NoContractCoveragePanel(coverageCheckModal.getContentId(), coverageCheckModal));
            coverageCheckModal.show(target);
          }
        };
    form.add(ppcmLink);

    Map<LengthProperty, Integer> fieldLengths = this.getLengthProperties();

    final ModalWindow printOrEmailModal = new ModalWindow("printOrEmailModal");
    printOrEmailModal.setHeightUnit("px");
    printOrEmailModal.setInitialHeight(Util.getInt(getString("printOrEmailPopup.height"), 220));
    printOrEmailModal.setWidthUnit("px");
    printOrEmailModal.setInitialWidth(Util.getInt(getString("printOrEmailPopup.width"), 440));
    printOrEmailModal.setResizable(false);
    printOrEmailModal.setWindowClosedCallback(
        new WindowClosedCallback() {

          private static final long serialVersionUID = 1L;

          @Override
          public void onClose(AjaxRequestTarget target) {
            target.add(form);
          }
        });

    /**
     * Launches dialog to perform either a print or email of the current recommendation worksheet
     */
    final AjaxButton printOrEmail =
        new AjaxButton("printOrEmailBtn") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit(AjaxRequestTarget target, Form<?> form) {
            logger.debug("in print or email handler");
            saveRecSheet();
            printOrEmailModal.show(target);
          }

          @Override
          protected void onError(AjaxRequestTarget target, Form<?> form) {
            // TODO Implement me!
          }
        };
    form.add(printOrEmail);
    printOrEmail.setOutputMarkupPlaceholderTag(true);

    // print or email modal dialog
    add(printOrEmailModal);
    printOrEmailModal.setPageCreator(
        new ModalWindow.PageCreator() {

          private static final long serialVersionUID = 1L;

          public Page createPage() {
            return new PrintOrEmailDialog(model.getObject());
          }
        });

    printOrEmailModal.setCloseButtonCallback(
        new ModalWindow.CloseButtonCallback() {

          public boolean onCloseButtonClicked(AjaxRequestTarget target) {
            target.prependJavaScript("doLoad();");
            return true;
          }
        });

    /** Saves the rec sheet */
    final Button saveButton =
        new Button("saveBtn") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            logger.debug("saving recsheet by button request");
            saveRecSheet();
          }
        };

    // save rec sheet button
    form.add(saveButton);
    saveButton.setOutputMarkupPlaceholderTag(true);

    // === Clear screen prompt and components ===
    final ModalWindow clearModal = new ModalWindow("clearModal");
    final AjaxButton clearButton =
        new AjaxButton("clearButton") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit(AjaxRequestTarget target, Form<?> form) {

            String message =
                "Clear customer data?\n\nThis will apply to both the Dashboard and the Recommendation Sheet.";

            final YesNoPanel clearPanel =
                new YesNoPanel(clearModal.getContentId(), message, clearModal);
            // changing button text.
            clearPanel.setYesButtonText("Clear");
            clearPanel.setNoButtonText("Back");

            clearModal.setContent(clearPanel);

            clearModal.setWindowClosedCallback(
                new ModalWindow.WindowClosedCallback() {

                  private static final long serialVersionUID = 1L;

                  @Override
                  public void onClose(AjaxRequestTarget target) {
                    if (clearPanel.getDialogResult()) {
                      logger.debug("clearing customer from recsheet.");
                      DailyRhythmPortalSession session = getDailyRhythmPortalSession();
                      session.clearBestBuyCustomer();
                      session.clearSearchCustomer();
                      session.clearCarrierCustomer();
                      Recommendation rec = new Recommendation();
                      rec.setCreatedOn(new Date());
                      rec.setCreatedBy(session.getDrpUser().getUserId());
                      rec.setTransferFlag(false);
                      DigitalRecSheetPage drsPage = new DigitalRecSheetPage(rec, mswPage);
                      setResponsePage(drsPage);
                    }
                  }
                });

            clearModal.show(target);
          }

          @Override
          protected void onError(AjaxRequestTarget target, Form<?> form) {
            // TODO Implement me!
          }
        };

    clearButton.setDefaultFormProcessing(false);
    form.add(clearButton);
    add(clearModal);
    // === END of Clear Components ===

    /*
     * Search Rec Sheet button Navigates back to rec sheet search page
     */

    // close button exit point with popup.
    final ModalWindow exitWithoutSavingModal = new ModalWindow("exitWithoutSavingModal");
    String message = "Are you sure you want to exit without saving your changes?";

    final YesNoPanel exitPanel =
        new YesNoPanel(exitWithoutSavingModal.getContentId(), message, exitWithoutSavingModal);
    exitWithoutSavingModal.setContent(exitPanel);

    exitWithoutSavingModal.setWindowClosedCallback(
        new ModalWindow.WindowClosedCallback() {

          private static final long serialVersionUID = 1L;

          @Override
          public void onClose(AjaxRequestTarget target) {
            if (exitPanel.getDialogResult()) {
              setResponsePage(mswPage);
            }
          }
        });
    add(exitWithoutSavingModal);

    /*
     * ===== Search Rec Sheet Button ===== Search Rec Sheet button Navigates
     * back to rec sheet search page
     */
    final AjaxButton searchButton =
        new AjaxButton("searchBtn") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit(AjaxRequestTarget target, Form<?> form) {

            logger.debug("closing recSheet by return to search button request.");
            PageParameters parameters = mswPage.getPageParameters();
            setResponsePage(new MobileSalesWorkspacePage(parameters));
          }

          @Override
          protected void onError(AjaxRequestTarget target, Form<?> form) {
            // TODO Implement me!
          }
        };

    // this is a pure navigation button so we do not want form validation to
    // occur
    searchButton.setDefaultFormProcessing(false);
    closeForm.add(searchButton);

    /*
     * ===== Close Rec Sheet Button ===== Close Rec Sheet button Navigates
     * back to rec sheet search page
     */
    final AjaxButton closeButton =
        new AjaxButton("closeBtn") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit(AjaxRequestTarget target, Form<?> form) {
            logger.debug("closing recSheet by close button request.");
            if (drpSession.getCustomer() == null) {
              setResponsePage(CustomerDashboardSearchPage.class);
            } else {
              setResponsePage(CustomerDashboardPage.class);
            }
          }

          @Override
          protected void onError(AjaxRequestTarget target, Form<?> form) {
            // TODO Implement me!
          }
        };

    closeButton.setDefaultFormProcessing(false);
    closeForm.add(closeButton);
    form.add(closeForm);

    closeButton.setOutputMarkupPlaceholderTag(true);

    // if recommendation comes in blank, the model creates a new one...
    // Therefore we shouldn't mess with it until we retrieve it from the
    // model.
    Recommendation r = model.getRecommendation();
    String phoneNum = user.getLocationPhoneNum() == null ? "" : user.getLocationPhoneNum();
    if (r.getId() == 0) { // new rec sheet
      r.setSpecialistContactInfo(user.getFirstName() + " " + phoneNum);
      r.setEmpCrtFrstNm(user.getFirstName());
      r.setEmpCrtLastNm(user.getLastName());
    } else {
      r.setEmpAltFrstNm(user.getFirstName());
      r.setEmpAltLastNm(user.getLastName());
    }
    Essentials e = r.getEssentials();

    // first name
    TextField fldFirstname =
        new RequiredTextField("firstName", new PropertyModel<String>(r, "firstName"));
    fldFirstname.add(
        new StringValidator.LengthBetweenValidator(
            fieldLengths.get(LengthProperty.FLD_FIRSTNAME_MINLENGTH),
            fieldLengths.get(LengthProperty.FLD_FIRSTNAME_LENGTH)));
    form.add(fldFirstname);

    // last name
    RequiredTextField fldLastname =
        new RequiredTextField("lastName", new PropertyModel<String>(r, "lastName"));
    fldLastname.add(
        new StringValidator.LengthBetweenValidator(
            fieldLengths.get(LengthProperty.FLD_LASTNAME_MINLENGTH),
            fieldLengths.get(LengthProperty.FLD_LASTNAME_LENGTH)));
    form.add(fldLastname);

    // mobile number
    final TextField mobile =
        new RequiredTextField("mobileNum", new PropertyModel<PhoneNumber>(this, "phoneNumber")) {

          private static final long serialVersionUID = 1L;

          @Override
          public <C> IConverter<C> getConverter(Class<C> type) {
            return new PhoneNumberConverter();
          }
        };
    mobile.add(
        new AjaxFormComponentUpdatingBehavior("onBlur") {

          private static final long serialVersionUID = 1L;

          @Override
          protected void onUpdate(AjaxRequestTarget target) {
            target.add(mobile);
          }
        });
    mobile.setMarkupId("mobileNum");
    form.add(mobile);

    form.add(
        new TextField("contacttime", new PropertyModel<String>(r, "bestTimeToContact"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_CONTACTTIME_LENGTH))));

    TextField tradeInValue =
        new TextField("tradeInValue", new PropertyModel<String>(r, "tradeInValue")) {

          private static final long serialVersionUID = 1L;

          @Override
          public <C> IConverter<C> getConverter(Class<C> type) {
            return new MoneyConverter();
          }
        };

    tradeInValue.add(new MinimumValidator<BigDecimal>(new BigDecimal(0)));
    form.add(tradeInValue);

    form.add(new CheckBox("upgradetext", new PropertyModel<Boolean>(r, "upgradeReminderText")));
    form.add(new CheckBox("upgradecall", new PropertyModel<Boolean>(r, "upgradeReminderCall")));

    // upgrade date
    DateTextField udate =
        new DateTextField(
            "upgradedate", new PropertyModel<Date>(r, "upgradeEligibilityDate"), "EEEE MM/dd/yy");
    DatePicker dp = new DatePicker();
    udate.add(dp);
    form.add(udate);

    // customer - plan features device. On left side of form, not to be
    // confused with recommended plan/features/device.
    form.add(
        new TextArea("planFeaturesDevice", new PropertyModel<String>(r, "subscriptionInfo"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_PLANFEATURESDEVICE_LENGTH))));
    form.add(
        new TextArea("internetuse", new PropertyModel<String>(r, "netUseInfo"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_INTERNETUSE_LENGTH))));

    form.add(
        new TextArea("rec_connectivity", new PropertyModel<String>(r, "recommendedSubscription"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_REC_CONNECTIVITY_LENGTH))));
    form.add(
        new TextArea("rec_phonedevice", new PropertyModel<String>(r, "recommendedDevice"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_REC_PHONEDEVICE_LENGTH))));
    form.add(
        new TextField("e_bluetooth", new PropertyModel<String>(e, "handsfree"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_ESSENTIAL_LENGTH))));
    form.add(
        new TextField("e_memory", new PropertyModel<String>(e, "memory"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_ESSENTIAL_LENGTH))));
    form.add(
        new TextField("e_accessories", new PropertyModel<String>(e, "accessories"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_ESSENTIAL_LENGTH))));
    form.add(
        new TextField("e_shields", new PropertyModel<String>(e, "shields"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_ESSENTIAL_LENGTH))));
    form.add(
        new TextField("e_chargers", new PropertyModel<String>(e, "chargers"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_ESSENTIAL_LENGTH))));
    form.add(
        new TextField("e_gsbtp", new PropertyModel<String>(e, "gsbtp"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_ESSENTIAL_LENGTH))));
    form.add(
        new TextField("e_buyback", new PropertyModel<String>(e, "buyback"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_ESSENTIAL_LENGTH))));
    form.add(
        new TextField("e_financing", new PropertyModel<String>(e, "financing"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_ESSENTIAL_LENGTH))));

    form.add(
        new TextArea("notes", new PropertyModel<String>(r, "notes"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_NOTES_LENGTH))));
    form.add(
        new TextArea("contactinfo", new PropertyModel<String>(r, "specialistContactInfo"))
            .add(
                new StringValidator.MaximumLengthValidator(
                    fieldLengths.get(LengthProperty.FLD_CONTACTINFO_LENGTH))));

    form.add(
        new CheckBox(
            "md_internet",
            new CheckboxModel(
                r, "deviceCapabilities", Recommendation.DeviceCapabilities.INTERNET.name())));
    form.add(
        new CheckBox(
            "md_email",
            new CheckboxModel(
                r, "deviceCapabilities", Recommendation.DeviceCapabilities.EMAIL.name())));
    form.add(
        new CheckBox(
            "md_music",
            new CheckboxModel(
                r, "deviceCapabilities", Recommendation.DeviceCapabilities.MUSIC.name())));
    form.add(
        new CheckBox(
            "md_video",
            new CheckboxModel(
                r, "deviceCapabilities", Recommendation.DeviceCapabilities.VIDEO.name())));
    form.add(
        new CheckBox(
            "md_photo",
            new CheckboxModel(
                r, "deviceCapabilities", Recommendation.DeviceCapabilities.PHOTO.name())));
    form.add(
        new CheckBox(
            "md_tv",
            new CheckboxModel(
                r, "deviceCapabilities", Recommendation.DeviceCapabilities.TV.name())));
    form.add(
        new CheckBox(
            "md_games",
            new CheckboxModel(
                r, "deviceCapabilities", Recommendation.DeviceCapabilities.GAMING.name())));
    form.add(
        new CheckBox(
            "md_texting",
            new CheckboxModel(
                r, "deviceCapabilities", Recommendation.DeviceCapabilities.TEXTING.name())));
    form.add(
        new CheckBox(
            "md_unlocked",
            new CheckboxModel(
                r, "deviceCapabilities", Recommendation.DeviceCapabilities.UNLOCKED.name())));
    form.add(
        new CheckBox(
            "md_nav",
            new CheckboxModel(
                r, "deviceCapabilities", Recommendation.DeviceCapabilities.NAVIGATION.name())));

    form.add(
        new CheckBox(
            "wow_data",
            new CheckboxModel(
                r, "wowRequirements", Recommendation.WowRequirements.DATATRANSFER.name())));
    form.add(
        new CheckBox(
            "wow_email",
            new CheckboxModel(
                r, "wowRequirements", Recommendation.WowRequirements.PERSONALEMAIL.name())));
    form.add(
        new CheckBox(
            "wow_bluetooth",
            new CheckboxModel(
                r, "wowRequirements", Recommendation.WowRequirements.BLUETOOTHPAIRING.name())));
    form.add(
        new CheckBox(
            "wow_apps",
            new CheckboxModel(
                r, "wowRequirements", Recommendation.WowRequirements.APPLICATIONS.name())));
    form.add(
        new CheckBox(
            "wow_sw",
            new CheckboxModel(
                r, "wowRequirements", Recommendation.WowRequirements.SOFTWARE.name())));
    form.add(
        new CheckBox(
            "wow_social",
            new CheckboxModel(
                r, "wowRequirements", Recommendation.WowRequirements.SOCIALNETWORKING.name())));
    form.add(
        new CheckBox(
            "wow_power",
            new CheckboxModel(
                r, "wowRequirements", Recommendation.WowRequirements.POWERMANAGEMENT.name())));
    form.add(
        new CheckBox(
            "wow_voicemail",
            new CheckboxModel(
                r, "wowRequirements", Recommendation.WowRequirements.VOICEMAIL.name())));
    form.add(
        new CheckBox(
            "wow_other",
            new CheckboxModel(r, "wowRequirements", Recommendation.WowRequirements.OTHER.name())));

    HiddenField formChanged =
        new HiddenField<Boolean>("formChanged", new PropertyModel<Boolean>(this, "formChanged"));
    closeForm.add(formChanged);

    add(form);
    form.add(closeForm);

    SessionTimeoutPanel sessionTimeoutPanel = new SessionTimeoutPanel("sessionTimeoutPanel");
    add(sessionTimeoutPanel);
    sessionTimeoutPanel.setOutputMarkupPlaceholderTag(true);
  }
Beispiel #18
0
  protected void setupPage(final TeamModel teamModel) {
    if (isCreate) {
      super.setupPage(getString("gb.newTeam"), "");
    } else {
      super.setupPage(getString("gb.edit"), teamModel.name);
    }

    CompoundPropertyModel<TeamModel> model = new CompoundPropertyModel<TeamModel>(teamModel);

    List<String> repos = getAccessRestrictedRepositoryList(true, null);

    List<String> teamUsers = new ArrayList<String>(teamModel.users);
    List<String> preReceiveScripts = new ArrayList<String>();
    List<String> postReceiveScripts = new ArrayList<String>();

    final String oldName = teamModel.name;
    final List<RegistrantAccessPermission> permissions = teamModel.getRepositoryPermissions();

    // users palette
    final Palette<UserChoice> users =
        new Palette<UserChoice>(
            "users",
            new ListModel<UserChoice>(getTeamUsers(teamUsers)),
            new CollectionModel<UserChoice>(
                sortByDisplayName(getTeamUsers(app().users().getAllUsernames()))),
            new ChoiceRenderer<UserChoice>(null, "userId"),
            10,
            false);

    // pre-receive palette
    if (teamModel.preReceiveScripts != null) {
      preReceiveScripts.addAll(teamModel.preReceiveScripts);
    }
    final Palette<String> preReceivePalette =
        new Palette<String>(
            "preReceiveScripts",
            new ListModel<String>(preReceiveScripts),
            new CollectionModel<String>(app().repositories().getPreReceiveScriptsUnused(null)),
            new StringChoiceRenderer(),
            12,
            true);

    // post-receive palette
    if (teamModel.postReceiveScripts != null) {
      postReceiveScripts.addAll(teamModel.postReceiveScripts);
    }
    final Palette<String> postReceivePalette =
        new Palette<String>(
            "postReceiveScripts",
            new ListModel<String>(postReceiveScripts),
            new CollectionModel<String>(app().repositories().getPostReceiveScriptsUnused(null)),
            new StringChoiceRenderer(),
            12,
            true);

    Form<TeamModel> form =
        new Form<TeamModel>("editForm", model) {

          private static final long serialVersionUID = 1L;

          /*
           * (non-Javadoc)
           *
           * @see org.apache.wicket.markup.html.form.Form#onSubmit()
           */
          @Override
          protected void onSubmit() {
            String teamname = teamModel.name;
            if (StringUtils.isEmpty(teamname)) {
              error(getString("gb.pleaseSetTeamName"));
              return;
            }
            if (isCreate) {
              TeamModel model = app().users().getTeamModel(teamname);
              if (model != null) {
                error(MessageFormat.format(getString("gb.teamNameUnavailable"), teamname));
                return;
              }
            }
            // update team permissions
            for (RegistrantAccessPermission repositoryPermission : permissions) {
              teamModel.setRepositoryPermission(
                  repositoryPermission.registrant, repositoryPermission.permission);
            }

            Iterator<UserChoice> selectedUsers = users.getSelectedChoices();
            List<String> members = new ArrayList<String>();
            while (selectedUsers.hasNext()) {
              members.add(selectedUsers.next().getUserId().toLowerCase());
            }
            teamModel.users.clear();
            teamModel.users.addAll(members);

            // set mailing lists
            String ml = mailingLists.getObject();
            if (!StringUtils.isEmpty(ml)) {
              Set<String> list = new HashSet<String>();
              for (String address : ml.split("(,|\\s)")) {
                if (StringUtils.isEmpty(address)) {
                  continue;
                }
                list.add(address.toLowerCase());
              }
              teamModel.mailingLists.clear();
              teamModel.mailingLists.addAll(list);
            }

            // pre-receive scripts
            List<String> preReceiveScripts = new ArrayList<String>();
            Iterator<String> pres = preReceivePalette.getSelectedChoices();
            while (pres.hasNext()) {
              preReceiveScripts.add(pres.next());
            }
            teamModel.preReceiveScripts.clear();
            teamModel.preReceiveScripts.addAll(preReceiveScripts);

            // post-receive scripts
            List<String> postReceiveScripts = new ArrayList<String>();
            Iterator<String> post = postReceivePalette.getSelectedChoices();
            while (post.hasNext()) {
              postReceiveScripts.add(post.next());
            }
            teamModel.postReceiveScripts.clear();
            teamModel.postReceiveScripts.addAll(postReceiveScripts);

            try {
              if (isCreate) {
                app().gitblit().addTeam(teamModel);
              } else {
                app().gitblit().reviseTeam(oldName, teamModel);
              }
            } catch (GitBlitException e) {
              error(e.getMessage());
              return;
            }
            setRedirect(false);
            if (isCreate) {
              // create another team
              info(MessageFormat.format(getString("gb.teamCreated"), teamModel.name));
            }
            // back to users page
            setResponsePage(UsersPage.class);
          }
        };

    // do not let the browser pre-populate these fields
    form.add(new SimpleAttributeModifier("autocomplete", "off"));

    // not all user services support manipulating team memberships
    boolean editMemberships = app().authentication().supportsTeamMembershipChanges(teamModel);

    // field names reflective match TeamModel fields
    form.add(new TextField<String>("name"));
    form.add(new CheckBox("canAdmin"));
    form.add(
        new CheckBox("canFork")
            .setEnabled(app().settings().getBoolean(Keys.web.allowForking, true)));
    form.add(new CheckBox("canCreate"));
    form.add(users.setEnabled(editMemberships));
    mailingLists =
        new Model<String>(
            teamModel.mailingLists == null
                ? ""
                : StringUtils.flattenStrings(teamModel.mailingLists, " "));
    form.add(new TextField<String>("mailingLists", mailingLists));

    form.add(
        new RegistrantPermissionsPanel(
            "repositories", RegistrantType.REPOSITORY, repos, permissions, getAccessPermissions()));
    form.add(preReceivePalette);
    form.add(
        new BulletListPanel(
            "inheritedPreReceive",
            "inherited",
            app().repositories().getPreReceiveScriptsInherited(null)));
    form.add(postReceivePalette);
    form.add(
        new BulletListPanel(
            "inheritedPostReceive",
            "inherited",
            app().repositories().getPostReceiveScriptsInherited(null)));

    form.add(new Button("save"));
    Button cancel =
        new Button("cancel") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(UsersPage.class);
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    add(form);
  }
  public SaveCancelFormPanel(String id, boolean ajax) {
    super(id);

    form = new Form("form");
    form.add(new SetFocusBehavior(form));
    feedbackPanel = new FeedbackPanel("feedback");
    feedbackPanel.setOutputMarkupId(true);
    titleLabel = new Label("title", getTitleModel());

    if (ajax) {
      submitButton =
          new AjaxButton("submitButton") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form form) {
              onSave(target);
              if (!Session.get()
                  .getFeedbackMessages()
                  .hasMessage(new ErrorLevelFeedbackMessageFilter(FeedbackMessage.ERROR))) {
                defaultReturnAction(target);
              }
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form form) {
              target.addComponent(feedbackPanel);
            }
          };
      cancelButton =
          new AjaxButton("cancelButton") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form form) {
              onCancel(target);
              defaultReturnAction(target);
            }
          };
    } else {
      submitButton =
          new Button("submitButton") {
            @Override
            public void onSubmit() {
              onSave(null);
              if (!Session.get()
                  .getFeedbackMessages()
                  .hasMessage(new ErrorLevelFeedbackMessageFilter(FeedbackMessage.ERROR))) {
                defaultReturnAction();
              }
            }
          };
      cancelButton =
          new Button("cancelButton") {
            @Override
            public void onSubmit() {
              onCancel(null);
              defaultReturnAction();
            }
          };
    }
    cancelButton.setDefaultFormProcessing(false);

    add(form);
    form.add(feedbackPanel);
    form.add(titleLabel);
    form.add(submitButton);
    form.add(cancelButton);
  }
Beispiel #20
0
  @Override
  public void onInitialize() {
    super.onInitialize();

    // get settings data
    final GradebookInformation settings = this.businessService.getGradebookSettings();

    // setup page model
    final GbSettings gbSettings = new GbSettings(settings);
    final CompoundPropertyModel<GbSettings> formModel =
        new CompoundPropertyModel<GbSettings>(gbSettings);

    final SettingsGradeEntryPanel gradeEntryPanel =
        new SettingsGradeEntryPanel("gradeEntryPanel", formModel, gradeEntryExpanded);
    final SettingsGradeReleasePanel gradeReleasePanel =
        new SettingsGradeReleasePanel("gradeReleasePanel", formModel, gradeReleaseExpanded);
    final SettingsCategoryPanel categoryPanel =
        new SettingsCategoryPanel("categoryPanel", formModel, categoryExpanded);
    final SettingsGradingSchemaPanel gradingSchemaPanel =
        new SettingsGradingSchemaPanel("gradingSchemaPanel", formModel, gradingSchemaExpanded);

    // form
    final Form<GbSettings> form =
        new Form<GbSettings>("form", formModel) {
          private static final long serialVersionUID = 1L;

          @Override
          public void onValidate() {
            super.onValidate();

            final GbSettings model = getModelObject();

            final List<CategoryDefinition> categories =
                model.getGradebookInformation().getCategories();

            // validate the categories
            if (model.getGradebookInformation().getCategoryType()
                == GbCategoryType.WEIGHTED_CATEGORY.getValue()) {

              BigDecimal totalWeight = BigDecimal.ZERO;
              for (final CategoryDefinition cat : categories) {

                if (cat.getWeight() == null) {
                  error(getString("settingspage.update.failure.categorymissingweight"));
                } else {
                  // extra credit items do not participate in the weightings, so exclude from the
                  // tally
                  if (!cat.isExtraCredit()) {
                    totalWeight = totalWeight.add(BigDecimal.valueOf(cat.getWeight()));
                  }
                }
              }

              if (totalWeight.compareTo(BigDecimal.ONE) != 0) {
                error(getString("settingspage.update.failure.categoryweighttotals"));
              }
            }

            // if categories and weighting selected AND if course grade display points was selected,
            // give error message
            if (model.getGradebookInformation().getCategoryType()
                    == GbCategoryType.WEIGHTED_CATEGORY.getValue()
                && model.getGradebookInformation().isCourseGradeDisplayed()
                && model.getGradebookInformation().isCoursePointsDisplayed()) {
              error(getString("settingspage.displaycoursegrade.incompatible"));
            }

            // validate the course grade display settings
            if (model.getGradebookInformation().isCourseGradeDisplayed()) {
              int displayOptions = 0;

              if (model.getGradebookInformation().isCourseLetterGradeDisplayed()) {
                displayOptions++;
              }

              if (model.getGradebookInformation().isCourseAverageDisplayed()) {
                displayOptions++;
              }

              if (model.getGradebookInformation().isCoursePointsDisplayed()) {
                displayOptions++;
              }

              if (displayOptions == 0) {
                error(getString("settingspage.displaycoursegrade.notenough"));
              }
            }
          }

          @Override
          public void onSubmit() {

            final GbSettings model = getModelObject();

            Page responsePage =
                new SettingsPage(
                    gradeEntryPanel.isExpanded(),
                    gradeReleasePanel.isExpanded(),
                    categoryPanel.isExpanded(),
                    gradingSchemaPanel.isExpanded());

            // update settings
            try {
              SettingsPage.this.businessService.updateGradebookSettings(
                  model.getGradebookInformation());
              getSession().info(getString("settingspage.update.success"));
            } catch (ConflictingCategoryNameException e) {
              getSession().error(getString("settingspage.update.failure.categorynameconflict"));
              responsePage = this.getPage();
            } catch (IllegalArgumentException e) {
              getSession().error(e.getMessage());
              responsePage = this.getPage();
            }

            setResponsePage(responsePage);
          }
        };

    // cancel button
    final Button cancel =
        new Button("cancel") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(new GradebookPage());
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    // panels
    form.add(gradeEntryPanel);
    form.add(gradeReleasePanel);
    form.add(categoryPanel);
    form.add(gradingSchemaPanel);

    add(form);

    // expand/collapse panel actions
    add(
        new AjaxLink<String>("expandAll") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onClick(final AjaxRequestTarget target) {
            target.appendJavaScript("$('#settingsAccordion .panel-collapse').collapse('show');");
          }
        });
    add(
        new AjaxLink<String>("collapseAll") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onClick(final AjaxRequestTarget target) {
            target.appendJavaScript("$('#settingsAccordion .panel-collapse').collapse('hide');");
          }
        });
  }
Beispiel #21
0
  protected void setupPage(RepositoryModel model) {
    this.repositoryModel = model;

    // ensure this user can create or edit this repository
    checkPermissions(repositoryModel);

    List<String> indexedBranches = new ArrayList<String>();
    List<String> federationSets = new ArrayList<String>();
    final List<RegistrantAccessPermission> repositoryUsers =
        new ArrayList<RegistrantAccessPermission>();
    final List<RegistrantAccessPermission> repositoryTeams =
        new ArrayList<RegistrantAccessPermission>();
    List<String> preReceiveScripts = new ArrayList<String>();
    List<String> postReceiveScripts = new ArrayList<String>();

    GitBlitWebSession session = GitBlitWebSession.get();
    final UserModel user = session.getUser() == null ? UserModel.ANONYMOUS : session.getUser();
    final boolean allowEditName =
        isCreate || isAdmin || repositoryModel.isUsersPersonalRepository(user.username);

    if (isCreate) {
      if (user.canAdmin()) {
        super.setupPage(getString("gb.newRepository"), "");
      } else {
        super.setupPage(getString("gb.newRepository"), user.getDisplayName());
      }
    } else {
      super.setupPage(getString("gb.edit"), repositoryModel.name);
      repositoryUsers.addAll(GitBlit.self().getUserAccessPermissions(repositoryModel));
      repositoryTeams.addAll(GitBlit.self().getTeamAccessPermissions(repositoryModel));
      Collections.sort(repositoryUsers);
      Collections.sort(repositoryTeams);

      federationSets.addAll(repositoryModel.federationSets);
      if (!ArrayUtils.isEmpty(repositoryModel.indexedBranches)) {
        indexedBranches.addAll(repositoryModel.indexedBranches);
      }
    }

    final String oldName = repositoryModel.name;

    final RegistrantPermissionsPanel usersPalette =
        new RegistrantPermissionsPanel(
            "users",
            RegistrantType.USER,
            GitBlit.self().getAllUsernames(),
            repositoryUsers,
            getAccessPermissions());
    final RegistrantPermissionsPanel teamsPalette =
        new RegistrantPermissionsPanel(
            "teams",
            RegistrantType.TEAM,
            GitBlit.self().getAllTeamnames(),
            repositoryTeams,
            getAccessPermissions());

    // owners palette
    List<String> owners = new ArrayList<String>(repositoryModel.owners);
    List<String> persons = GitBlit.self().getAllUsernames();
    final Palette<String> ownersPalette =
        new Palette<String>(
            "owners",
            new ListModel<String>(owners),
            new CollectionModel<String>(persons),
            new StringChoiceRenderer(),
            12,
            true);

    // indexed local branches palette
    List<String> allLocalBranches = new ArrayList<String>();
    allLocalBranches.add(Constants.DEFAULT_BRANCH);
    allLocalBranches.addAll(repositoryModel.getLocalBranches());
    boolean luceneEnabled = GitBlit.getBoolean(Keys.web.allowLuceneIndexing, true);
    final Palette<String> indexedBranchesPalette =
        new Palette<String>(
            "indexedBranches",
            new ListModel<String>(indexedBranches),
            new CollectionModel<String>(allLocalBranches),
            new StringChoiceRenderer(),
            8,
            false);
    indexedBranchesPalette.setEnabled(luceneEnabled);

    // federation sets palette
    List<String> sets = GitBlit.getStrings(Keys.federation.sets);
    final Palette<String> federationSetsPalette =
        new Palette<String>(
            "federationSets",
            new ListModel<String>(federationSets),
            new CollectionModel<String>(sets),
            new StringChoiceRenderer(),
            8,
            false);

    // pre-receive palette
    if (!ArrayUtils.isEmpty(repositoryModel.preReceiveScripts)) {
      preReceiveScripts.addAll(repositoryModel.preReceiveScripts);
    }
    final Palette<String> preReceivePalette =
        new Palette<String>(
            "preReceiveScripts",
            new ListModel<String>(preReceiveScripts),
            new CollectionModel<String>(GitBlit.self().getPreReceiveScriptsUnused(repositoryModel)),
            new StringChoiceRenderer(),
            12,
            true);

    // post-receive palette
    if (!ArrayUtils.isEmpty(repositoryModel.postReceiveScripts)) {
      postReceiveScripts.addAll(repositoryModel.postReceiveScripts);
    }
    final Palette<String> postReceivePalette =
        new Palette<String>(
            "postReceiveScripts",
            new ListModel<String>(postReceiveScripts),
            new CollectionModel<String>(
                GitBlit.self().getPostReceiveScriptsUnused(repositoryModel)),
            new StringChoiceRenderer(),
            12,
            true);

    // custom fields
    final Map<String, String> customFieldsMap = GitBlit.getMap(Keys.groovy.customFields);
    List<String> customKeys = new ArrayList<String>(customFieldsMap.keySet());
    final ListView<String> customFieldsListView =
        new ListView<String>("customFieldsListView", customKeys) {

          private static final long serialVersionUID = 1L;

          @Override
          protected void populateItem(ListItem<String> item) {
            String key = item.getModelObject();
            item.add(new Label("customFieldLabel", customFieldsMap.get(key)));

            String value = "";
            if (repositoryModel.customFields != null
                && repositoryModel.customFields.containsKey(key)) {
              value = repositoryModel.customFields.get(key);
            }
            TextField<String> field =
                new TextField<String>("customFieldValue", new Model<String>(value));
            item.add(field);
          }
        };
    customFieldsListView.setReuseItems(true);

    CompoundPropertyModel<RepositoryModel> rModel =
        new CompoundPropertyModel<RepositoryModel>(repositoryModel);
    Form<RepositoryModel> form =
        new Form<RepositoryModel>("editForm", rModel) {

          private static final long serialVersionUID = 1L;

          @Override
          protected void onSubmit() {
            try {
              // confirm a repository name was entered
              if (repositoryModel.name == null && StringUtils.isEmpty(repositoryModel.name)) {
                error(getString("gb.pleaseSetRepositoryName"));
                return;
              }

              // ensure name is trimmed
              repositoryModel.name = repositoryModel.name.trim();

              // automatically convert backslashes to forward slashes
              repositoryModel.name = repositoryModel.name.replace('\\', '/');
              // Automatically replace // with /
              repositoryModel.name = repositoryModel.name.replace("//", "/");

              // prohibit folder paths
              if (repositoryModel.name.startsWith("/")) {
                error(getString("gb.illegalLeadingSlash"));
                return;
              }
              if (repositoryModel.name.startsWith("../")) {
                error(getString("gb.illegalRelativeSlash"));
                return;
              }
              if (repositoryModel.name.contains("/../")) {
                error(getString("gb.illegalRelativeSlash"));
                return;
              }
              if (repositoryModel.name.endsWith("/")) {
                repositoryModel.name =
                    repositoryModel.name.substring(0, repositoryModel.name.length() - 1);
              }

              // confirm valid characters in repository name
              Character c = StringUtils.findInvalidCharacter(repositoryModel.name);
              if (c != null) {
                error(MessageFormat.format(getString("gb.illegalCharacterRepositoryName"), c));
                return;
              }

              if (user.canCreate() && !user.canAdmin() && allowEditName) {
                // ensure repository name begins with the user's path
                if (!repositoryModel.name.startsWith(user.getPersonalPath())) {
                  error(
                      MessageFormat.format(
                          getString("gb.illegalPersonalRepositoryLocation"),
                          user.getPersonalPath()));
                  return;
                }

                if (repositoryModel.name.equals(user.getPersonalPath())) {
                  // reset path prefix and show error
                  repositoryModel.name = user.getPersonalPath() + "/";
                  error(getString("gb.pleaseSetRepositoryName"));
                  return;
                }
              }

              // confirm access restriction selection
              if (repositoryModel.accessRestriction == null) {
                error(getString("gb.selectAccessRestriction"));
                return;
              }

              // confirm federation strategy selection
              if (repositoryModel.federationStrategy == null) {
                error(getString("gb.selectFederationStrategy"));
                return;
              }

              // save federation set preferences
              if (repositoryModel.federationStrategy.exceeds(FederationStrategy.EXCLUDE)) {
                repositoryModel.federationSets.clear();
                Iterator<String> sets = federationSetsPalette.getSelectedChoices();
                while (sets.hasNext()) {
                  repositoryModel.federationSets.add(sets.next());
                }
              }

              // set author metric exclusions
              String ax = metricAuthorExclusions.getObject();
              if (!StringUtils.isEmpty(ax)) {
                Set<String> list = new HashSet<String>();
                for (String exclusion : StringUtils.getStringsFromValue(ax, " ")) {
                  if (StringUtils.isEmpty(exclusion)) {
                    continue;
                  }
                  if (exclusion.indexOf(' ') > -1) {
                    list.add("\"" + exclusion + "\"");
                  } else {
                    list.add(exclusion);
                  }
                }
                repositoryModel.metricAuthorExclusions = new ArrayList<String>(list);
              }

              // set mailing lists
              String ml = mailingLists.getObject();
              if (!StringUtils.isEmpty(ml)) {
                Set<String> list = new HashSet<String>();
                for (String address : ml.split("(,|\\s)")) {
                  if (StringUtils.isEmpty(address)) {
                    continue;
                  }
                  list.add(address.toLowerCase());
                }
                repositoryModel.mailingLists = new ArrayList<String>(list);
              }

              // indexed branches
              List<String> indexedBranches = new ArrayList<String>();
              Iterator<String> branches = indexedBranchesPalette.getSelectedChoices();
              while (branches.hasNext()) {
                indexedBranches.add(branches.next());
              }
              repositoryModel.indexedBranches = indexedBranches;

              // owners
              repositoryModel.owners.clear();
              Iterator<String> owners = ownersPalette.getSelectedChoices();
              while (owners.hasNext()) {
                repositoryModel.addOwner(owners.next());
              }

              // pre-receive scripts
              List<String> preReceiveScripts = new ArrayList<String>();
              Iterator<String> pres = preReceivePalette.getSelectedChoices();
              while (pres.hasNext()) {
                preReceiveScripts.add(pres.next());
              }
              repositoryModel.preReceiveScripts = preReceiveScripts;

              // post-receive scripts
              List<String> postReceiveScripts = new ArrayList<String>();
              Iterator<String> post = postReceivePalette.getSelectedChoices();
              while (post.hasNext()) {
                postReceiveScripts.add(post.next());
              }
              repositoryModel.postReceiveScripts = postReceiveScripts;

              // custom fields
              repositoryModel.customFields = new LinkedHashMap<String, String>();
              for (int i = 0; i < customFieldsListView.size(); i++) {
                ListItem<String> child = (ListItem<String>) customFieldsListView.get(i);
                String key = child.getModelObject();

                TextField<String> field = (TextField<String>) child.get("customFieldValue");
                String value = field.getValue();

                repositoryModel.customFields.put(key, value);
              }

              // save the repository
              GitBlit.self().updateRepositoryModel(oldName, repositoryModel, isCreate);

              // repository access permissions
              if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
                GitBlit.self().setUserAccessPermissions(repositoryModel, repositoryUsers);
                GitBlit.self().setTeamAccessPermissions(repositoryModel, repositoryTeams);
              }
            } catch (GitBlitException e) {
              error(e.getMessage());
              return;
            }
            setRedirect(false);
            setResponsePage(RepositoriesPage.class);
          }
        };

    // do not let the browser pre-populate these fields
    form.add(new SimpleAttributeModifier("autocomplete", "off"));

    // field names reflective match RepositoryModel fields
    form.add(new TextField<String>("name").setEnabled(allowEditName));
    form.add(new TextField<String>("description"));
    form.add(ownersPalette);
    form.add(
        new CheckBox("allowForks").setEnabled(GitBlit.getBoolean(Keys.web.allowForking, true)));
    DropDownChoice<AccessRestrictionType> accessRestriction =
        new DropDownChoice<AccessRestrictionType>(
            "accessRestriction",
            Arrays.asList(AccessRestrictionType.values()),
            new AccessRestrictionRenderer());
    form.add(accessRestriction);
    form.add(new CheckBox("isFrozen"));
    // TODO enable origin definition
    form.add(new TextField<String>("origin").setEnabled(false /* isCreate */));

    // allow relinking HEAD to a branch or tag other than master on edit repository
    List<String> availableRefs = new ArrayList<String>();
    if (!ArrayUtils.isEmpty(repositoryModel.availableRefs)) {
      availableRefs.addAll(repositoryModel.availableRefs);
    }
    form.add(
        new DropDownChoice<String>("HEAD", availableRefs).setEnabled(availableRefs.size() > 0));

    boolean gcEnabled = GitBlit.getBoolean(Keys.git.enableGarbageCollection, false);
    List<Integer> gcPeriods = Arrays.asList(1, 2, 3, 4, 5, 7, 10, 14);
    form.add(
        new DropDownChoice<Integer>("gcPeriod", gcPeriods, new GCPeriodRenderer())
            .setEnabled(gcEnabled));
    form.add(new TextField<String>("gcThreshold").setEnabled(gcEnabled));

    // federation strategies - remove ORIGIN choice if this repository has
    // no origin.
    List<FederationStrategy> federationStrategies =
        new ArrayList<FederationStrategy>(Arrays.asList(FederationStrategy.values()));
    if (StringUtils.isEmpty(repositoryModel.origin)) {
      federationStrategies.remove(FederationStrategy.FEDERATE_ORIGIN);
    }
    form.add(
        new DropDownChoice<FederationStrategy>(
            "federationStrategy", federationStrategies, new FederationTypeRenderer()));
    form.add(new CheckBox("useTickets"));
    form.add(new CheckBox("useDocs"));
    form.add(new CheckBox("useIncrementalPushTags"));
    form.add(new CheckBox("showRemoteBranches"));
    form.add(new CheckBox("showReadme"));
    form.add(new CheckBox("skipSizeCalculation"));
    form.add(new CheckBox("skipSummaryMetrics"));
    List<Integer> maxActivityCommits = Arrays.asList(-1, 0, 25, 50, 75, 100, 150, 200, 250, 500);
    form.add(
        new DropDownChoice<Integer>(
            "maxActivityCommits", maxActivityCommits, new MaxActivityCommitsRenderer()));

    metricAuthorExclusions =
        new Model<String>(
            ArrayUtils.isEmpty(repositoryModel.metricAuthorExclusions)
                ? ""
                : StringUtils.flattenStrings(repositoryModel.metricAuthorExclusions, " "));
    form.add(new TextField<String>("metricAuthorExclusions", metricAuthorExclusions));

    mailingLists =
        new Model<String>(
            ArrayUtils.isEmpty(repositoryModel.mailingLists)
                ? ""
                : StringUtils.flattenStrings(repositoryModel.mailingLists, " "));
    form.add(new TextField<String>("mailingLists", mailingLists));
    form.add(indexedBranchesPalette);

    List<AuthorizationControl> acList = Arrays.asList(AuthorizationControl.values());
    final RadioChoice<AuthorizationControl> authorizationControl =
        new RadioChoice<Constants.AuthorizationControl>(
            "authorizationControl", acList, new AuthorizationControlRenderer());
    form.add(authorizationControl);

    final CheckBox verifyCommitter = new CheckBox("verifyCommitter");
    verifyCommitter.setOutputMarkupId(true);
    form.add(verifyCommitter);

    form.add(usersPalette);
    form.add(teamsPalette);
    form.add(federationSetsPalette);
    form.add(preReceivePalette);
    form.add(
        new BulletListPanel(
            "inheritedPreReceive",
            getString("gb.inherited"),
            GitBlit.self().getPreReceiveScriptsInherited(repositoryModel)));
    form.add(postReceivePalette);
    form.add(
        new BulletListPanel(
            "inheritedPostReceive",
            getString("gb.inherited"),
            GitBlit.self().getPostReceiveScriptsInherited(repositoryModel)));

    WebMarkupContainer customFieldsSection = new WebMarkupContainer("customFieldsSection");
    customFieldsSection.add(customFieldsListView);
    form.add(
        customFieldsSection.setVisible(!GitBlit.getString(Keys.groovy.customFields, "").isEmpty()));

    // initial enable/disable of permission controls
    if (repositoryModel.accessRestriction.equals(AccessRestrictionType.NONE)) {
      // anonymous everything, disable all controls
      usersPalette.setEnabled(false);
      teamsPalette.setEnabled(false);
      authorizationControl.setEnabled(false);
      verifyCommitter.setEnabled(false);
    } else {
      // authenticated something
      // enable authorization controls
      authorizationControl.setEnabled(true);
      verifyCommitter.setEnabled(true);

      boolean allowFineGrainedControls =
          repositoryModel.authorizationControl.equals(AuthorizationControl.NAMED);
      usersPalette.setEnabled(allowFineGrainedControls);
      teamsPalette.setEnabled(allowFineGrainedControls);
    }

    accessRestriction.add(
        new AjaxFormComponentUpdatingBehavior("onchange") {

          private static final long serialVersionUID = 1L;

          protected void onUpdate(AjaxRequestTarget target) {
            // enable/disable permissions panel based on access restriction
            boolean allowAuthorizationControl =
                repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE);
            authorizationControl.setEnabled(allowAuthorizationControl);
            verifyCommitter.setEnabled(allowAuthorizationControl);

            boolean allowFineGrainedControls =
                allowAuthorizationControl
                    && repositoryModel.authorizationControl.equals(AuthorizationControl.NAMED);
            usersPalette.setEnabled(allowFineGrainedControls);
            teamsPalette.setEnabled(allowFineGrainedControls);

            if (allowFineGrainedControls) {
              repositoryModel.authorizationControl = AuthorizationControl.NAMED;
            }

            target.addComponent(authorizationControl);
            target.addComponent(verifyCommitter);
            target.addComponent(usersPalette);
            target.addComponent(teamsPalette);
          }
        });

    authorizationControl.add(
        new AjaxFormChoiceComponentUpdatingBehavior() {

          private static final long serialVersionUID = 1L;

          protected void onUpdate(AjaxRequestTarget target) {
            // enable/disable permissions panel based on access restriction
            boolean allowAuthorizationControl =
                repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE);
            authorizationControl.setEnabled(allowAuthorizationControl);

            boolean allowFineGrainedControls =
                allowAuthorizationControl
                    && repositoryModel.authorizationControl.equals(AuthorizationControl.NAMED);
            usersPalette.setEnabled(allowFineGrainedControls);
            teamsPalette.setEnabled(allowFineGrainedControls);

            if (allowFineGrainedControls) {
              repositoryModel.authorizationControl = AuthorizationControl.NAMED;
            }

            target.addComponent(authorizationControl);
            target.addComponent(usersPalette);
            target.addComponent(teamsPalette);
          }
        });

    form.add(new Button("save"));
    Button cancel =
        new Button("cancel") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(RepositoriesPage.class);
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    add(form);
  }