Skip to end of metadata
Go to start of metadata

Wtyczka favourites przychodzi z wbudowanym zbiorem elementów ulubionych. Elementy ulubione mogą być przedstawiane w postaci drzewa, aby ułatwić użytkownikowi wyszukiwanie interesujących go elementów.

Predefiniowane elementy to:

  1. Zadania - prowadzi do skrzynki zadań użytkownika
  2. Procesy- prowadzi do listy dostępnych procesów
    1. Proces - umożliwia stworzenie poszczególnych procesów
  3. Archiwum- otwiera elektroniczne archiwum systemu
    1. Klasy dokumentów - prowadzi do zakładki klas dokumentów
    2. Zestawy dokumentów - prowadzi do zakładki zestawów dokumentów
  4. Widoki - otwiera zakładkę widoków użytkownika
    1. Widok - wyświetla wyniki wybranego widoku użytkownika

Każda wtyczka może sama zdefiniować elementy ulubione, które będą dostępne dla użytkownika - dostarcza ona opis elementów oraz reguły ich wyświetlania w gadżecie lub stronie startowej.

Moduł <favourites>

Moduł favourites umożliwia wtyczką rejestrację własnych obiektów typu , które odpowiedzialne są za dostarczanie:

  • definicji elementów (także w postaci drzewa) - elementy, które wyświetlane są użytkownikowi podczas budowy zestawów
  • obiektów renderujących - przygotowujących dane do wyświetlenia

Zależności

Zależność do wtyczki favourites powinna być opcjonalna (wtyczka powinna działać, nawet jeżeli favourites nie są zainstalowane). W tym celu zależność należy zdefiniować z <optional>true</optional>:

pom.xml
 		<dependency>
			<groupId>com.suncode.plugin</groupId>
			<artifactId>favourites</artifactId>
			<version>1.0.0-SNAPSHOT</version>
			<optional>true</optional>
			<scope>provided</scope>
		</dependency>

Implementacja handler'a

W pierwszej kolejności należy stworzyć klasę implementującą interfejs  :

ExampleFavouriteHandler.java
public class ExampleFavouriteHandler implements FavouriteHandler {
	
	@Override
	public boolean supports(String type) {
		return "test".equals(type) || "test-sub".equals(type);
	}
 
	@Override
	public Collection<Definition> getDefinitions() {
		List<Definition> definitions = new ArrayList<Definition>();
		
		Definition definition = new Definition("test");
		definition.setName("TEST - Nazwa");
		definition.setDescription("TEST - Opis");
		definition.setTypeDescription("TEST - Typ");
		definition.setCountable(false);
		definitions.add(definition);
		
		NestedDefinition nestedDefinition = new NestedDefinition(definition.getType(), "test-sub");
		nestedDefinition.setName("TEST-SUB - Nazwa");
		nestedDefinition.setDescription("TEST-SUB - Opis");
		nestedDefinition.setTypeDescription("TEST-SUB - Typ");
		nestedDefinition.setCountable(true);
		nestedDefinition.setParameter(RandomStringUtils.randomAlphabetic(5));
		definitions.add(nestedDefinition);
		
		return definitions;
	}
	
	@Override
	public FavouritesRenderer getRenderer(FavouriteElement favourite) {
		ExampleFavouriteRenderer renderer = plugin.getContext().getBean(ExampleFavouriteRenderer.class);
		renderer.setFavourite(favourite);
		return renderer;
	}
}

Komentarze do pliku:

4-5: informujemy jakie typy definicji wspieramy - jesteśmy ich autorami i potrafimy je narysować

12-17: element ulubiony typu test

19-25: element ulubiony typu test-sub - jest on zagnieżdżony w elemencie test, co spowoduje stworzenie struktury drzewa z oknie wyboru

24: zapisujemy dowolne dodatkowe informacje w parametrze, który później może służyć np. do budowania linków

32-34: pobieramy obiekt renderera z kontekstu (komponent ma scope=prototype)

Klasa handlera zdefiniowana w module <favourites> zostanie stworzona z wykorzystaniem kontekstu wtyczki, dzięki czemu możliwe jest standardowe korzystanie z adnotacji @Component.

 

Powyższy kod definicji będzie skutkował dodaniem 2 nowych elementów ulubionych do wyboru w postaci drzewa:

Implementacja obiektu renderującego

Obiekt odpowiedzialny za narysowanie elementów w gadżecie to .  

Istnieje obiekt pomocniczy który dostarcza domyślne zachowanie rysowania pozwalając na łatwe przeciążenie.

Klasa ta musi być zawsze tworzona z wykorzystaniem kontekstu wtyczki jako prototype ponieważ nie jest ona ThreadSafe.

Implementacja takiego obiektu może wyglądać tak:

ExampleFavouriteRenderer.java
@Component
@Scope(value="prototype")
public class ExampleFavouriteRenderer extends FavouritesRendererSupport {
	
	@Override
	public boolean shouldRender() {
		return true;
	}
	
	@Override
	public String renderDescription() {
		return "Parametr:" + getFavourite().getParameter();
	}
	
	@Override
	public String renderCount() {
		return RandomStringUtils.randomNumeric(3);
	}
 
	@Override
	public String renderAction() {
		
		FavouriteElement element = getFavourite();
		if("test".equals(element.getType())){
			return "";
		}
		
		return getAnchor("Logout.do", "Logout");
	}
}

Komentarze do pliku:

1-2: komponent prototype

12: odczytujemy parametr tego elementu

23-26: możemy podejmować decyzje na podstawie aktualnego elementu

Deklaracja modułu <favourites>

Ostatnim krokiem jest deklaracja modułu <favoruites> w pliku suncode-plugin.xml:

suncode-plugin.xml
 <favourites key="favourite-entry" handler="com.suncode.plugin.example.ExampleFavouriteHandler"/>

Wyświetlana lista ulubionych

Tak skonfigurowany zestaw ulubionych:

Tak wygląda  w gadżecie pulpitu:

 

 

  • No labels
Write a comment…