public FriendsFeed(String id, final String ownerUserId, final String viewingUserId) { super(id); log.debug("FriendsFeed()"); // heading Label heading = new Label("heading"); if (viewingUserId.equals(ownerUserId)) { heading.setDefaultModel(new ResourceModel("heading.widget.my.friends")); } else { String displayName = sakaiProxy.getUserDisplayName(ownerUserId); heading.setDefaultModel( new StringResourceModel("heading.widget.view.friends", null, new Object[] {displayName})); } add(heading); // get our list of friends as an IDataProvider // the FriendDataProvider takes care of the privacy associated with the associated list // so what it returns will always be clean FriendsFeedDataProvider provider = new FriendsFeedDataProvider(ownerUserId); GridView<Person> dataView = new GridView<Person>("rows", provider) { private static final long serialVersionUID = 1L; @Override protected void populateEmptyItem(Item<Person> item) { Link friendItem = new Link("friendsFeedItem") { private static final long serialVersionUID = 1L; public void onClick() {} }; friendItem.add( new ProfileImageRenderer( "friendPhoto", null, null, null, ProfileConstants.PROFILE_IMAGE_THUMBNAIL, true)); friendItem.add(new Label("friendName", "empty")); item.add(friendItem); friendItem.setVisible(false); } protected void populateItem(Item<Person> item) { final Person person = (Person) item.getDefaultModelObject(); final String friendId = person.getUuid(); // setup info String displayName = person.getDisplayName(); boolean friend; // get friend status if (ownerUserId.equals(viewingUserId)) { friend = true; // viewing own list of friends so must be a friend } else { friend = connectionsLogic.isUserXFriendOfUserY( viewingUserId, friendId); // other person viewing, check if they are friends } // link to their profile Link<String> friendItem = new Link<String>("friendsFeedItem") { private static final long serialVersionUID = 1L; public void onClick() { // link to own profile if link will point to self if (viewingUserId.equals(friendId)) { setResponsePage(new MyProfile()); } else { setResponsePage(new ViewProfile(friendId)); } } }; /* IMAGE */ friendItem.add( new ProfileImageRenderer( "friendPhoto", friendId, person.getPreferences(), person.getPrivacy(), ProfileConstants.PROFILE_IMAGE_THUMBNAIL, true)); // name (will be linked also) Label friendLinkLabel = new Label("friendName", displayName); friendItem.add(friendLinkLabel); item.add(friendItem); } }; dataView.setColumns(3); add(dataView); /* NUM FRIENDS LABEL (can't just use provider as it only ever returns the number in the grid */ final int numFriends = connectionsLogic.getConnectionsForUserCount(ownerUserId); Label numFriendsLabel = new Label("numFriendsLabel"); add(numFriendsLabel); /* VIEW ALL FRIENDS LINK */ Link<String> viewFriendsLink = new Link<String>("viewFriendsLink") { private static final long serialVersionUID = 1L; public void onClick() { // this could come from a bookmarkablelink, but this works for now if (numFriends == 0) { setResponsePage(new MySearch()); } else { // if own FriendsFeed, link to own MyFriends, otherwise link to ViewFriends if (sakaiProxy.isSuperUserAndProxiedToUser(ownerUserId)) { setResponsePage(new ViewFriends(ownerUserId)); } else if (viewingUserId.equals(ownerUserId)) { setResponsePage(new MyFriends()); } else { setResponsePage(new ViewFriends(ownerUserId)); } } } }; Label viewFriendsLabel = new Label("viewFriendsLabel"); viewFriendsLink.add(viewFriendsLabel); add(viewFriendsLink); /* TESTS FOR THE ABOVE to change labels and links */ if (numFriends == 0) { numFriendsLabel.setDefaultModel(new ResourceModel("text.friend.feed.num.none")); // numFriendsLabel.setVisible(false); // if own FriendsFeed, show search link, otherwise hide if (viewingUserId.equals(ownerUserId)) { viewFriendsLabel.setDefaultModel(new ResourceModel("link.friend.feed.search")); } else { viewFriendsLink.setVisible(false); } } else if (numFriends == 1) { numFriendsLabel.setDefaultModel(new ResourceModel("text.friend.feed.num.one")); viewFriendsLink.setVisible(false); } else { numFriendsLabel.setDefaultModel( new StringResourceModel("text.friend.feed.num.many", null, new Object[] {numFriends})); viewFriendsLabel.setDefaultModel(new ResourceModel("link.friend.feed.view")); } }
public ComposeNewMessage(String id) { super(id); // current user final String userId = sakaiProxy.getCurrentUserId(); // setup model NewMessageModel newMessage = new NewMessageModel(); newMessage.setFrom(userId); // feedback for form submit action formFeedback = new Label("formFeedback"); formFeedback.setOutputMarkupPlaceholderTag(true); add(formFeedback); // setup form final Form<NewMessageModel> form = new Form<NewMessageModel>("form", new Model<NewMessageModel>(newMessage)); // close button /* WebMarkupContainer closeButton = new WebMarkupContainer("closeButton"); closeButton.add(new AjaxFallbackLink<Void>("link") { private static final long serialVersionUID = 1L; public void onClick(AjaxRequestTarget target) { if(target != null) { target.prependJavascript("$('#" + thisPanel.getMarkupId() + "').slideUp();"); target.appendJavascript("setMainFrameHeight(window.name);"); } } }.add(new ContextImage("img",new Model<String>(ProfileConstants.CLOSE_IMAGE)))); form.add(closeButton); */ // to label form.add(new Label("toLabel", new ResourceModel("message.to"))); // get connections final List<Person> connections = connectionsLogic.getConnectionsForUser(userId); Collections.sort(connections); // list provider AutoCompletionChoicesProvider<Person> provider = new AutoCompletionChoicesProvider<Person>() { private static final long serialVersionUID = 1L; public Iterator<Person> getChoices(String input) { return connectionsLogic .getConnectionsSubsetForSearch(connections, input, true) .iterator(); } }; // renderer ObjectAutoCompleteRenderer<Person> renderer = new ObjectAutoCompleteRenderer<Person>() { private static final long serialVersionUID = 1L; protected String getIdValue(Person p) { return p.getUuid(); } protected String getTextValue(Person p) { return p.getDisplayName(); } }; // autocompletefield builder ObjectAutoCompleteBuilder<Person, String> builder = new ObjectAutoCompleteBuilder<Person, String>(provider); builder.autoCompleteRenderer(renderer); builder.searchLinkImage(ResourceReferences.CROSS_IMG_LOCAL); builder.preselect(); // autocompletefield final ObjectAutoCompleteField<Person, String> autocompleteField = builder.build("toField", new PropertyModel<String>(newMessage, "to")); toField = autocompleteField.getSearchTextField(); toField.setMarkupId("messagerecipientinput"); toField.setOutputMarkupId(true); toField.add(new AttributeModifier("class", true, new Model<String>("formInputField"))); toField.setRequired(true); form.add(autocompleteField); // subject form.add(new Label("subjectLabel", new ResourceModel("message.subject"))); final TextField<String> subjectField = new TextField<String>("subjectField", new PropertyModel<String>(newMessage, "subject")); subjectField.setMarkupId("messagesubjectinput"); subjectField.setOutputMarkupId(true); subjectField.add(new RecipientEventBehavior("onfocus")); form.add(subjectField); // body form.add(new Label("messageLabel", new ResourceModel("message.message"))); final TextArea<String> messageField = new TextArea<String>("messageField", new PropertyModel<String>(newMessage, "message")); messageField.setMarkupId("messagebodyinput"); messageField.setOutputMarkupId(true); messageField.setRequired(true); messageField.add(new RecipientEventBehavior("onfocus")); form.add(messageField); // send button IndicatingAjaxButton sendButton = new IndicatingAjaxButton("sendButton", form) { private static final long serialVersionUID = 1L; protected void onSubmit(AjaxRequestTarget target, Form form) { // get the backing model NewMessageModel newMessage = (NewMessageModel) form.getModelObject(); // generate the thread id String threadId = ProfileUtils.generateUuid(); // save it, it will be abstracted into its proper parts and email notifications sent if (messagingLogic.sendNewMessage( newMessage.getTo(), newMessage.getFrom(), threadId, newMessage.getSubject(), newMessage.getMessage())) { // post event sakaiProxy.postEvent( ProfileConstants.EVENT_MESSAGE_SENT, "/profile/" + newMessage.getTo(), true); // success formFeedback.setDefaultModel(new ResourceModel("success.message.send.ok")); formFeedback.add(new AttributeModifier("class", true, new Model<String>("success"))); // target.appendJavascript("$('#" + form.getMarkupId() + "').slideUp();"); target.appendJavaScript("setMainFrameHeight(window.name);"); // PRFL-797 all fields when successful, to prevent multiple messages. // User can just click Compose message again to get a new form this.setEnabled(false); autocompleteField.setEnabled(false); subjectField.setEnabled(false); messageField.setEnabled(false); target.add(this); target.add(autocompleteField); target.add(subjectField); target.add(messageField); } else { // error formFeedback.setDefaultModel(new ResourceModel("error.message.send.failed")); formFeedback.add( new AttributeModifier("class", true, new Model<String>("alertMessage"))); } formFeedback.setVisible(true); target.add(formFeedback); } protected void onError(AjaxRequestTarget target, Form form) { // check which item didn't validate and update the feedback model if (!toField.isValid()) { formFeedback.setDefaultModel(new ResourceModel("error.message.required.to")); } if (!messageField.isValid()) { formFeedback.setDefaultModel(new ResourceModel("error.message.required.body")); } formFeedback.add( new AttributeModifier("class", true, new Model<String>("alertMessage"))); target.add(formFeedback); } }; form.add(sendButton); sendButton.setModel(new ResourceModel("button.message.send")); add(form); }