diff --git a/web/README.md b/web/example/README.md similarity index 100% rename from web/README.md rename to web/example/README.md diff --git a/web/example/pom.xml b/web/example/pom.xml new file mode 100644 index 00000000..682ff1d3 --- /dev/null +++ b/web/example/pom.xml @@ -0,0 +1,44 @@ + + 4.0.0 + + spring-data-web-example + + Spring Data - Web support example + + + org.springframework.data.examples + spring-data-web-examples + 1.0.0.BUILD-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-security + + + + org.hsqldb + hsqldb + + + + + \ No newline at end of file diff --git a/web/src/main/java/example/springdata/web/Application.java b/web/example/src/main/java/example/Application.java similarity index 88% rename from web/src/main/java/example/springdata/web/Application.java rename to web/example/src/main/java/example/Application.java index 2a9d9d6b..7d3443b4 100644 --- a/web/src/main/java/example/springdata/web/Application.java +++ b/web/example/src/main/java/example/Application.java @@ -13,11 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package example.springdata.web; - -import example.springdata.web.users.Password; -import example.springdata.web.users.UserManagement; -import example.springdata.web.users.Username; +package example; import java.util.stream.IntStream; @@ -33,6 +29,10 @@ import org.springframework.data.web.config.EnableSpringDataWebSupport; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import example.users.Password; +import example.users.UserManagement; +import example.users.Username; + /** * Central Spring Boot application class to bootstrap the application. Excludes Spring Security auto-configuration as we * don't need it for the example but only want to use a {@link PasswordEncoder} (see {@link #passwordEncoder()}). @@ -41,9 +41,9 @@ import org.springframework.security.crypto.password.PasswordEncoder; * {@link EnableSpringDataWebSupport}. The core aspects of the enabled functionality shown in this example are: *
    *
  1. Automatic population of a {@link Pageable} instances from request parameters (see - * {@link example.springdata.web.users.web.UserController#users(Pageable)})
  2. + * {@link example.users.web.UserController#users(Pageable)}) *
  3. The ability to use proxy-backed interfaces to bind request payloads (see - * {@link example.springdata.web.users.web.UserController.UserForm})
  4. + * {@link example.users.web.UserController.UserForm}) *
* * @author Oliver Gierke diff --git a/web/src/main/java/example/springdata/web/users/Password.java b/web/example/src/main/java/example/users/Password.java similarity index 98% rename from web/src/main/java/example/springdata/web/users/Password.java rename to web/example/src/main/java/example/users/Password.java index 3f7187d6..f2fb6ead 100644 --- a/web/src/main/java/example/springdata/web/users/Password.java +++ b/web/example/src/main/java/example/users/Password.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package example.springdata.web.users; +package example.users; import javax.persistence.Embeddable; diff --git a/web/src/main/java/example/springdata/web/users/User.java b/web/example/src/main/java/example/users/User.java similarity index 97% rename from web/src/main/java/example/springdata/web/users/User.java rename to web/example/src/main/java/example/users/User.java index c5d2dbe8..37a251a1 100644 --- a/web/src/main/java/example/springdata/web/users/User.java +++ b/web/example/src/main/java/example/users/User.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package example.springdata.web.users; +package example.users; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/web/src/main/java/example/springdata/web/users/UserManagement.java b/web/example/src/main/java/example/users/UserManagement.java similarity index 98% rename from web/src/main/java/example/springdata/web/users/UserManagement.java rename to web/example/src/main/java/example/users/UserManagement.java index c6d49664..523ea986 100644 --- a/web/src/main/java/example/springdata/web/users/UserManagement.java +++ b/web/example/src/main/java/example/users/UserManagement.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package example.springdata.web.users; +package example.users; import java.util.Optional; diff --git a/web/src/main/java/example/springdata/web/users/UserRepository.java b/web/example/src/main/java/example/users/UserRepository.java similarity index 96% rename from web/src/main/java/example/springdata/web/users/UserRepository.java rename to web/example/src/main/java/example/users/UserRepository.java index 81ff86f7..00ca1194 100644 --- a/web/src/main/java/example/springdata/web/users/UserRepository.java +++ b/web/example/src/main/java/example/users/UserRepository.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package example.springdata.web.users; +package example.users; import java.util.Optional; diff --git a/web/src/main/java/example/springdata/web/users/Username.java b/web/example/src/main/java/example/users/Username.java similarity index 97% rename from web/src/main/java/example/springdata/web/users/Username.java rename to web/example/src/main/java/example/users/Username.java index 9bfb5f9d..bb90f9ef 100644 --- a/web/src/main/java/example/springdata/web/users/Username.java +++ b/web/example/src/main/java/example/users/Username.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package example.springdata.web.users; +package example.users; import javax.persistence.Embeddable; diff --git a/web/src/main/java/example/springdata/web/users/web/UserController.java b/web/example/src/main/java/example/users/web/UserController.java similarity index 95% rename from web/src/main/java/example/springdata/web/users/web/UserController.java rename to web/example/src/main/java/example/users/web/UserController.java index 488ce613..14164144 100644 --- a/web/src/main/java/example/springdata/web/users/web/UserController.java +++ b/web/example/src/main/java/example/users/web/UserController.java @@ -13,15 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package example.springdata.web.users.web; +package example.users.web; import static org.springframework.validation.ValidationUtils.*; -import example.springdata.web.users.Password; -import example.springdata.web.users.User; -import example.springdata.web.users.UserManagement; -import example.springdata.web.users.Username; - import java.util.Map; import lombok.RequiredArgsConstructor; @@ -40,6 +35,11 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.view.RedirectView; +import example.users.Password; +import example.users.User; +import example.users.UserManagement; +import example.users.Username; + /** * A sample controller implementation to showcase Spring Data web support: *
    diff --git a/web/src/main/resources/messages.properties b/web/example/src/main/resources/messages.properties similarity index 100% rename from web/src/main/resources/messages.properties rename to web/example/src/main/resources/messages.properties diff --git a/web/src/main/resources/static/css/style.css b/web/example/src/main/resources/static/css/style.css similarity index 100% rename from web/src/main/resources/static/css/style.css rename to web/example/src/main/resources/static/css/style.css diff --git a/web/src/main/resources/templates/users.html b/web/example/src/main/resources/templates/users.html similarity index 100% rename from web/src/main/resources/templates/users.html rename to web/example/src/main/resources/templates/users.html diff --git a/web/src/test/java/example/springdata/web/users/AbstractIntegrationTests.java b/web/example/src/test/java/example/users/AbstractIntegrationTests.java similarity index 92% rename from web/src/test/java/example/springdata/web/users/AbstractIntegrationTests.java rename to web/example/src/test/java/example/users/AbstractIntegrationTests.java index 0b955a47..5912f6b3 100644 --- a/web/src/test/java/example/springdata/web/users/AbstractIntegrationTests.java +++ b/web/example/src/test/java/example/users/AbstractIntegrationTests.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package example.springdata.web.users; - -import example.springdata.web.Application; +package example.users; import org.junit.runner.RunWith; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import example.Application; + /** * Integration tests to bootstrap the application. * diff --git a/web/src/test/java/example/springdata/web/users/UserManagementIntegrationTests.java b/web/example/src/test/java/example/users/UserManagementIntegrationTests.java similarity index 84% rename from web/src/test/java/example/springdata/web/users/UserManagementIntegrationTests.java rename to web/example/src/test/java/example/users/UserManagementIntegrationTests.java index 0d06c4e8..f28386ed 100644 --- a/web/src/test/java/example/springdata/web/users/UserManagementIntegrationTests.java +++ b/web/example/src/test/java/example/users/UserManagementIntegrationTests.java @@ -13,16 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package example.springdata.web.users; +package example.users; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; -import example.springdata.web.users.Password; -import example.springdata.web.users.User; -import example.springdata.web.users.UserManagement; -import example.springdata.web.users.Username; - import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/web/src/test/java/example/springdata/web/users/UserRepositoryIntegrationTests.java b/web/example/src/test/java/example/users/UserRepositoryIntegrationTests.java similarity index 84% rename from web/src/test/java/example/springdata/web/users/UserRepositoryIntegrationTests.java rename to web/example/src/test/java/example/users/UserRepositoryIntegrationTests.java index 3577027e..0777e864 100644 --- a/web/src/test/java/example/springdata/web/users/UserRepositoryIntegrationTests.java +++ b/web/example/src/test/java/example/users/UserRepositoryIntegrationTests.java @@ -13,12 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package example.springdata.web.users; - -import example.springdata.web.users.Password; -import example.springdata.web.users.User; -import example.springdata.web.users.UserRepository; -import example.springdata.web.users.Username; +package example.users; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/web/pom.xml b/web/pom.xml index 76614b49..b69368cc 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -2,9 +2,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-data-web-example - - Spring Data - Web support example + spring-data-web-examples + pom org.springframework.data.examples @@ -12,31 +11,20 @@ 1.0.0.BUILD-SNAPSHOT + Spring Data Web - Examples + Sample projects for Spring Data Web Support + 2015 + + + example + querydsl + + org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.springframework.boot - spring-boot-starter-security - - - - org.hsqldb - hsqldb + spring-boot-starter diff --git a/web/querydsl/README.md b/web/querydsl/README.md new file mode 100644 index 00000000..a2849dbd --- /dev/null +++ b/web/querydsl/README.md @@ -0,0 +1,17 @@ +# Spring Data Web - QueryDSL example + +This example shows some of the Spring Data QueryDSL integration features with Spring MVC. + +## Quickstart + +1. Install MongoDB (http://www.mongodb.org/downloads, unzip, run `mkdir data`, run `bin/mongod --dbpath=data`) +2. Build and run the app (`mvn spring-boot:run`) +3. Access the root resource (`curl http://localhost:8080/api`) and traverse hyperlinks. +4. Or access app directly via its UI (`http://localhost:8080/`). + +## Technologies used + +- Spring Data REST & QueryDSL & Spring Data MongoDB +- MongoDB +- Spring Batch (to read the CSV file containing the store data and pipe it into MongoDB) +- Spring Boot diff --git a/web/querydsl/pom.xml b/web/querydsl/pom.xml new file mode 100644 index 00000000..c0863819 --- /dev/null +++ b/web/querydsl/pom.xml @@ -0,0 +1,149 @@ + + 4.0.0 + + spring-data-web-querydsl + + Spring Data Web - QueryDSL Example + + + org.springframework.data.examples + spring-data-web-examples + 1.0.0.BUILD-SNAPSHOT + + + + 0.18.0.BUILD-SNAPSHOT + Gosling-BUILD-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + + org.springframework.data + spring-data-mongodb + + + + org.springframework.data + spring-data-rest-webmvc + 2.4.0.DATAREST-616-SNAPSHOT + + + + org.springframework.data + spring-data-commons + 1.11.0.DATACMNS-734-SNAPSHOT + + + + com.fasterxml.jackson.core + jackson-core + + + + + com.mysema.querydsl + querydsl-mongodb + ${querydsl.version} + + + + org.springframework.data + spring-data-rest-hal-browser + runtime + + + + org.springframework.batch + spring-batch-core + + + + com.jayway.jsonpath + json-path + runtime + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + runtime + + + + org.webjars + jquery + 2.1.3 + runtime + + + + org.webjars + bootstrap + 3.3.4 + runtime + + + + org.webjars + URI.js + 1.14.1 + runtime + + + + org.webjars + webjars-locator + 0.22 + runtime + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + example.users.UserApp + + + + com.mysema.maven + apt-maven-plugin + ${apt.version} + + + com.mysema.querydsl + querydsl-apt + ${querydsl.version} + + + + + generate-sources + + process + + + target/generated-sources/annotations + org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor + true + + + + + + + + + diff --git a/web/querydsl/src/main/java/example/users/Address.java b/web/querydsl/src/main/java/example/users/Address.java new file mode 100644 index 00000000..ff128f46 --- /dev/null +++ b/web/querydsl/src/main/java/example/users/Address.java @@ -0,0 +1,30 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example.users; + +import lombok.Value; + +/** + * @author Christoph Strobl + */ +@Value +public class Address { + + private String city; + private String street; + private String zip; + +} diff --git a/web/querydsl/src/main/java/example/users/Picture.java b/web/querydsl/src/main/java/example/users/Picture.java new file mode 100644 index 00000000..075c6655 --- /dev/null +++ b/web/querydsl/src/main/java/example/users/Picture.java @@ -0,0 +1,30 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example.users; + +import lombok.Value; + +/** + * @author Christoph Strobl + */ +@Value +public class Picture { + + private String large; + private String medium; + private String small; + +} diff --git a/web/querydsl/src/main/java/example/users/User.java b/web/querydsl/src/main/java/example/users/User.java new file mode 100644 index 00000000..f9f5aa6b --- /dev/null +++ b/web/querydsl/src/main/java/example/users/User.java @@ -0,0 +1,43 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example.users; + +import lombok.Data; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonUnwrapped; + +/** + * @author Christoph Strobl + */ +@Data +@Document +public class User { + + @Id private String username; + private String firstname; + private String lastname; + private String email; + private String nationality; + @JsonIgnore private String password; + + @JsonUnwrapped private Address address; + private Picture picture; + +} diff --git a/web/querydsl/src/main/java/example/users/UserApp.java b/web/querydsl/src/main/java/example/users/UserApp.java new file mode 100644 index 00000000..3d51459e --- /dev/null +++ b/web/querydsl/src/main/java/example/users/UserApp.java @@ -0,0 +1,42 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example.users; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import example.users.UserInitializer.Datasource; + +/** + * @author Christoph Strobl + */ +@SpringBootApplication +public class UserApp { + + @Autowired UserRepository repo; + + public static void main(String[] args) { + SpringApplication.run(UserApp.class, args); + } + + @PostConstruct + void initialize() throws Exception { + new UserInitializer(repo).init(100, Datasource.LOCAL); + } +} diff --git a/web/querydsl/src/main/java/example/users/UserInitializer.java b/web/querydsl/src/main/java/example/users/UserInitializer.java new file mode 100644 index 00000000..c4276a45 --- /dev/null +++ b/web/querydsl/src/main/java/example/users/UserInitializer.java @@ -0,0 +1,122 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example.users; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.item.ParseException; +import org.springframework.batch.item.UnexpectedInputException; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.mapping.DefaultLineMapper; +import org.springframework.batch.item.file.separator.DefaultRecordSeparatorPolicy; +import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; + +/** + * @author Christoph Strobl + */ +public class UserInitializer { + + private final UserRepository repository; + + public enum Datasource { + LOCAL, REMOTE; + } + + public UserInitializer(UserRepository repository) throws UnexpectedInputException, ParseException, Exception { + this.repository = repository; + } + + private List readUsers(Resource resource, int nrUsers) throws Exception { + + Scanner scanner = new Scanner(resource.getInputStream()); + String line = scanner.nextLine(); + scanner.close(); + + FlatFileItemReader reader = new FlatFileItemReader(); + reader.setResource(resource); + + DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(); + tokenizer.setNames(line.split(",")); + tokenizer.setStrict(false); + + DefaultLineMapper lineMapper = new DefaultLineMapper(); + lineMapper.setFieldSetMapper(fields -> { + + User user = new User(); + + user.setEmail(fields.readString("email")); + user.setFirstname(fields.readString("first")); + user.setLastname(fields.readString("last")); + user.setNationality(fields.readString("nationality")); + + try { + user.setAddress(new Address(fields.readString("city"), fields.readString("street"), fields.readString("zip"))); + } catch (IllegalArgumentException e) { + user.setAddress(new Address(fields.readString("city"), fields.readString("street"), fields + .readString("postcode"))); + } + + user.setPicture(new Picture(fields.readString("large"), fields.readString("medium"), fields + .readString("thumbnail"))); + user.setUsername(fields.readString("username")); + user.setPassword(fields.readString("password")); + return user; + }); + + lineMapper.setLineTokenizer(tokenizer); + reader.setLineMapper(lineMapper); + reader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy()); + reader.setLinesToSkip(1); + reader.open(new ExecutionContext()); + + List users = new ArrayList<>(); + User user = null; + + int count = 0; + do { + + user = reader.read(); + + if (user != null) { + users.add(user); + } + + } while (user != null && ++count < nrUsers); + + return users; + } + + public void init(int nrUsers, Datasource source) throws Exception { + + if (repository.count() != nrUsers) { + + Resource resource = Datasource.LOCAL.equals(source) ? new ClassPathResource("randomuser.me.csv") + : new UrlResource("https://randomuser.me/api/?results=" + nrUsers + "&format=csv"); + + List users = readUsers(resource, nrUsers); + if (!users.isEmpty()) { + repository.deleteAll(); + repository.save(users); + } + } + } +} diff --git a/web/querydsl/src/main/java/example/users/UserRepository.java b/web/querydsl/src/main/java/example/users/UserRepository.java new file mode 100644 index 00000000..cbcbf04d --- /dev/null +++ b/web/querydsl/src/main/java/example/users/UserRepository.java @@ -0,0 +1,37 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example.users; + +import org.springframework.data.querydsl.QueryDslPredicateExecutor; +import org.springframework.data.querydsl.binding.QuerydslBinderCustomizer; +import org.springframework.data.querydsl.binding.QuerydslBindings; +import org.springframework.data.repository.CrudRepository; + +import com.mysema.query.types.path.StringPath; + +/** + * @author Christoph Strobl + */ +public interface UserRepository extends CrudRepository, QueryDslPredicateExecutor, + QuerydslBinderCustomizer { + + @Override + default public void customize(QuerydslBindings bindings, QUser root) { + + bindings.bind(String.class).first((StringPath path, String value) -> path.containsIgnoreCase(value)); + bindings.excluding(root.password); + } +} diff --git a/web/querydsl/src/main/java/example/users/WebConfig.java b/web/querydsl/src/main/java/example/users/WebConfig.java new file mode 100644 index 00000000..11e5ca5b --- /dev/null +++ b/web/querydsl/src/main/java/example/users/WebConfig.java @@ -0,0 +1,41 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example.users; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.resource.ResourceUrlEncodingFilter; + +/** + * @author Christoph Strobl + */ +@Configuration +public class WebConfig extends WebMvcConfigurerAdapter { + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/webjars/**").// + addResourceLocations("classpath:/META-INF/resources/webjars/").// + resourceChain(true); + } + + @Bean + public ResourceUrlEncodingFilter resourceUrlEncodingFilter() { + return new ResourceUrlEncodingFilter(); + } +} diff --git a/web/querydsl/src/main/java/example/users/web/UserController.java b/web/querydsl/src/main/java/example/users/web/UserController.java new file mode 100644 index 00000000..02f601f3 --- /dev/null +++ b/web/querydsl/src/main/java/example/users/web/UserController.java @@ -0,0 +1,49 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example.users.web; + +import lombok.RequiredArgsConstructor; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.querydsl.QuerydslPredicate; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import com.mysema.query.types.Predicate; + +import example.users.User; +import example.users.UserRepository; + +/** + * @author Christoph Strobl + */ +@Controller +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class UserController { + + private final UserRepository repository; + + @RequestMapping(value = "/", method = RequestMethod.GET) + String index(Model model, @QuerydslPredicate(root = User.class) Predicate predicate, Pageable pageable) { + + model.addAttribute("users", repository.findAll(predicate, pageable)); + return "index"; + } + +} diff --git a/web/querydsl/src/main/resources/application.properties b/web/querydsl/src/main/resources/application.properties new file mode 100644 index 00000000..b49c0afe --- /dev/null +++ b/web/querydsl/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.data.rest.base-path=/api +spring.data.mongodb.database=users-querydsl diff --git a/web/querydsl/src/main/resources/randomuser.me.csv b/web/querydsl/src/main/resources/randomuser.me.csv new file mode 100644 index 00000000..2ac22432 --- /dev/null +++ b/web/querydsl/src/main/resources/randomuser.me.csv @@ -0,0 +1,101 @@ +gender,title,first,last,street,city,state,zip,email,username,password,salt,md5,sha1,sha256,registered,dob,phone,cell,SSN,large,medium,thumbnail,version,nationality +male,mr,duane,ellis,"6708 homestead rd","fort worth",massachusetts,71446,duane.ellis89@example.com,tinyfish906,letmein2,zHO6roNA,bf844c4ef4f52d9064a30474ae04ecf9,322bfe1c41a93da511465fd906970daa7420aaa1,8852e5f20499458429d2be3ed003eef5e2d459cd6a29c3ea90f7ea7dbd759060,1236963950,523429895,(988)-153-8907,(890)-729-2774,177-83-3250,http://api.randomuser.me/portraits/men/18.jpg,http://api.randomuser.me/portraits/med/men/18.jpg,http://api.randomuser.me/portraits/thumb/men/18.jpg,0.6,US +male,mr,jamie,lawson,"7301 rolling green rd",oxnard,wisconsin,95613,jamie.lawson40@example.com,lazyladybug663,training,vICtsN92,1edf032ec518ea14578bc406a81dc271,6b9fd85215a5a817adea9fe355143155f58b6631,5377f033a21c4eeffb3868af3e367964218f2a9820dce04cda6ad885f75bdcc0,1091847204,755906614,(309)-600-1796,(996)-562-1441,498-39-4892,http://api.randomuser.me/portraits/men/59.jpg,http://api.randomuser.me/portraits/med/men/59.jpg,http://api.randomuser.me/portraits/thumb/men/59.jpg,0.6,US +male,mr,dale,sanders,"9314 lone wolf trail",columbia,texas,78030,dale.sanders30@example.com,browncat928,parker,NOl5CCy9,2497771511a8549ee8a7a6b529cc47cb,166ea8e79f6ef06c20a796595a457d41a5ea3e90,269aa2e60a442a93911eb67a8142ea860143e413af33d487426df86516ee8de1,1374069475,804572414,(502)-858-5517,(151)-900-6328,945-34-3819,http://api.randomuser.me/portraits/men/3.jpg,http://api.randomuser.me/portraits/med/men/3.jpg,http://api.randomuser.me/portraits/thumb/men/3.jpg,0.6,US +female,ms,peyton,oliver,"1829 wycliff ave",wichita,alabama,24133,peyton.oliver62@example.com,beautifullion238,matador,bp1nKu9W,a3739f180798a07c29dd15302a45edec,20bf002f33bf60355fa334c05d366748953a7c65,587d2c0c11ddb19c74f743ff48d351147c0491c2a13bccfbddd662c6f94cd956,1101425547,753811390,(283)-121-9144,(515)-143-1483,543-94-1158,http://api.randomuser.me/portraits/women/53.jpg,http://api.randomuser.me/portraits/med/women/53.jpg,http://api.randomuser.me/portraits/thumb/women/53.jpg,0.6,US +female,mrs,shelly,webb,"2371 sunset st",pomona,massachusetts,44595,shelly.webb20@example.com,orangeswan382,oooooooo,gH8Kbc17,5ae154bb59eefe5a2b1696a222918bd7,9b1fb91e052bef91de4dad7b5cef1e1bac627dce,98bd5f842220257d11182a24980c5aa974c8ff7402d0762dad9ce1152cf78190,1406148405,293207573,(261)-671-6305,(291)-491-6619,266-72-8712,http://api.randomuser.me/portraits/women/59.jpg,http://api.randomuser.me/portraits/med/women/59.jpg,http://api.randomuser.me/portraits/thumb/women/59.jpg,0.6,US +female,miss,savannah,williamson,"7402 fairview st",springfield,wisconsin,75148,savannah.williamson32@example.com,crazycat654,cookie1,i9YuZB27,dd4f285e39bcb27335d771f22e4d9c69,646129c52114facf3f40a5a8f3465dfcd00dc1a9,89b459df861e45270211989030f5d7d1672f1233846422e641de8ed463d4164a,1020071890,998523107,(956)-807-8249,(214)-411-7780,998-26-6975,http://api.randomuser.me/portraits/women/82.jpg,http://api.randomuser.me/portraits/med/women/82.jpg,http://api.randomuser.me/portraits/thumb/women/82.jpg,0.6,US +female,miss,leah,ramos,"7214 hunters creek dr","great falls",hawaii,58697,leah.ramos28@example.com,greenwolf313,tottenha,Rb6FWg7Z,cd997ca5d3563680671268d7aff24445,20977e0e4518ee216907ee51990c2407987449f1,2f33dbff8970cec8a5d7a17142f15c004665216cfc04f30f9a45d7132b181919,1049712399,827861355,(567)-495-8747,(412)-335-7171,159-89-6480,http://api.randomuser.me/portraits/women/61.jpg,http://api.randomuser.me/portraits/med/women/61.jpg,http://api.randomuser.me/portraits/thumb/women/61.jpg,0.6,US +female,mrs,lucy,sanchez,"9858 northaven rd","little rock",wyoming,45054,lucy.sanchez85@example.com,ticklishdog249,virginia,3cS3GmFv,82b5f891c976f4edece4804f5ff8d991,7311720ba70678cd925a21e2bba9e3aa65242779,098bc8614fe8c2c55146a8566460973cfba96feef0f239c1df40ba2f3e8de044,1374437915,1258921569,(818)-824-2942,(956)-916-5331,666-51-8615,http://api.randomuser.me/portraits/women/5.jpg,http://api.randomuser.me/portraits/med/women/5.jpg,http://api.randomuser.me/portraits/thumb/women/5.jpg,0.6,US +female,mrs,rebecca,hale,"6810 thornridge cir",forney,wyoming,73901,rebecca.hale16@example.com,silverelephant710,chicks,JwsAPRqV,e86d524ab0bfa4d7936fabfc6d3dfb9a,4c8b4203cde2a0fd9ae816a83ee6186f678f4d0b,a961e6fcac28a97b92e788f20e02d5de2a65195a58751fd9eb200bfea6070b27,1416097279,1188580073,(856)-645-5447,(462)-771-2910,572-17-4398,http://api.randomuser.me/portraits/women/55.jpg,http://api.randomuser.me/portraits/med/women/55.jpg,http://api.randomuser.me/portraits/thumb/women/55.jpg,0.6,US +female,miss,peggy,johnston,"5807 adams st",hayward,maine,70540,peggy.johnston35@example.com,purplemeercat376,oxford,nfIwOK1U,ab47ed5b9a8ba91d970cfd0ef5b309fa,445103fe5393d6ac51619a1b33d6b54fcc4ca2ef,d40023321825aadbf9e6e60223f3515e3bb88caacf4b2a5753daec9a5500c26d,980325626,984321448,(408)-886-2680,(150)-671-8952,784-11-6573,http://api.randomuser.me/portraits/women/70.jpg,http://api.randomuser.me/portraits/med/women/70.jpg,http://api.randomuser.me/portraits/thumb/women/70.jpg,0.6,US +male,mr,isaac,hart,"3365 white oak dr",charleston,minnesota,65425,isaac.hart86@example.com,whitebear942,coucou,ZghMH7W7,557920b173dc0e77ff7410d7062961f1,1a6164182d5d91b022a4d51f7d673073ad11b76d,44c5a546dc5e67da7e101d8a96880633826768f12603e4c6c34b926147b4fb17,1039733877,1030594726,(891)-746-5274,(634)-898-3261,417-59-2293,http://api.randomuser.me/portraits/men/91.jpg,http://api.randomuser.me/portraits/med/men/91.jpg,http://api.randomuser.me/portraits/thumb/men/91.jpg,0.6,US +male,mr,ronald,grant,"5286 bruce st",pueblo,montana,90637,ronald.grant23@example.com,silverfish423,festival,6Z0ZbQxa,81f6e903055377903d8bd3e1e3927a34,59d360c15677c1ca12388a85622275acc63205ec,52d8197b4674355aeaa89c77fe31aad448d205f96841f4d9010f1b7609e76e97,989524474,1388652373,(616)-951-6609,(280)-371-1522,473-83-3952,http://api.randomuser.me/portraits/men/32.jpg,http://api.randomuser.me/portraits/med/men/32.jpg,http://api.randomuser.me/portraits/thumb/men/32.jpg,0.6,US +female,ms,yolanda,gomez,"3617 wycliff ave",fresno,hawaii,67551,yolanda.gomez42@example.com,crazyduck900,punisher,9GFk3yv3,b7376bbd9fc85980220b67ffdfac4bb0,25e01695baadd9c7eb5eb7f6b87f36a1d3e738f5,175939f954a9fbd5bff11db8a2580249f95052cc47ff59dce298420a5d9cb881,1199119915,952678156,(749)-913-8744,(465)-588-8905,243-24-2401,http://api.randomuser.me/portraits/women/0.jpg,http://api.randomuser.me/portraits/med/women/0.jpg,http://api.randomuser.me/portraits/thumb/women/0.jpg,0.6,US +male,mr,hector,kim,"7211 edwards rd",charlotte,tennessee,76984,hector.kim89@example.com,lazywolf944,pounding,cQkB5maa,415fd1ff6c481c8cd1103acfa0a37f86,660daea5b2695b9b90430804943a34cb844b337b,31583768a276cdc242c080b3eedc4145e6f83db7cb9c086fcdef7e4a8f408823,1192555743,628928613,(996)-664-2606,(483)-110-1420,599-15-8288,http://api.randomuser.me/portraits/men/5.jpg,http://api.randomuser.me/portraits/med/men/5.jpg,http://api.randomuser.me/portraits/thumb/men/5.jpg,0.6,US +female,miss,caroline,anderson,"1960 timber wolf trail",manchester,virginia,31860,caroline.anderson46@example.com,blueladybug663,commando,3gpsKKBU,ce5c64b6e83c439b9bc7ce23a38b0418,1e913a3291f7339aad369f55e7f2cc983dcff33d,8b62eae8d935ba4b0da77dd4cbe4d9935323aa545d4826fda5997ceb4d4cf303,1055962874,34796612,(575)-266-8947,(531)-487-4713,897-63-2145,http://api.randomuser.me/portraits/women/2.jpg,http://api.randomuser.me/portraits/med/women/2.jpg,http://api.randomuser.me/portraits/thumb/women/2.jpg,0.6,US +female,miss,kristen,fernandez,"6889 cherry st","fountain valley",minnesota,63574,kristen.fernandez16@example.com,heavykoala147,trustme,loNsZQ50,83a2044ffef1222af041d45c9c9b0a08,2f874e1e069cd992922eee44696f821af8361247,0e6f3f922c896e128da8cf33ea2c6b8a8dd1aba2bfae066848cace2dcf4a581c,1244648751,865351426,(437)-854-5502,(478)-845-5941,535-84-8264,http://api.randomuser.me/portraits/women/63.jpg,http://api.randomuser.me/portraits/med/women/63.jpg,http://api.randomuser.me/portraits/thumb/women/63.jpg,0.6,US +male,mr,noah,romero,"6470 smokey ln",norwalk,massachusetts,59881,noah.romero53@example.com,lazyfish815,chemical,45nlsBts,d775c72edca0c55819516893e5669678,1f6185ddb6bbc0d35be4e9485b3c84d4ef196126,ecfae0811875736d50c897096463206b481698ac3d75248607c72f78d022993d,1336440396,698391247,(629)-658-2638,(975)-499-1620,465-31-9619,http://api.randomuser.me/portraits/men/71.jpg,http://api.randomuser.me/portraits/med/men/71.jpg,http://api.randomuser.me/portraits/thumb/men/71.jpg,0.6,US +male,mr,clayton,berry,"3110 lakeview st","broken arrow",tennessee,96556,clayton.berry18@example.com,organicbear811,ou812,kxJZsfnf,859539b7a3aa0b4fe7b3fae6c6d3a4f4,27466bb59a4b95f0a3e1d3764488cba6f4d020f1,c0075e64cd19282ac71db1615e809f558bbeca5263fc8d3222e487624b4e1082,1366028843,782091804,(315)-880-3470,(347)-467-5381,434-11-7085,http://api.randomuser.me/portraits/men/58.jpg,http://api.randomuser.me/portraits/med/men/58.jpg,http://api.randomuser.me/portraits/thumb/men/58.jpg,0.6,US +male,mr,tim,mccoy,"7179 mcclellan rd",yonkers,maine,65238,tim.mccoy94@example.com,bigmeercat556,italian,P9DGypMt,dc3fce9665c25a0902f0e1b858bd72bc,9c76b1d66c48cd8abaa37fb3dab087610ec749f0,f8b7b8d9deb6ba1fca661a797a5a3e872bd3399cfdc9dfa7136f98c5f0d702aa,1117236342,667526332,(326)-225-7424,(138)-290-7618,374-19-7497,http://api.randomuser.me/portraits/men/75.jpg,http://api.randomuser.me/portraits/med/men/75.jpg,http://api.randomuser.me/portraits/thumb/men/75.jpg,0.6,US +male,mr,jimmy,anderson,"6456 fincher rd",pittsburgh,"west virginia",10331,jimmy.anderson49@example.com,smallwolf688,warren,YZRSPbeh,2e8b69be65987c1b46a7bf514e1defa6,aa7ba1a4b815cbf82bfc5057e5785e4a86529982,f2e494782fb8778ca8b397019c608d4676a95405241841b5fc5332d9aad65805,1150486705,1071210591,(900)-417-3053,(238)-249-8934,976-54-3849,http://api.randomuser.me/portraits/men/87.jpg,http://api.randomuser.me/portraits/med/men/87.jpg,http://api.randomuser.me/portraits/thumb/men/87.jpg,0.6,US +female,ms,bella,day,"1947 mcgowen st",thornton,"west virginia",37063,bella.day80@example.com,organicfrog708,unknown,biXD1JZx,64ed2b63480f4f1cb87417601c810996,a05f369692fdb93b655c3f7ee01df47acbce7630,ff4a8e546228c074a462e6cb2b258f08206506bb3b70fe176e705c9e520f4337,1172909894,976373539,(383)-531-2748,(457)-751-4343,536-83-3760,http://api.randomuser.me/portraits/women/69.jpg,http://api.randomuser.me/portraits/med/women/69.jpg,http://api.randomuser.me/portraits/thumb/women/69.jpg,0.6,US +female,mrs,emily,hart,"1499 walnut hill ln",corona,arizona,98787,emily.hart78@example.com,bluepanda285,fubar,pnlKns7W,0a556579c7476790f66888e5cf9abb3e,40fcd24e3e7a01807c7d5eb873be62a1cdcfa5c5,39f9b9776ac21903c5d14fd539a5b6103d85861327de48031b5e2c37f1dadc9c,1032429573,1161811189,(258)-320-8548,(540)-134-8379,555-25-1265,http://api.randomuser.me/portraits/women/80.jpg,http://api.randomuser.me/portraits/med/women/80.jpg,http://api.randomuser.me/portraits/thumb/women/80.jpg,0.6,US +male,mr,luke,harrison,"3509 w dallas st",elgin,louisiana,34784,luke.harrison22@example.com,bigcat486,cottage,fOSGCWKS,e3ba12f68cc54b3ef0ddfd1bad704254,8eb7e583b49b3d8131ced22656bd7626a715824b,0dfd4489c397811e8b6867c74a7ccef88a60e248eb414e69a947415717780b29,1354950916,1136264663,(140)-102-4732,(962)-148-9134,969-88-6871,http://api.randomuser.me/portraits/men/71.jpg,http://api.randomuser.me/portraits/med/men/71.jpg,http://api.randomuser.me/portraits/thumb/men/71.jpg,0.6,US +male,mr,hugh,hanson,"1054 brown terrace",norwalk,minnesota,67363,hugh.hanson25@example.com,blacksnake518,tulips,CUu74yUt,abb951218a82c69b8a91e46063343ce2,dc017f22b15a7af40e6dfcbab98adeb99c4124e5,cf591f02d8b6eb122b2fd57124ed0a4b0ab93e66f885bf86a3b681a54b070134,1344090181,991538023,(983)-923-3639,(825)-661-7939,318-95-1039,http://api.randomuser.me/portraits/men/45.jpg,http://api.randomuser.me/portraits/med/men/45.jpg,http://api.randomuser.me/portraits/thumb/men/45.jpg,0.6,US +female,ms,emily,sanchez,"4890 preston rd",bakersfield,georgia,85633,emily.sanchez84@example.com,greencat523,dale,VsFIW4jp,e04da9efe6d028133081402ebb80e444,866fba5fade97cba8d86354b85137a4eb072dbe3,38e58f40298d2ea058650dd181d2af16219b9bd697ff6e32f258f10e280c3734,1380430936,1251455199,(256)-144-2296,(740)-146-5816,397-10-5787,http://api.randomuser.me/portraits/women/70.jpg,http://api.randomuser.me/portraits/med/women/70.jpg,http://api.randomuser.me/portraits/thumb/women/70.jpg,0.6,US +female,miss,susan,rodriguez,"1822 fairview st","round rock",alaska,76949,susan.rodriguez40@example.com,yellowgorilla1,qwer1234,JvJgSORP,fc407a875ffc59973f5f5cef7b5afa5d,1a26cd683930b7d4db3873ab89e1d8819f322798,b4ccb246a4e1e1286240649f2fed5ec6fc7dc5fe32bb44884b53dfa785e39968,990851244,393440190,(529)-533-6112,(139)-810-5916,177-26-3831,http://api.randomuser.me/portraits/women/74.jpg,http://api.randomuser.me/portraits/med/women/74.jpg,http://api.randomuser.me/portraits/thumb/women/74.jpg,0.6,US +female,ms,claire,caldwell,"8662 paddock way",evansville,montana,41994,claire.caldwell50@example.com,bluebird342,ibanez,8LkNZM6o,b2d0a631daed61afbe6a6465b9602b1a,d72cda25447ac1f074757c41bd5e4cc2b6e086e8,154dcbf5a2716c93255e7e466f1fd4ddd34be679f132a97a894d8dd23db2709e,1106948775,24640160,(153)-630-2616,(178)-758-5854,895-25-6678,http://api.randomuser.me/portraits/women/68.jpg,http://api.randomuser.me/portraits/med/women/68.jpg,http://api.randomuser.me/portraits/thumb/women/68.jpg,0.6,US +female,miss,pamela,berry,"4479 royal ln",palmdale,hawaii,92296,pamela.berry75@example.com,beautifulleopard110,tara,z0tKHIw8,9119ef2b20f5f958bb33214bc04d7190,4c29701a43d433dc7eba8c9ad9625e8f2caf84d0,ab98d6d0f00b49a66de75035f780e8184d93693205fce7ea1f95c6cf909583ea,946289153,251541519,(885)-292-7980,(332)-469-4239,929-78-3921,http://api.randomuser.me/portraits/women/89.jpg,http://api.randomuser.me/portraits/med/women/89.jpg,http://api.randomuser.me/portraits/thumb/women/89.jpg,0.6,US +male,mr,tristan,hoffman,"3300 preston rd",gresham,ohio,76540,tristan.hoffman39@example.com,blacklion240,tsunami,sKdWiNWL,3aaa4aa9b982ae502e793ecd449faec1,8195ea9a8cb0faabe3aa80eff886269808e300cf,95b7bb102386fe05cd38c0ce8a3400e9154b3306590ff1584193056960f82a3d,1020825454,1274573998,(904)-840-5410,(224)-362-1017,140-29-7293,http://api.randomuser.me/portraits/men/71.jpg,http://api.randomuser.me/portraits/med/men/71.jpg,http://api.randomuser.me/portraits/thumb/men/71.jpg,0.6,US +male,mr,willard,garza,"6443 pockrus page rd",sacramento,delaware,54670,willard.garza27@example.com,brownmouse622,aikman,COfLVyaP,8845c5fddcac67cc8e2a685b7d586303,39cded85214a4ea998d2f0464016c5d5ee2bba88,9f0e696906e17dfcee5987aa9ce194d77c008884def23d0345fb28a97ab91da9,1276229954,669165142,(273)-873-3822,(824)-633-3134,299-66-7450,http://api.randomuser.me/portraits/men/94.jpg,http://api.randomuser.me/portraits/med/men/94.jpg,http://api.randomuser.me/portraits/thumb/men/94.jpg,0.6,US +male,mr,wayne,myers,"4931 marsh ln",stamford,kentucky,64485,wayne.myers92@example.com,whiteswan355,indon,TxccNHwm,6ebd09cbe34d9c50309dbc2b9d63a54a,4081e8d49303d6e392ff02438152bbf749bad320,65f6f946ee1e6108cc05f30c9b26e896920c1d409d6ad3b9a189cc8229207230,1163005470,1209013445,(868)-650-9615,(501)-234-1342,370-45-4556,http://api.randomuser.me/portraits/men/51.jpg,http://api.randomuser.me/portraits/med/men/51.jpg,http://api.randomuser.me/portraits/thumb/men/51.jpg,0.6,US +female,mrs,gertrude,barrett,"1027 stevens creek blvd",duncanville,nebraska,44591,gertrude.barrett92@example.com,beautifulsnake136,villa,IwDTXidY,a8c077583a6a0a1d640817bed9914f73,17ed440295aa647c364ca7bb43d7f740286ed197,f776b91f75c8c4699e2b5a56a7cac92e4a2a0ee5a7535a5b89c595ff785aff68,1219336011,131289174,(303)-646-8750,(809)-186-7225,835-31-3667,http://api.randomuser.me/portraits/women/77.jpg,http://api.randomuser.me/portraits/med/women/77.jpg,http://api.randomuser.me/portraits/thumb/women/77.jpg,0.6,US +male,mr,herbert,graves,"4191 washington ave",houston,idaho,26738,herbert.graves32@example.com,silverlion996,markus,gasgm1N3,54012b310dc57da4d57d5e942646af44,1a95bcf5f3a30279c5294c2b82ab89b738ec8d11,22b3c3ff7d53f7720aebb06c1c20de341265c218f193fca20e96e4ae6e51d0ef,1200137796,756041971,(978)-548-4668,(517)-512-8828,239-93-1173,http://api.randomuser.me/portraits/men/2.jpg,http://api.randomuser.me/portraits/med/men/2.jpg,http://api.randomuser.me/portraits/thumb/men/2.jpg,0.6,US +male,mr,mario,mitchelle,"7969 nowlin rd","santa rosa","new york",41328,mario.mitchelle25@example.com,crazygoose215,homerun,8tMW5anR,3e5bcd1dd8c5f3e26f787cce5d6f59ff,106a00eebc7907cba3b09433b44f9335f196087a,8bef1f3365c115c542fb154ba2954d45906c9079ae8ff93ebcbd37dbcf928af2,1189299771,479746567,(208)-616-3072,(725)-262-8332,533-96-8010,http://api.randomuser.me/portraits/men/70.jpg,http://api.randomuser.me/portraits/med/men/70.jpg,http://api.randomuser.me/portraits/thumb/men/70.jpg,0.6,US +male,mr,tyrone,craig,"7142 samaritan dr","round rock",michigan,74031,tyrone.craig72@example.com,lazylion680,nathanie,AMQ0wBUt,9dbef96795a8098b44b96a372ef40acd,edb99d2860d69d52ae2a11599b47a4d51ff358f3,41c9900babec1d0b672a9e170a4d84d05ac5813612fd6108ddd96e053c1b635c,1419891839,1391633219,(108)-340-8890,(808)-777-6518,841-89-6928,http://api.randomuser.me/portraits/men/84.jpg,http://api.randomuser.me/portraits/med/men/84.jpg,http://api.randomuser.me/portraits/thumb/men/84.jpg,0.6,US +male,mr,patrick,palmer,"7310 e little york rd","south bend","north dakota",34708,patrick.palmer62@example.com,silverdog21,mexican,4TINY1y7,262b7121f5bc7b101c0e22c5689b0786,d14acfcd9bf4099a9cdee44a47da2c6a9cab702f,f7f9cfa5634ad55ef4abfd10238d9290e76248d611c848e307267fade5f8ff50,947381164,486552554,(124)-215-3462,(886)-306-1957,539-67-5923,http://api.randomuser.me/portraits/men/47.jpg,http://api.randomuser.me/portraits/med/men/47.jpg,http://api.randomuser.me/portraits/thumb/men/47.jpg,0.6,US +female,ms,carmen,lane,"1527 e center st",abilene,illinois,80909,carmen.lane14@example.com,lazypeacock565,manny,2hchszdL,dfca201be09e1b2092f3a48a4c1b4130,8241ea808c2c82ba8695cf5bfea6895dadf7b04f,c5e4662cc99b92cf2f122241dfa567b940344656b80bf246d10eba15764777ed,1313861967,989955338,(989)-967-3597,(505)-788-5453,582-54-3711,http://api.randomuser.me/portraits/women/66.jpg,http://api.randomuser.me/portraits/med/women/66.jpg,http://api.randomuser.me/portraits/thumb/women/66.jpg,0.6,US +male,mr,maurice,riley,"6142 spring hill rd",honolulu,massachusetts,94684,maurice.riley38@example.com,yellowpeacock862,changeme,a0O33ead,2cb5c5cdec3d08edd04e7e672db050ca,a00148d0a14ebee96ef337073563688a1397157f,d0b14e60b7cb711ebdf764a9581883f81ece6c8a648857a2124cb6e99f080a59,1345911345,1216365584,(334)-221-6360,(447)-948-5202,496-40-2792,http://api.randomuser.me/portraits/men/37.jpg,http://api.randomuser.me/portraits/med/men/37.jpg,http://api.randomuser.me/portraits/thumb/men/37.jpg,0.6,US +female,ms,jill,bailey,"8414 hamilton ave",louisville,nebraska,19907,jill.bailey50@example.com,blackwolf815,stafford,SrzxSK9c,e9b0c713ec89cca83ce9dbf480f53b2e,e86dc0b3214416889aa7fc88c919ad98d25ac232,680806b1ed2089c17d71b4a87c820107cd2305810037bb6a97b067ff6c722488,1291532620,966320134,(751)-336-6517,(348)-902-7017,698-73-5355,http://api.randomuser.me/portraits/women/62.jpg,http://api.randomuser.me/portraits/med/women/62.jpg,http://api.randomuser.me/portraits/thumb/women/62.jpg,0.6,US +female,ms,juanita,edwards,"9221 oak lawn ave","cape fear","south carolina",85297,juanita.edwards32@example.com,goldentiger982,1030,1suO0P7U,7ea79997bf635bd3815600eae5a7e357,79980494059bcfc7f739243dcbb048dc95c29234,b6ba8b8920fdb468d154716d4e253014e7b8e07c5c7dde176ad94bee7a02249c,974859743,792732288,(269)-533-4047,(425)-258-6626,869-99-4961,http://api.randomuser.me/portraits/women/71.jpg,http://api.randomuser.me/portraits/med/women/71.jpg,http://api.randomuser.me/portraits/thumb/women/71.jpg,0.6,US +female,mrs,deanna,simpson,"3998 w gray st",killeen,oklahoma,52604,deanna.simpson83@example.com,organiccat217,madcat,19ZDMnMM,f8bfaaedb8dc29035eaa93f087b5ca0d,1b97dff995b378498932db9f1e34e8af8fb24294,b33ccad4bd0d4918bf42724efcba09e37eaa1c78c4effcec9f941965d589f29e,1204649966,830406350,(656)-706-8216,(618)-601-4262,733-73-3077,http://api.randomuser.me/portraits/women/79.jpg,http://api.randomuser.me/portraits/med/women/79.jpg,http://api.randomuser.me/portraits/thumb/women/79.jpg,0.6,US +female,miss,irma,thompson,"6574 locust rd",mesa,"north dakota",68249,irma.thompson92@example.com,tinyfrog990,cristina,AVR8mJ5m,a89cd1d6c42d2c3bf55632aed0f4ad4d,9d9084f7cceb4961b4f56c544125a4576e79fb15,90054cab15fbb7f355e5a6eef129cd481eaa54ca217309d4311513fe071628d8,1155834446,1102828289,(951)-568-9134,(640)-440-2490,263-38-7275,http://api.randomuser.me/portraits/women/24.jpg,http://api.randomuser.me/portraits/med/women/24.jpg,http://api.randomuser.me/portraits/thumb/women/24.jpg,0.6,US +male,mr,gabe,payne,"3007 w sherman dr",rockford,arizona,97469,gabe.payne46@example.com,organicladybug188,tower,VoBIp1mi,72b5d568c474d74b10dbd770e106c6c4,4a1cb40df535eda9fb01642efde129607da8579b,e539168db33ec02f81ff2c1841050612262b4f70f26e6127dad76b39b8dd988f,995675226,708602567,(898)-781-1999,(480)-511-5851,505-34-7304,http://api.randomuser.me/portraits/men/75.jpg,http://api.randomuser.me/portraits/med/men/75.jpg,http://api.randomuser.me/portraits/thumb/men/75.jpg,0.6,US +male,mr,gabriel,armstrong,"2352 northaven rd",dumas,kentucky,38681,gabriel.armstrong17@example.com,ticklishmeercat677,volcom,4m9nCT8L,f5c9d3bb8a9c13ce67c72d0d9966590e,bfc4c632925b231661b43ba520cfded2341cf3c6,1fe3e15251298b97282f7d4868f9f6622d1e51b48d5aab9e51b15a718729cf26,1292904407,1321945000,(902)-597-2795,(379)-536-4437,402-16-3599,http://api.randomuser.me/portraits/men/76.jpg,http://api.randomuser.me/portraits/med/men/76.jpg,http://api.randomuser.me/portraits/thumb/men/76.jpg,0.6,US +female,miss,alexa,davis,"6185 w sherman dr",clarksville,"new york",53116,alexa.davis41@example.com,bigbear685,milton,f234x78r,6546359379a517b1662113a52ff2bc29,703edf5a4ad3533e0f5cebb9ab979ddaa7b845b7,8d7f35d676a981307f4a95bc55e98fbd17c08486dd03769b68ba6f36d70e1581,1398981147,362852667,(433)-353-8723,(898)-966-4948,646-52-2067,http://api.randomuser.me/portraits/women/91.jpg,http://api.randomuser.me/portraits/med/women/91.jpg,http://api.randomuser.me/portraits/thumb/women/91.jpg,0.6,US +female,miss,jeanne,lewis,"3186 e north st","farmers branch",maine,32346,jeanne.lewis50@example.com,yellowswan142,calvin1,cIiewuky,94fa03414140c81bd0b4df764c44a6ba,05381318cdd62f0fe71f6a97480909ba27b53414,4dafbd8a6e7719d9e2c5dbe0c76950a08320b1f1936362a2dfdefc9ee9c87f0a,1125566206,573849301,(693)-121-9219,(318)-703-5895,154-53-9832,http://api.randomuser.me/portraits/women/95.jpg,http://api.randomuser.me/portraits/med/women/95.jpg,http://api.randomuser.me/portraits/thumb/women/95.jpg,0.6,US +male,mr,lonnie,dixon,"3706 westheimer rd",philadelphia,vermont,75640,lonnie.dixon65@example.com,purplegorilla464,eleven,Vxbt6Zx0,69aeea6dfa0ef37bf820c9840fc528a1,d152309053f6de7d2b1eb5aba212ba5443fa47c0,8338b514433b4675734369678cf1b4a57c42e2e6c0834381e3309be374bd51eb,1412560240,89329377,(545)-848-5058,(529)-486-2986,222-58-9245,http://api.randomuser.me/portraits/men/67.jpg,http://api.randomuser.me/portraits/med/men/67.jpg,http://api.randomuser.me/portraits/thumb/men/67.jpg,0.6,US +male,mr,tony,morrison,"6175 thornridge cir",altoona,"south dakota",91693,tony.morrison20@example.com,crazyladybug736,puffy,dv2vG28S,aa43e49ce57dcbd8467eef3b8d133daa,3169c64a906ef1cc021e5ca1f435428a5cf381b3,dab74d2a9a101c9636a38e47492724e5a028251dfbeb01dfb37f8ae20bc82bb3,985242082,407994544,(984)-149-4694,(130)-257-7594,705-52-7356,http://api.randomuser.me/portraits/men/15.jpg,http://api.randomuser.me/portraits/med/men/15.jpg,http://api.randomuser.me/portraits/thumb/men/15.jpg,0.6,US +female,miss,stella,powell,"8056 hillcrest rd","coral springs",alabama,34115,stella.powell42@example.com,ticklishlion645,conan,sR1LPzq0,f4f4ce8b44e0f47924008cfd57fada94,99a340120c771fb496e302d031ba12a9d8197650,25d3874c9c19a8d07367fa8e424024feefed0bfc18f6e948632c80fba0c0d538,1264407130,504300027,(794)-346-2580,(497)-504-6007,713-54-9412,http://api.randomuser.me/portraits/women/12.jpg,http://api.randomuser.me/portraits/med/women/12.jpg,http://api.randomuser.me/portraits/thumb/women/12.jpg,0.6,US +female,miss,heidi,hamilton,"4855 lovers ln",burbank,michigan,23737,heidi.hamilton37@example.com,purplekoala693,ziggy,fKrt0jxu,d33c3b1ec035aa25f61886c055f931a5,79ee1d50c96292460a236711157fb5ac6fcb4627,bf917c4c9b8fcee4184dd4c858d47e6a6164280746063fb71aef6a1f4000f80d,1333804984,931998008,(855)-708-4263,(246)-797-1854,547-45-9471,http://api.randomuser.me/portraits/women/63.jpg,http://api.randomuser.me/portraits/med/women/63.jpg,http://api.randomuser.me/portraits/thumb/women/63.jpg,0.6,US +female,ms,brandy,rodriguez,"4441 royal ln",ironville,delaware,76273,brandy.rodriguez67@example.com,whitepanda668,hilton,HeHJvfSi,d86c7a3a9954e0f299c8d860cf25ca1d,216ca90d00a13d2f06cccdca25e517d9cc8fa2c6,047a7d182ecb5f308a350eb7343a56285023f49405da5a28635941fafc6e89d1,1193949519,1056237962,(166)-123-2282,(155)-479-3225,569-93-3749,http://api.randomuser.me/portraits/women/51.jpg,http://api.randomuser.me/portraits/med/women/51.jpg,http://api.randomuser.me/portraits/thumb/women/51.jpg,0.6,US +female,miss,tracey,curtis,"4178 pockrus page rd","port st. lucie",alaska,98089,tracey.curtis59@example.com,browngorilla568,whocares,59BchmMV,202e2d1db5e8bd7bb9a74cdb82a3d29c,8a8c1e76f22686fd6c7f340744bf3c034fa68032,27135ee67639e60d70f615898030ebc072d75a577fcf4098ac02ba28607b4a33,1287538747,639865619,(387)-223-5866,(988)-686-9457,313-51-8932,http://api.randomuser.me/portraits/women/8.jpg,http://api.randomuser.me/portraits/med/women/8.jpg,http://api.randomuser.me/portraits/thumb/women/8.jpg,0.6,US +female,ms,dianne,moreno,"9993 hillcrest rd",stanley,ohio,93542,dianne.moreno52@example.com,brownfish334,webmaste,FBoRBgi3,f318876d297ad256a4667533080cb4a5,b6211d2fd3d092d0234183eaf9edd79c3fd255e2,7f3601c5fe3020d8cb4696e7329e64f4ff7df0074cb8580f8a5f185e385f21a9,922302854,282267133,(826)-219-6186,(103)-187-4199,236-37-8171,http://api.randomuser.me/portraits/women/29.jpg,http://api.randomuser.me/portraits/med/women/29.jpg,http://api.randomuser.me/portraits/thumb/women/29.jpg,0.6,US +female,ms,diana,vargas,"1775 shady ln dr",buffalo,wyoming,46988,diana.vargas29@example.com,orangepeacock935,buddah,pm5YP3bj,bb963f31d9e98473dd941fc3eababac0,faeae44b98d6095eaf09d75ede3d3129f2117a47,0506fe317d68a7180c9f3fba96ee7ace4fb2bf462b60ccd0317b1779facfaee6,1167080618,958899130,(175)-217-4440,(851)-155-7358,119-16-1105,http://api.randomuser.me/portraits/women/58.jpg,http://api.randomuser.me/portraits/med/women/58.jpg,http://api.randomuser.me/portraits/thumb/women/58.jpg,0.6,US +female,miss,candice,steward,"7855 adams st",athens,california,83015,candice.steward25@example.com,bluemeercat952,seminole,AoIYCXQS,91bbf256593be41d00e2e31ddb175260,df73b36f82235a785649e1f58278b15b0dad4611,7e1f8657c79f406daf220dd3bd4eec85c1cb7f9b94baf3e01ba644f1e526786b,1215462452,356738400,(529)-788-8777,(168)-319-4497,748-27-5701,http://api.randomuser.me/portraits/women/52.jpg,http://api.randomuser.me/portraits/med/women/52.jpg,http://api.randomuser.me/portraits/thumb/women/52.jpg,0.6,US +male,mr,daryl,torres,"8481 rolling green rd","cape coral",tennessee,83732,daryl.torres78@example.com,smallwolf129,slave1,KBGuRYy1,540b68e1ff1344a902b9c4d6dfcb54f9,c454b032ed6ab8c39fe6e90855fa66099dcd3117,28f1c07cdbd17a6ce060884d3be62fd3fd967bf828573e937f7f0a2748e2720b,1380317243,637451663,(947)-105-3786,(233)-261-3775,792-64-8497,http://api.randomuser.me/portraits/men/10.jpg,http://api.randomuser.me/portraits/med/men/10.jpg,http://api.randomuser.me/portraits/thumb/men/10.jpg,0.6,US +male,mr,elijah,stewart,"9639 wycliff ave",sacramento,connecticut,67912,elijah.stewart12@example.com,organicfish456,bong,jALQYEOU,2568d8f6453d43229dfe962bd2e8d9ac,063315114f3f9dabf36e6b4331ffba3ea93ab5c6,a0483dea8d640af9473328fe4733d8b86b77bf641a4768fdd712c1ac88075935,1009192957,53191226,(936)-657-7390,(889)-907-7738,667-71-4382,http://api.randomuser.me/portraits/men/44.jpg,http://api.randomuser.me/portraits/med/men/44.jpg,http://api.randomuser.me/portraits/thumb/men/44.jpg,0.6,US +female,miss,crystal,shelton,"4092 camden ave",dayton,oregon,15991,crystal.shelton91@example.com,organicdog29,chivas,x4dseIRy,32910e4a96c090a1fe761232c25d5094,ef8f0b02e3bd604c7e444304369a80570e982b32,5925020c32f5e0305a88b8be33f541a4943b69219e38d31ef53753b63be37a24,1095007324,1234497503,(271)-612-8342,(980)-140-2366,404-98-4911,http://api.randomuser.me/portraits/women/38.jpg,http://api.randomuser.me/portraits/med/women/38.jpg,http://api.randomuser.me/portraits/thumb/women/38.jpg,0.6,US +male,mr,kevin,perez,"9042 miller ave","santa rosa",maryland,27867,kevin.perez67@example.com,orangetiger267,mathew,WnVZ2y5C,a952810d414244f37a659e26544c6d46,33d831a964e6e35e942e72b8b03af22d4cf6b6b5,98773e081dbfe2ea8c5e6eb71857546133778ae90743b2d8a6f2830fde569bd6,942117718,1416242948,(415)-598-6985,(713)-926-7467,435-30-5244,http://api.randomuser.me/portraits/men/42.jpg,http://api.randomuser.me/portraits/med/men/42.jpg,http://api.randomuser.me/portraits/thumb/men/42.jpg,0.6,US +female,ms,miriam,gomez,"9036 shady ln dr",odessa,"north dakota",40041,miriam.gomez58@example.com,tinyswan404,4417,i6YVKegZ,fa495caf9a42915142addced84472de0,2dc049471013037c71cb46bb9dbf796160ec3f40,1de877b41ec61cda5804d2bb165ee6ca853e35989428332a7b1bf381573acf46,1182954092,237115559,(538)-210-8588,(472)-502-9034,300-45-2481,http://api.randomuser.me/portraits/women/26.jpg,http://api.randomuser.me/portraits/med/women/26.jpg,http://api.randomuser.me/portraits/thumb/women/26.jpg,0.6,US +female,ms,ella,hansen,"2013 cackson st",roanoke,pennsylvania,49349,ella.hansen75@example.com,crazypanda320,tootsie,50i2OJnO,7adc83c3486f4b65241ea254351d8b16,4ea4778265b39356e6c16212f122c9bd2e3c4457,9b5eaebd054100379c90a6425ea3c4c278d5aed167b5d1d1d029b8ff90a754f5,1229083426,1323549920,(582)-941-6560,(145)-205-1767,867-29-6127,http://api.randomuser.me/portraits/women/34.jpg,http://api.randomuser.me/portraits/med/women/34.jpg,http://api.randomuser.me/portraits/thumb/women/34.jpg,0.6,US +female,ms,veronica,burke,"2952 wycliff ave",york,illinois,46134,veronica.burke36@example.com,organicsnake206,russell,dDpiqcty,8e521f992c3f62295f7950d589447496,d7adb260695af9cfd7867deb9f54c96af8825b7a,823d9224e1927be0ff28d4756b44b51157df3f9cb33de842648bb9d44cd03921,1165834877,320837586,(335)-213-2888,(774)-405-6019,879-29-3836,http://api.randomuser.me/portraits/women/63.jpg,http://api.randomuser.me/portraits/med/women/63.jpg,http://api.randomuser.me/portraits/thumb/women/63.jpg,0.6,US +female,mrs,lori,garcia,"6456 nowlin rd","santa maria",utah,74746,lori.garcia50@example.com,brownbird538,smoothie,Up3ffKb1,fb7def9d46bf1d26de32b82099dd37c5,2403926c32ee7b7739cae2aa6bfb43f961e8d194,f566575b5903794b8d6833db921bfa531a5acab739c142713fcc06c08b712df2,1329845713,155519321,(717)-588-5114,(510)-675-7254,406-10-4854,http://api.randomuser.me/portraits/women/10.jpg,http://api.randomuser.me/portraits/med/women/10.jpg,http://api.randomuser.me/portraits/thumb/women/10.jpg,0.6,US +male,mr,connor,craig,"5140 nowlin rd","long beach",connecticut,17984,connor.craig98@example.com,bluesnake931,pass1234,JOfZ5DCj,92b85be1ea242956bf75fb0e7c0d21e4,b7349731b3dfcd12a0872b76ee55b50c2f73f062,09e07f7b304567c76a314b5936962c194f9d8db72fc30de7f6983de3edd7708b,1149428991,648859685,(208)-139-2049,(589)-952-3849,479-91-3520,http://api.randomuser.me/portraits/men/34.jpg,http://api.randomuser.me/portraits/med/men/34.jpg,http://api.randomuser.me/portraits/thumb/men/34.jpg,0.6,US +male,mr,jack,schmidt,"8111 marsh ln",westminster,louisiana,57961,jack.schmidt15@example.com,purplecat458,shun,1fZRlHNc,7097579438ef39eee5acfb5fd3758716,50dc0dfb0b3fb80e4e879525e593e15b8a6c4e9d,272395b89d8ed22337732d96a0a9fa53e0e5bddc3017cb0c6db0ce69c069944a,1134660803,775250798,(223)-267-3271,(871)-801-2210,807-96-7450,http://api.randomuser.me/portraits/men/26.jpg,http://api.randomuser.me/portraits/med/men/26.jpg,http://api.randomuser.me/portraits/thumb/men/26.jpg,0.6,US +male,mr,arron,moreno,"5385 dogwood ave",gresham,"new york",14017,arron.moreno64@example.com,orangeswan14,seven7,Eiy4AxQ9,c75807670fbd7edfd8bcb49453ae18a6,69cf443c36a8ba8e80d10096a251269446e42934,9ca7a7415e46ddb64b6ca73b9378caa3e5951988e1446996447654871154d8ac,1147346985,129231146,(371)-574-4338,(829)-868-6381,643-14-4095,http://api.randomuser.me/portraits/men/18.jpg,http://api.randomuser.me/portraits/med/men/18.jpg,http://api.randomuser.me/portraits/thumb/men/18.jpg,0.6,US +male,mr,jordan,carter,"9910 edwards rd",buffalo,wisconsin,17196,jordan.carter49@example.com,bluegorilla487,pierce,PPWS8J0F,cc3d5079acdae946c58f99da4fa2adea,5a35210f2d11d44e38fe7dfa6832c96af3f22ea4,9842674b461fd9894c77fc9c054ae5a962b999bbb2c00387161a168d060f25d5,1202481702,1264117424,(250)-586-5112,(171)-506-9355,424-38-7868,http://api.randomuser.me/portraits/men/50.jpg,http://api.randomuser.me/portraits/med/men/50.jpg,http://api.randomuser.me/portraits/thumb/men/50.jpg,0.6,US +male,mr,harry,oliver,"2329 dogwood ave",buffalo,connecticut,83424,harry.oliver32@example.com,brownrabbit293,1942,JGnSPhhS,79f7ccc8d08dfeeeea772367ac22598f,2ee571c2c09cbb83b0a9d820edb4a1229bd07a16,3678def45cb47b2020a95bde32c37a3f0e9c60449154cb9828ccf52582ac0405,1404250411,833831293,(984)-680-9230,(607)-143-2992,686-14-3098,http://api.randomuser.me/portraits/men/16.jpg,http://api.randomuser.me/portraits/med/men/16.jpg,http://api.randomuser.me/portraits/thumb/men/16.jpg,0.6,US +male,mr,edgar,fields,"3764 w pecan st",mesa,massachusetts,46207,edgar.fields58@example.com,organicbear320,larry,R0v3Yk4p,99612b196d48436ebc711cad0ce1b922,06f53adfa51ccd50159ab89956fe6b4e2f3f4919,7e118194de91f5d7624aeabfab3efdc20de6a1c6e22b923f8697c72df5427aa2,1027100768,1047472919,(135)-916-4891,(824)-335-9805,115-87-8411,http://api.randomuser.me/portraits/men/28.jpg,http://api.randomuser.me/portraits/med/men/28.jpg,http://api.randomuser.me/portraits/thumb/men/28.jpg,0.6,US +female,miss,andrea,montgomery,"7849 country club rd",bueblo,"south carolina",38978,andrea.montgomery15@example.com,silverswan279,roberts,8GSr3Z7j,09a80daf59b185bfd835fa9bab699dcd,9ad21649d6c5ae3d9a554fc19956dd1940ff7e58,684d37bf7d1574457e3e963ccbca32689e61fc2a615670945523694908b51c5e,1081892723,1341014693,(397)-566-5014,(249)-938-5964,437-73-5798,http://api.randomuser.me/portraits/women/39.jpg,http://api.randomuser.me/portraits/med/women/39.jpg,http://api.randomuser.me/portraits/thumb/women/39.jpg,0.6,US +female,mrs,april,lynch,"6334 hogan st","rio rancho",wyoming,24546,april.lynch45@example.com,blackelephant847,bermuda,Z92IPrfD,bbf2d30e5122373797bf3e1b8f28762c,3047f34c63a652147d7f351c981bb242cd17c85c,fd781697afcad7cdcbc7b7898edf0da534efb12119cf4423d984236bce07923a,1077030661,17483543,(456)-716-9376,(588)-926-5831,998-49-7132,http://api.randomuser.me/portraits/women/37.jpg,http://api.randomuser.me/portraits/med/women/37.jpg,http://api.randomuser.me/portraits/thumb/women/37.jpg,0.6,US +male,mr,roberto,bates,"6404 westheimer rd",vernon,"new jersey",57426,roberto.bates93@example.com,lazymouse254,morris,5DYWNc20,3e11f09f05fe3f770c6658b13c9f5122,9452213686208a28b8d68fd90f9e67b463ff8a3b,dc0ac2d737181610ae2547ec807548b73956a3baecc9626ccc6beeeda9b5dcc3,943309598,313807318,(274)-258-7657,(278)-605-6436,941-81-3066,http://api.randomuser.me/portraits/men/27.jpg,http://api.randomuser.me/portraits/med/men/27.jpg,http://api.randomuser.me/portraits/thumb/men/27.jpg,0.6,US +female,miss,leslie,taylor,"9496 w 6th st",gilbert,minnesota,22218,leslie.taylor74@example.com,blueelephant911,hellas,mCjNWkXE,1d3cc88f82e7c47804d266f3d997f977,8c1e1c372821b1b80a72c214299dc5e6fd3694f4,5ae39292b5c4172aed65b9e3c49da9b1c714793a4c5406505ab4b62911aeca18,1224024274,1157581891,(912)-330-3542,(177)-422-1813,780-48-2953,http://api.randomuser.me/portraits/women/96.jpg,http://api.randomuser.me/portraits/med/women/96.jpg,http://api.randomuser.me/portraits/thumb/women/96.jpg,0.6,US +female,mrs,nora,austin,"7666 green rd",visalia,"south carolina",34150,nora.austin32@example.com,biglion210,1313,fnCTr9XC,fde6ff4cce22c5ddf2203c9756d4b0b5,fcbdcae6cccf3057d1920a5d4a7ec7ad271c4684,0849cd04cca11b412b283f530a85832327b0ef05fc8c0cc92e7f427cf0f36bc8,1189467171,1285792851,(264)-361-8091,(782)-980-4234,328-84-2142,http://api.randomuser.me/portraits/women/59.jpg,http://api.randomuser.me/portraits/med/women/59.jpg,http://api.randomuser.me/portraits/thumb/women/59.jpg,0.6,US +female,ms,marilyn,hunt,"6841 sunset st","west jordan",arizona,60049,marilyn.hunt98@example.com,greenwolf109,boobies,bZQxLXJH,878edf7df5f4bd0ee5f1bc73f87aae5e,349ebdd4ffbb45e91aba79cf73cb04905c39ed69,65b752dd1d351430d075b6bbd497c2f764363989d9df71387f0c20bfb50d6de6,1187452324,789407524,(548)-777-1032,(271)-942-2017,419-46-9821,http://api.randomuser.me/portraits/women/77.jpg,http://api.randomuser.me/portraits/med/women/77.jpg,http://api.randomuser.me/portraits/thumb/women/77.jpg,0.6,US +male,mr,ben,richards,"7598 washington ave","pembroke pines",alabama,12751,ben.richards98@example.com,ticklishtiger388,eugene,CaQzT4ZK,dcc48791f39bb318fcfb517ed2e5ca0d,b94fe4e194e74f73933e1c74d1a5432b64062380,f8df66cf22fb6e5c976a866436095e16c81b23b95cf8d5ee1c4312fbb2611c36,958700497,544885924,(656)-928-8200,(710)-660-8473,388-20-7439,http://api.randomuser.me/portraits/men/51.jpg,http://api.randomuser.me/portraits/med/men/51.jpg,http://api.randomuser.me/portraits/thumb/men/51.jpg,0.6,US +male,mr,alfred,coleman,"1472 northaven rd",amarillo,nevada,27958,alfred.coleman39@example.com,purpleswan631,walnut,KcaMzfZb,7ea769af19c4fc094d9d234d8b2e7dd7,5d90389f14583922e24f3d4ecbb0956e50b89ec4,24ff526461d5a9b3969c2ebfb2d0888e23dbc33ffc634e21bec60fcb7f6f0243,1283974344,75524523,(947)-232-4214,(142)-412-9059,763-58-3060,http://api.randomuser.me/portraits/men/23.jpg,http://api.randomuser.me/portraits/med/men/23.jpg,http://api.randomuser.me/portraits/thumb/men/23.jpg,0.6,US +male,mr,mark,young,"5321 camden ave",allen,"north carolina",98575,mark.young67@example.com,blueostrich997,bogart,8bR1CsQe,b6ee2157f82d4046b833900548517352,cefd526a0d885909ff08f28931588835a417dfb3,b16b5c73bde56712b1138285b03292716c5dd9f181f5e92a862c1f83656bbc81,1411278978,1250364591,(313)-509-2459,(130)-349-6419,319-52-4814,http://api.randomuser.me/portraits/men/76.jpg,http://api.randomuser.me/portraits/med/men/76.jpg,http://api.randomuser.me/portraits/thumb/men/76.jpg,0.6,US +male,mr,willie,butler,"6484 blossom hill rd",modesto,montana,81403,willie.butler22@example.com,biglion603,incubus,UKMktfwp,d62b5f18afbde7301d8cd6ce85066774,46c1eb8debd4f07323a86d066d5e609660aeac69,e1393cad828fcad63cc0b82c28a4ebd70dc75e63fa924c5ce2c48a7926de779d,1431726644,112231455,(911)-468-9337,(947)-362-8226,551-71-2373,http://api.randomuser.me/portraits/men/55.jpg,http://api.randomuser.me/portraits/med/men/55.jpg,http://api.randomuser.me/portraits/thumb/men/55.jpg,0.6,US +female,mrs,louise,harrison,"9829 lakeview st",tempe,pennsylvania,46992,louise.harrison35@example.com,redbutterfly415,magnus,BwWfoOki,77775f6cc5cac5d01c38a45982de2b78,c22e4168293540f764a79acbebac45e1aadc8d68,93a1fe45513af30ab85b791fc1e37fadb3bcc921d1eaacfc7e334e5afab4c7d2,1303842133,566726094,(853)-422-9217,(748)-617-9938,858-78-4377,http://api.randomuser.me/portraits/women/75.jpg,http://api.randomuser.me/portraits/med/women/75.jpg,http://api.randomuser.me/portraits/thumb/women/75.jpg,0.6,US +female,miss,anita,torres,"9490 miller ave",kent,delaware,61415,anita.torres68@example.com,crazykoala117,galary,9bS1SBPj,12b25e27c76e7f2f36b1bea817455160,f0392027411b5fc46f27612b3258c7efc9904298,02dd56ef0ccc65a5f922602421e820b76ade678e40b564170d429ae93dbd6ada,1038271025,1349455004,(701)-306-3314,(567)-141-7597,457-54-3595,http://api.randomuser.me/portraits/women/90.jpg,http://api.randomuser.me/portraits/med/women/90.jpg,http://api.randomuser.me/portraits/thumb/women/90.jpg,0.6,US +male,mr,billy,watkins,"7035 lakeshore rd",shiloh,illinois,46204,billy.watkins96@example.com,lazymouse94,zander,yzPHAOwd,48d20c856a3967bbbf83e425639cfc03,3c9ac5157fb3d52868e9f3d1812b81ed31fa60c9,7f53ffae9883572f83bd40043bd47f8cea6961d444489b72737db645b5601ca2,948989105,311012253,(103)-591-9514,(944)-701-8456,329-16-9983,http://api.randomuser.me/portraits/men/89.jpg,http://api.randomuser.me/portraits/med/men/89.jpg,http://api.randomuser.me/portraits/thumb/men/89.jpg,0.6,US +female,mrs,rachel,carlson,"3302 cherry st",bozeman,indiana,25075,rachel.carlson45@example.com,orangebear159,nt5d27,0eIapOjH,81004983800a18f5eb3f85ac7e070e8b,2da80bf2da77c55e1b52bcc05d78afc336a0b381,2763451ea072e2d7801e3f3533f2c113515f2c7e62c09f00e85d7a64f9c9dc8e,1054699071,565361536,(272)-326-9587,(922)-425-3404,766-63-3440,http://api.randomuser.me/portraits/women/80.jpg,http://api.randomuser.me/portraits/med/women/80.jpg,http://api.randomuser.me/portraits/thumb/women/80.jpg,0.6,US +male,mr,bill,walker,"9356 fincher rd",waxahachie,kansas,26299,bill.walker65@example.com,blueleopard593,fred,u5sMN75A,666ca68291b0ce192ebcf2dadd27a1be,1ebbacd9a9d7d7c346402455e7c1af054914b36b,dee70e145510b840b00a2d26ac5c48f8f9750e300507e15f75311bdab9159388,1181224026,572460511,(505)-868-6021,(844)-170-8392,466-51-3210,http://api.randomuser.me/portraits/men/42.jpg,http://api.randomuser.me/portraits/med/men/42.jpg,http://api.randomuser.me/portraits/thumb/men/42.jpg,0.6,US +female,ms,kelly,collins,"2520 spring st",grapevine,hawaii,66901,kelly.collins14@example.com,greenkoala364,elvis1,i92cuUid,c4cb8536bf5986d04905309eda5eb73a,a760f4f435d696bcba79f6385555df9d3da5c739,fd617a593c7469caec4eac70289b98d74f1c3a18a9da662a4bd14c001a67953d,1016238794,508340202,(612)-131-3479,(182)-155-9536,365-38-1048,http://api.randomuser.me/portraits/women/78.jpg,http://api.randomuser.me/portraits/med/women/78.jpg,http://api.randomuser.me/portraits/thumb/women/78.jpg,0.6,US +female,miss,herminia,hunt,"3978 w dallas st",waco,"rhode island",36297,herminia.hunt19@example.com,smallbutterfly123,design,TE24idj1,551db5480b4a95fd4bd6618a6cf8d2e0,6f4b28126a32336651d1c32b48567299dc88ffca,a689850cfe2fed00f3bd24e75bb5b07ba72d2ed29974d7e571c1d0882d490602,1361391975,52579554,(693)-637-7382,(796)-546-6402,424-75-4974,http://api.randomuser.me/portraits/women/56.jpg,http://api.randomuser.me/portraits/med/women/56.jpg,http://api.randomuser.me/portraits/thumb/women/56.jpg,0.6,US +female,miss,sylvia,taylor,"3675 sunset st",lafayette,montana,81626,sylvia.taylor77@example.com,blackelephant691,flames,vlUzcgf4,c6f4840c8ad12c72311e96ae726655fa,a1ae6bc228170f5e162fc7309a275061ef9745e6,a6d13a08200adff21bcc7fbcb13a3cabd6bdd69a7bb7b8a784d73b3039eafe21,932277281,595808214,(179)-110-3480,(471)-875-7707,570-66-4157,http://api.randomuser.me/portraits/women/85.jpg,http://api.randomuser.me/portraits/med/women/85.jpg,http://api.randomuser.me/portraits/thumb/women/85.jpg,0.6,US +female,ms,jenny,edwards,"1872 parker rd",salem,"west virginia",66924,jenny.edwards77@example.com,bluedog349,sales,obLzRFsJ,48b72a66638c28d64818c8f9a634ff9c,1df8f76f883a2e86bee2ec4d4fc0f51ee937bfff,56cd37ac9c29e135e4a1f90e8c5517b063cb8474fba613da537a5e57b14d9eee,1090789621,856319197,(722)-920-1519,(702)-669-4970,516-19-7847,http://api.randomuser.me/portraits/women/40.jpg,http://api.randomuser.me/portraits/med/women/40.jpg,http://api.randomuser.me/portraits/thumb/women/40.jpg,0.6,US +female,ms,edna,hart,"5193 mcclellan rd",downey,illinois,98511,edna.hart80@example.com,yellowladybug781,columbia,Newq3X6H,a01b739c6665661d0bf87f5a42ecc207,b67d811de1acd8e92871917f644c97e8cbd3d69b,dc97b45716d89d978ce181feee305bb1bd7722038bb9877ee0465f10252cffd4,1205277371,519885735,(622)-995-3428,(531)-960-5045,152-37-1128,http://api.randomuser.me/portraits/women/82.jpg,http://api.randomuser.me/portraits/med/women/82.jpg,http://api.randomuser.me/portraits/thumb/women/82.jpg,0.6,US +female,mrs,roberta,welch,"5871 lovers ln",lubbock,maryland,47477,roberta.welch66@example.com,brownostrich309,tigger,cK65oTCc,1ada5e81beb9f6607a54e27407c8e1d2,8de93d2212c4303fa5a68d7acba3a09c9a71393e,1ae007fe9ba1be4bdbee9e00b6538537d52e2219a84cbab3d8e7e358a2294f56,1410653233,843923027,(258)-647-6797,(578)-340-5729,553-79-3798,http://api.randomuser.me/portraits/women/70.jpg,http://api.randomuser.me/portraits/med/women/70.jpg,http://api.randomuser.me/portraits/thumb/women/70.jpg,0.6,US +male,mr,ian,lucas,"7745 sunset st",dumas,connecticut,60295,ian.lucas83@example.com,organictiger128,colors,SrV4nZ7N,134902b902f096010cbb290b51a23585,f515a85040cc020c4c42c984935358fda9fd81d6,88a58de5d0af8cd1804f56a17fe391e3e640078f8904208e6c568cba8aafc6e3,920554099,2981913,(189)-404-5719,(698)-775-5869,332-69-2179,http://api.randomuser.me/portraits/men/7.jpg,http://api.randomuser.me/portraits/med/men/7.jpg,http://api.randomuser.me/portraits/thumb/men/7.jpg,0.6,US +male,mr,ray,terry,"5939 bollinger rd",montgomery,maryland,51334,ray.terry35@example.com,organicelephant149,redbull,DZHGOx3U,1d1b477f3d51aa3f2f1d739989165418,34cac2e7073bb2a617b0f83721acf7e99370ada7,acae57d551afc3e072c7cc506e0a9e0d61dae43febe943793d93eedfbdbd7088,1420279070,999197233,(122)-851-5842,(587)-602-1557,631-33-1876,http://api.randomuser.me/portraits/men/45.jpg,http://api.randomuser.me/portraits/med/men/45.jpg,http://api.randomuser.me/portraits/thumb/men/45.jpg,0.6,US +male,mr,raymond,webb,"6893 cherry st","fountain valley",wisconsin,95357,raymond.webb28@example.com,whitefish376,13131313,owCAtjvw,40c83d0314bbb62ade9213986a5e91ac,1f4b861a3b39546fbe3ae7c13fc8bcff654bfe0b,932ceed491bdac2fe0085848bcf4800a905d5077684a2464de150bc7f4708b92,993099778,831305415,(218)-507-1702,(553)-113-7969,905-85-3958,http://api.randomuser.me/portraits/men/65.jpg,http://api.randomuser.me/portraits/med/men/65.jpg,http://api.randomuser.me/portraits/thumb/men/65.jpg,0.6,US +male,mr,larry,douglas,"9295 james st","fort worth","rhode island",41406,larry.douglas63@example.com,bigmeercat856,pitures,PTlUdw4i,0fd12c335a826c1d58036f0cd2b5c4e0,7fcb798719e484955e08b8cb2265ae40e4dd721c,ed9b45ea638706fb883e3f622b10f7c5aa677f16d71503ac9b5b3fe8d58d15c4,1300971302,123338055,(495)-195-3382,(784)-961-9385,976-47-4262,http://api.randomuser.me/portraits/men/34.jpg,http://api.randomuser.me/portraits/med/men/34.jpg,http://api.randomuser.me/portraits/thumb/men/34.jpg,0.6,US +male,mr,salvador,phillips,"5533 oak ridge ln",kent,georgia,59487,salvador.phillips41@example.com,goldenfish507,freddy,hfNT89IN,4bbd5daffacbcaa79141a7a6a28e79be,236518a4967abfa934a0734345b6cf32d857193d,117f2bc1643eec0ce9d81fb797826e39a792074073e8d98b5020fb522995876e,1057690965,883949594,(475)-390-1676,(568)-595-4108,380-87-6506,http://api.randomuser.me/portraits/men/74.jpg,http://api.randomuser.me/portraits/med/men/74.jpg,http://api.randomuser.me/portraits/thumb/men/74.jpg,0.6,US +male,mr,keith,boyd,"6595 smokey ln","new orleans","new jersey",94726,keith.boyd52@example.com,heavylion160,reeves,eaoUMr5A,80a68d10929eba3320dddee77cf21c15,c8170a3b47339c12c1f5f8cc6bafff793e6d925e,d8497d6ede4da060a15a48d6f8837607bdcc18178270718fd9cfa74b891e9def,990766371,333018176,(300)-786-1017,(730)-918-8529,349-30-5769,http://api.randomuser.me/portraits/men/81.jpg,http://api.randomuser.me/portraits/med/men/81.jpg,http://api.randomuser.me/portraits/thumb/men/81.jpg,0.6,US +female,mrs,kristina,morgan,"8686 e north st",concord,"north carolina",19682,kristina.morgan54@example.com,lazytiger985,momoney,bpMkkSBF,81ed6971d9411420cdb4121c2216ca6d,9aa15d545d3e06a9e33c7caee691eadf6d52eade,da90f0c485b47cc2418cd264992799ab57e5d3548e992c28ad73c2dc7f8e306c,996582120,139427667,(249)-786-9340,(857)-282-6285,224-88-6836,http://api.randomuser.me/portraits/women/74.jpg,http://api.randomuser.me/portraits/med/women/74.jpg,http://api.randomuser.me/portraits/thumb/women/74.jpg,0.6,US +female,miss,teresa,king,"5652 blossom hill rd","cedar hill",wyoming,37396,teresa.king82@example.com,yellowdog628,summer1,HUIuo6hQ,39c23749f049e52995925ad69b7655fd,2a73e041ffd020b0c0494ee6fc653179d812b143,3f8d7d3838546a11c57564066086db7fc32e033695d588a238256d6af4787b0a,1250272982,1011076771,(100)-863-5162,(570)-253-1663,184-73-5129,http://api.randomuser.me/portraits/women/87.jpg,http://api.randomuser.me/portraits/med/women/87.jpg,http://api.randomuser.me/portraits/thumb/women/87.jpg,0.6,US +female,ms,stacy,kelly,"1118 mcgowen st","rancho cucamonga",georgia,98151,stacy.kelly32@example.com,heavytiger597,byebye,FzprFiAV,6303a76a29ff7fe2b0e8d988a7b0b2b5,6bc13d716ea1edefbab34c5bd44f15e87c346398,6a1c68fc1b361364bf37d42b1052ee489461f5414de6da7a8bde5f49199e80c4,1211010688,496128361,(488)-492-6796,(984)-895-8355,206-54-1073,http://api.randomuser.me/portraits/women/17.jpg,http://api.randomuser.me/portraits/med/women/17.jpg,http://api.randomuser.me/portraits/thumb/women/17.jpg,0.6,US +female,mrs,alexa,brooks,"9866 bollinger rd","elk grove",oregon,12177,alexa.brooks76@example.com,blueleopard724,krista,cDMHJvzR,0e50da6178987d8cfb5a21d6467e59db,3c896f0dd27a450e25aec2c74c83b2131dc80111,56fc5507bb135c68f24c8f59c7fab45336bb1f6465c3969b1dc06c28917c3bfe,1436091459,989315964,(753)-313-6983,(420)-747-6866,200-11-7510,http://api.randomuser.me/portraits/women/63.jpg,http://api.randomuser.me/portraits/med/women/63.jpg,http://api.randomuser.me/portraits/thumb/women/63.jpg,0.6,US \ No newline at end of file diff --git a/web/querydsl/src/main/resources/static/bootstrap-table/bootstrap-table.js b/web/querydsl/src/main/resources/static/bootstrap-table/bootstrap-table.js new file mode 100644 index 00000000..ba1df12e --- /dev/null +++ b/web/querydsl/src/main/resources/static/bootstrap-table/bootstrap-table.js @@ -0,0 +1,2303 @@ +/** + * @author zhixin wen + * version: 1.8.1 + * https://github.com/wenzhixin/bootstrap-table/ + */ + +!function ($) { + 'use strict'; + + // TOOLS DEFINITION + // ====================== + + var cellHeight = 37, // update css if changed + cachedWidth = null, + arrowAsc = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ' + + '0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBd' + + 'qEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVo' + + 'AADeemwtPcZI2wAAAABJRU5ErkJggg==', + arrowBoth = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X' + + 'QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azio' + + 'NZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4eut' + + 's6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC', + arrowDesc = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWj' + + 'YBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJ' + + 'zcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= '; + + // it only does '%s', and return '' when arguments are undefined + var sprintf = function (str) { + var args = arguments, + flag = true, + i = 1; + + str = str.replace(/%s/g, function () { + var arg = args[i++]; + + if (typeof arg === 'undefined') { + flag = false; + return ''; + } + return arg; + }); + return flag ? str : ''; + }; + + var getPropertyFromOther = function (list, from, to, value) { + var result = ''; + $.each(list, function (i, item) { + if (item[from] === value) { + result = item[to]; + return false; + } + return true; + }); + return result; + }; + + var getFieldIndex = function (columns, field) { + var index = -1; + + $.each(columns, function (i, column) { + if (column.field === field) { + index = i; + return false; + } + return true; + }); + return index; + }; + + var getScrollBarWidth = function () { + if (cachedWidth === null) { + var inner = $('

    ').addClass('fixed-table-scroll-inner'), + outer = $('

    ').addClass('fixed-table-scroll-outer'), + w1, w2; + + outer.append(inner); + $('body').append(outer); + + w1 = inner[0].offsetWidth; + outer.css('overflow', 'scroll'); + w2 = inner[0].offsetWidth; + + if (w1 === w2) { + w2 = outer[0].clientWidth; + } + + outer.remove(); + cachedWidth = w1 - w2; + } + return cachedWidth; + }; + + var calculateObjectValue = function (self, name, args, defaultValue) { + var func = name; + + if (typeof name === 'string') { + // support obj.func1.func2 + var names = name.split('.'); + + if (names.length > 1) { + func = window; + $.each(names, function (i, f) { + func = func[f]; + }); + } else { + func = window[name]; + } + } + if (typeof func === 'object') { + return func; + } + if (typeof func === 'function') { + return func.apply(self, args); + } + if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) { + return sprintf.apply(this, [name].concat(args)); + } + return defaultValue; + }; + + var escapeHTML = function (text) { + if (typeof text === 'string') { + return text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + return text; + }; + + var getRealHeight = function ($el) { + var height = 0; + $el.children().each(function () { + if (height < $(this).outerHeight(true)) { + height = $(this).outerHeight(true); + } + }); + return height; + }; + + var getRealDataAttr = function (dataAttr) { + for (var attr in dataAttr) { + var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase(); + if (auxAttr !== attr) { + dataAttr[auxAttr] = dataAttr[attr]; + delete dataAttr[attr]; + } + } + + return dataAttr; + }; + + // BOOTSTRAP TABLE CLASS DEFINITION + // ====================== + + var BootstrapTable = function (el, options) { + this.options = options; + this.$el = $(el); + this.$el_ = this.$el.clone(); + this.timeoutId_ = 0; + this.timeoutFooter_ = 0; + + this.init(); + }; + + BootstrapTable.DEFAULTS = { + classes: 'table table-hover', + height: undefined, + undefinedText: '-', + sortName: undefined, + sortOrder: 'asc', + striped: false, + columns: [], + data: [], + method: 'get', + url: undefined, + ajax: undefined, + cache: true, + contentType: 'application/json', + dataType: 'json', + ajaxOptions: {}, + queryParams: function (params) { + return params; + }, + queryParamsType: 'limit', // undefined + responseHandler: function (res) { + return res; + }, + pagination: false, + sidePagination: 'client', // client or server + totalRows: 0, // server side need to set + pageNumber: 1, + pageSize: 10, + pageList: [10, 25, 50, 100], + paginationHAlign: 'right', //right, left + paginationVAlign: 'bottom', //bottom, top, both + paginationDetailHAlign: 'left', //right, left + paginationFirstText: '«', + paginationPreText: '‹', + paginationNextText: '›', + paginationLastText: '»', + search: false, + searchAlign: 'right', + selectItemName: 'btSelectItem', + showHeader: true, + showFooter: false, + showColumns: false, + showPaginationSwitch: false, + showRefresh: false, + showToggle: false, + buttonsAlign: 'right', + smartDisplay: true, + minimumCountColumns: 1, + idField: undefined, + uniqueId: undefined, + cardView: false, + detailView: false, + detailFormatter: function (index, row) { + return ''; + }, + trimOnSearch: true, + clickToSelect: false, + singleSelect: false, + toolbar: undefined, + toolbarAlign: 'left', + checkboxHeader: true, + sortable: true, + maintainSelected: false, + searchTimeOut: 500, + searchText: '', + iconSize: undefined, + iconsPrefix: 'glyphicon', // glyphicon of fa (font awesome) + icons: { + paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down', + paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up', + refresh: 'glyphicon-refresh icon-refresh', + toggle: 'glyphicon-list-alt icon-list-alt', + columns: 'glyphicon-th icon-th' + }, + + rowStyle: function (row, index) { + return {}; + }, + + rowAttributes: function (row, index) { + return {}; + }, + + onAll: function (name, args) { + return false; + }, + onClickCell: function (field, value, row, $element) { + return false; + }, + onDblClickCell: function (field, value, row, $element) { + return false; + }, + onClickRow: function (item, $element) { + return false; + }, + onDblClickRow: function (item, $element) { + return false; + }, + onSort: function (name, order) { + return false; + }, + onCheck: function (row) { + return false; + }, + onUncheck: function (row) { + return false; + }, + onCheckAll: function (rows) { + return false; + }, + onUncheckAll: function (rows) { + return false; + }, + onCheckSome: function(rows){ + return false; + }, + onUncheckSome: function(rows){ + return false; + }, + onLoadSuccess: function (data) { + return false; + }, + onLoadError: function (status) { + return false; + }, + onColumnSwitch: function (field, checked) { + return false; + }, + onPageChange: function (number, size) { + return false; + }, + onSearch: function (text) { + return false; + }, + onToggle: function (cardView) { + return false; + }, + onPreBody: function (data) { + return false; + }, + onPostBody: function () { + return false; + }, + onPostHeader: function () { + return false; + }, + onExpandRow: function (index, row, $detail) { + return false; + }, + onCollapseRow: function (index, row) { + return false; + } + }; + + BootstrapTable.LOCALES = []; + + BootstrapTable.LOCALES['en-US'] = { + formatLoadingMessage: function () { + return 'Loading, please wait...'; + }, + formatRecordsPerPage: function (pageNumber) { + return sprintf('%s records per page', pageNumber); + }, + formatShowingRows: function (pageFrom, pageTo, totalRows) { + return sprintf('Showing %s to %s of %s rows', pageFrom, pageTo, totalRows); + }, + formatSearch: function () { + return 'Search'; + }, + formatNoMatches: function () { + return 'No matching records found'; + }, + formatPaginationSwitch: function () { + return 'Hide/Show pagination'; + }, + formatRefresh: function () { + return 'Refresh'; + }, + formatToggle: function () { + return 'Toggle'; + }, + formatColumns: function () { + return 'Columns'; + }, + formatAllRows: function () { + return 'All'; + } + }; + + $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES['en-US']); + + BootstrapTable.COLUMN_DEFAULTS = { + radio: false, + checkbox: false, + checkboxEnabled: true, + field: undefined, + title: undefined, + 'class': undefined, + align: undefined, // left, right, center + halign: undefined, // left, right, center + falign: undefined, // left, right, center + valign: undefined, // top, middle, bottom + width: undefined, + sortable: false, + order: 'asc', // asc, desc + visible: true, + switchable: true, + clickToSelect: true, + formatter: undefined, + footerFormatter: undefined, + events: undefined, + sorter: undefined, + sortName: undefined, + cellStyle: undefined, + searchable: true, + cardVisible: true + }; + + BootstrapTable.EVENTS = { + 'all.bs.table': 'onAll', + 'click-cell.bs.table': 'onClickCell', + 'dbl-click-cell.bs.table': 'onDblClickCell', + 'click-row.bs.table': 'onClickRow', + 'dbl-click-row.bs.table': 'onDblClickRow', + 'sort.bs.table': 'onSort', + 'check.bs.table': 'onCheck', + 'uncheck.bs.table': 'onUncheck', + 'check-all.bs.table': 'onCheckAll', + 'uncheck-all.bs.table': 'onUncheckAll', + 'check-some.bs.table': 'onCheckSome', + 'uncheck-some.bs.table': 'onUncheckSome', + 'load-success.bs.table': 'onLoadSuccess', + 'load-error.bs.table': 'onLoadError', + 'column-switch.bs.table': 'onColumnSwitch', + 'page-change.bs.table': 'onPageChange', + 'search.bs.table': 'onSearch', + 'toggle.bs.table': 'onToggle', + 'pre-body.bs.table': 'onPreBody', + 'post-body.bs.table': 'onPostBody', + 'post-header.bs.table': 'onPostHeader', + 'expand-row.bs.table': 'onExpandRow', + 'collapse-row.bs.table': 'onCollapseRow' + }; + + BootstrapTable.prototype.init = function () { + this.initContainer(); + this.initTable(); + this.initHeader(); + this.initData(); + this.initFooter(); + this.initToolbar(); + this.initPagination(); + this.initBody(); + this.initServer(); + }; + + BootstrapTable.prototype.initContainer = function () { + this.$container = $([ + '
    ', + '
    ', + this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ? + '
    ' : + '', + '
    ', + '
    ', + '
    ', + '
    ', + this.options.formatLoadingMessage(), + '
    ', + '
    ', + '', + this.options.paginationVAlign === 'bottom' || this.options.paginationVAlign === 'both' ? + '
    ' : + '', + '
    ', + '
    '].join('')); + + this.$container.insertAfter(this.$el); + this.$tableContainer = this.$container.find('.fixed-table-container'); + this.$tableHeader = this.$container.find('.fixed-table-header'); + this.$tableBody = this.$container.find('.fixed-table-body'); + this.$tableLoading = this.$container.find('.fixed-table-loading'); + this.$tableFooter = this.$container.find('.fixed-table-footer'); + this.$toolbar = this.$container.find('.fixed-table-toolbar'); + this.$pagination = this.$container.find('.fixed-table-pagination'); + + this.$tableBody.append(this.$el); + this.$container.after('
    '); + + this.$el.addClass(this.options.classes); + if (this.options.striped) { + this.$el.addClass('table-striped'); + } + if ($.inArray('table-no-bordered', this.options.classes.split(' ')) !== -1) { + this.$tableContainer.addClass('table-no-bordered'); + } + }; + + BootstrapTable.prototype.initTable = function () { + var that = this, + columns = [], + data = []; + + this.$header = this.$el.find('thead'); + if (!this.$header.length) { + this.$header = $('').appendTo(this.$el); + } + if (!this.$header.find('tr').length) { + this.$header.append(''); + } + this.$header.find('th').each(function () { + var column = $.extend({}, { + title: $(this).html(), + 'class': $(this).attr('class') + }, $(this).data()); + + columns.push(column); + }); + this.options.columns = $.extend(true, [], columns, this.options.columns); + $.each(this.options.columns, function (i, column) { + that.options.columns[i] = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, + {field: i}, column); // when field is undefined, use index instead + }); + + // if options.data is setting, do not process tbody data + if (this.options.data.length) { + return; + } + + this.$el.find('tbody tr').each(function () { + var row = {}; + + // save tr's id, class and data-* attributes + row._id = $(this).attr('id'); + row._class = $(this).attr('class'); + row._data = getRealDataAttr($(this).data()); + + $(this).find('td').each(function (i) { + var field = that.options.columns[i].field; + + row[field] = $(this).html(); + // save td's id, class and data-* attributes + row['_' + field + '_id'] = $(this).attr('id'); + row['_' + field + '_class'] = $(this).attr('class'); + row['_' + field + '_rowspan'] = $(this).attr('rowspan'); + row['_' + field + '_data'] = getRealDataAttr($(this).data()); + }); + data.push(row); + }); + this.options.data = data; + }; + + BootstrapTable.prototype.initHeader = function () { + var that = this, + visibleColumns = [], + html = [], + timeoutId = 0; + + this.header = { + fields: [], + styles: [], + classes: [], + formatters: [], + events: [], + sorters: [], + sortNames: [], + cellStyles: [], + clickToSelects: [], + searchables: [] + }; + + if (!this.options.cardView && this.options.detailView) { + html.push('
    '); + visibleColumns.push({}); + } + + $.each(this.options.columns, function (i, column) { + var text = '', + halign = '', // header align style + align = '', // body align style + style = '', + class_ = sprintf(' class="%s"', column['class']), + order = that.options.sortOrder || column.order, + unitWidth = 'px', + width = column.width; + + if (!column.visible) { + // Fix #229. Default Sort order is wrong + // if data-visible="false" is set on the field referenced by data-sort-name. + if (column.field === that.options.sortName) { + that.header.fields.push(column.field); + } + return; + } + + if (that.options.cardView && (!column.cardVisible)) { + return; + } + + if (column.width !== undefined && (!that.options.cardView)) { + if (typeof column.width === 'string') { + if (column.width.indexOf('%') !== -1) { + unitWidth = '%'; + } + } + } + if (column.width && typeof column.width === 'string') { + width = column.width.replace('%', '').replace('px', ''); + } + + halign = sprintf('text-align: %s; ', column.halign ? column.halign : column.align); + align = sprintf('text-align: %s; ', column.align); + style = sprintf('vertical-align: %s; ', column.valign); + style += sprintf('width: %s%s; ', column.checkbox || column.radio ? 36 : width, unitWidth); + + visibleColumns.push(column); + that.header.fields.push(column.field); + that.header.styles.push(align + style); + that.header.classes.push(class_); + that.header.formatters.push(column.formatter); + that.header.events.push(column.events); + that.header.sorters.push(column.sorter); + that.header.sortNames.push(column.sortName); + that.header.cellStyles.push(column.cellStyle); + that.header.clickToSelects.push(column.clickToSelect); + that.header.searchables.push(column.searchable); + + html.push(''); + + html.push(sprintf('
    ', that.options.sortable && column.sortable ? + 'sortable' : '')); + + text = column.title; + + if (column.checkbox) { + if (!that.options.singleSelect && that.options.checkboxHeader) { + text = ''; + } + that.header.stateField = column.field; + } + if (column.radio) { + text = ''; + that.header.stateField = column.field; + that.options.singleSelect = true; + } + + html.push(text); + html.push('
    '); + html.push('
    '); + html.push('
    '); + html.push(''); + }); + + this.$header.find('tr').html(html.join('')); + this.$header.find('th').each(function (i) { + $(this).data(visibleColumns[i]); + }); + this.$container.off('click', '.th-inner').on('click', '.th-inner', function (event) { + if (that.options.sortable && $(this).parent().data().sortable) { + that.onSort(event); + } + }); + + if (!this.options.showHeader || this.options.cardView) { + this.$header.hide(); + this.$tableHeader.hide(); + this.$tableLoading.css('top', 0); + } else { + this.$header.show(); + this.$tableHeader.show(); + this.$tableLoading.css('top', cellHeight + 'px'); + // Assign the correct sortable arrow + this.getCaretHtml(); + } + + this.$selectAll = this.$header.find('[name="btSelectAll"]'); + this.$container.off('click', '[name="btSelectAll"]') + .on('click', '[name="btSelectAll"]', function () { + var checked = $(this).prop('checked'); + that[checked ? 'checkAll' : 'uncheckAll'](); + }); + }; + + BootstrapTable.prototype.initFooter = function () { + if (!this.options.showFooter || this.options.cardView) { + this.$tableFooter.hide(); + } else { + this.$tableFooter.show(); + } + }; + + /** + * @param data + * @param type: append / prepend + */ + BootstrapTable.prototype.initData = function (data, type) { + if (type === 'append') { + this.data = this.data.concat(data); + } else if (type === 'prepend') { + this.data = [].concat(data).concat(this.data); + } else { + this.data = data || this.options.data; + } + + // Fix #839 Records deleted when adding new row on filtered table + if (type === 'append') { + this.options.data = this.options.data.concat(data); + } else if (type === 'prepend') { + this.options.data = [].concat(data).concat(this.options.data); + } else { + this.options.data = this.data; + } + + if (this.options.sidePagination === 'server') { + return; + } + this.initSort(); + }; + + BootstrapTable.prototype.initSort = function () { + var that = this, + name = this.options.sortName, + order = this.options.sortOrder === 'desc' ? -1 : 1, + index = $.inArray(this.options.sortName, this.header.fields); + + if (index !== -1) { + this.data.sort(function (a, b) { + if (that.header.sortNames[index]) { + name = that.header.sortNames[index]; + } + var aa = a[name], + bb = b[name], + value = calculateObjectValue(that.header, that.header.sorters[index], [aa, bb]); + + if (value !== undefined) { + return order * value; + } + + // Fix #161: undefined or null string sort bug. + if (aa === undefined || aa === null) { + aa = ''; + } + if (bb === undefined || bb === null) { + bb = ''; + } + + // IF both values are numeric, do a numeric comparison + if ($.isNumeric(aa) && $.isNumeric(bb)) { + // Convert numerical values form string to float. + aa = parseFloat(aa); + bb = parseFloat(bb); + if (aa < bb) { + return order * -1; + } + return order; + } + + if (aa === bb) { + return 0; + } + + // If value is not a string, convert to string + if (typeof aa !== 'string') { + aa = aa.toString(); + } + + if (aa.localeCompare(bb) === -1) { + return order * -1; + } + + return order; + }); + } + }; + + BootstrapTable.prototype.onSort = function (event) { + var $this = $(event.currentTarget).parent(), + $this_ = this.$header.find('th').eq($this.index()); + + this.$header.add(this.$header_).find('span.order').remove(); + + if (this.options.sortName === $this.data('field')) { + this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc'; + } else { + this.options.sortName = $this.data('field'); + this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc'; + } + this.trigger('sort', this.options.sortName, this.options.sortOrder); + + $this.add($this_).data('order', this.options.sortOrder); + + // Assign the correct sortable arrow + this.getCaretHtml(); + + if (this.options.sidePagination === 'server') { + this.initServer(); + return; + } + + this.initSort(); + this.initBody(); + }; + + BootstrapTable.prototype.initToolbar = function () { + var that = this, + html = [], + timeoutId = 0, + $keepOpen, + $search, + switchableCount = 0; + + this.$toolbar.html(''); + + if (typeof this.options.toolbar === 'string') { + $(sprintf('
    ', this.options.toolbarAlign)) + .appendTo(this.$toolbar) + .append($(this.options.toolbar)); + } + + // showColumns, showToggle, showRefresh + html = [sprintf('
    ', + this.options.buttonsAlign, this.options.buttonsAlign)]; + + if (typeof this.options.icons === 'string') { + this.options.icons = calculateObjectValue(null, this.options.icons); + } + + if (this.options.showPaginationSwitch) { + html.push(sprintf(''); + } + + if (this.options.showRefresh) { + html.push(sprintf(''); + } + + if (this.options.showToggle) { + html.push(sprintf(''); + } + + if (this.options.showColumns) { + html.push(sprintf('
    ', + this.options.formatColumns()), + '', + '', + '
    '); + } + + html.push('
    '); + + // Fix #188: this.showToolbar is for extentions + if (this.showToolbar || html.length > 2) { + this.$toolbar.append(html.join('')); + } + + if (this.options.showPaginationSwitch) { + this.$toolbar.find('button[name="paginationSwitch"]') + .off('click').on('click', $.proxy(this.togglePagination, this)); + } + + if (this.options.showRefresh) { + this.$toolbar.find('button[name="refresh"]') + .off('click').on('click', $.proxy(this.refresh, this)); + } + + if (this.options.showToggle) { + this.$toolbar.find('button[name="toggle"]') + .off('click').on('click', function () { + that.toggleView(); + }); + } + + if (this.options.showColumns) { + $keepOpen = this.$toolbar.find('.keep-open'); + + if (switchableCount <= this.options.minimumCountColumns) { + $keepOpen.find('input').prop('disabled', true); + } + + $keepOpen.find('li').off('click').on('click', function (event) { + event.stopImmediatePropagation(); + }); + $keepOpen.find('input').off('click').on('click', function () { + var $this = $(this); + + that.toggleColumn(getFieldIndex(that.options.columns, $(this).data('field')), $this.prop('checked'), false); + that.trigger('column-switch', $(this).data('field'), $this.prop('checked')); + }); + } + + if (this.options.search) { + html = []; + html.push( + ''); + + this.$toolbar.append(html.join('')); + $search = this.$toolbar.find('.search input'); + $search.off('keyup drop').on('keyup drop', function (event) { + clearTimeout(timeoutId); // doesn't matter if it's 0 + timeoutId = setTimeout(function () { + that.onSearch(event); + }, that.options.searchTimeOut); + }); + + if (this.options.searchText !== '') { + $search.val(this.options.searchText); + clearTimeout(timeoutId); // doesn't matter if it's 0 + timeoutId = setTimeout(function () { + $search.trigger('keyup'); + }, that.options.searchTimeOut); + } + } + }; + + BootstrapTable.prototype.onSearch = function (event) { + var text = $.trim($(event.currentTarget).val()); + + // trim search input + if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) { + $(event.currentTarget).val(text); + } + + if (text === this.searchText) { + return; + } + this.searchText = text; + + this.options.pageNumber = 1; + this.initSearch(); + this.updatePagination(); + this.trigger('search', text); + }; + + BootstrapTable.prototype.initSearch = function () { + var that = this; + + if (this.options.sidePagination !== 'server') { + var s = this.searchText && this.searchText.toLowerCase(); + var f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns; + + // Check filter + this.data = f ? $.grep(this.options.data, function (item, i) { + for (var key in f) { + if (item[key] !== f[key]) { + return false; + } + } + return true; + }) : this.options.data; + + this.data = s ? $.grep(this.data, function (item, i) { + for (var key in item) { + key = $.isNumeric(key) ? parseInt(key, 10) : key; + var value = item[key], + column = that.options.columns[getFieldIndex(that.options.columns, key)], + j = $.inArray(key, that.header.fields); + + // Fix #142: search use formated data + value = calculateObjectValue(column, + that.header.formatters[j], + [value, item, i], value); + + var index = $.inArray(key, that.header.fields); + if (index !== -1 && that.header.searchables[index] && + (typeof value === 'string' || + typeof value === 'number') && + (value + '').toLowerCase().indexOf(s) !== -1) { + return true; + } + } + return false; + }) : this.data; + } + }; + + BootstrapTable.prototype.initPagination = function () { + if (!this.options.pagination) { + this.$pagination.hide(); + return; + } else { + this.$pagination.show(); + } + + var that = this, + html = [], + $allSelected = false, + i, from, to, + $pageList, + $first, $pre, + $next, $last, + $number, + data = this.getData(); + + if (this.options.sidePagination !== 'server') { + this.options.totalRows = data.length; + } + + this.totalPages = 0; + if (this.options.totalRows) { + if (this.options.pageSize === this.options.formatAllRows()) { + this.options.pageSize = this.options.totalRows; + $allSelected = true; + } else if (this.options.pageSize === this.options.totalRows) { + // Fix #667 Table with pagination, multiple pages and a search that matches to one page throws exception + var pageLst = typeof this.options.pageList === 'string' ? + this.options.pageList.replace('[', '').replace(']', '').replace(/ /g, '').toLowerCase().split(',') : + this.options.pageList; + if (pageLst.indexOf(this.options.formatAllRows().toLowerCase()) > -1) { + $allSelected = true; + } + } + + this.totalPages = ~~((this.options.totalRows - 1) / this.options.pageSize) + 1; + + this.options.totalPages = this.totalPages; + } + if (this.totalPages > 0 && this.options.pageNumber > this.totalPages) { + this.options.pageNumber = this.totalPages; + } + + this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1; + this.pageTo = this.options.pageNumber * this.options.pageSize; + if (this.pageTo > this.options.totalRows) { + this.pageTo = this.options.totalRows; + } + + html.push( + '
    ', + '', + this.options.formatShowingRows(this.pageFrom, this.pageTo, this.options.totalRows), + ''); + + html.push(''); + + var pageNumber = [ + sprintf('', this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ? + 'dropdown' : 'dropup'), + '', + ''); + + html.push(this.options.formatRecordsPerPage(pageNumber.join(''))); + html.push(''); + + html.push('
    ', + ''); + + this.$pagination.html(html.join('')); + + $pageList = this.$pagination.find('.page-list a'); + $first = this.$pagination.find('.page-first'); + $pre = this.$pagination.find('.page-pre'); + $next = this.$pagination.find('.page-next'); + $last = this.$pagination.find('.page-last'); + $number = this.$pagination.find('.page-number'); + + if (this.options.pageNumber <= 1) { + $first.addClass('disabled'); + $pre.addClass('disabled'); + } + if (this.options.pageNumber >= this.totalPages) { + $next.addClass('disabled'); + $last.addClass('disabled'); + } + if (this.options.smartDisplay) { + if (this.totalPages <= 1) { + this.$pagination.find('div.pagination').hide(); + } + if (pageList.length < 2 || this.options.totalRows <= pageList[0]) { + this.$pagination.find('span.page-list').hide(); + } + + // when data is empty, hide the pagination + this.$pagination[this.getData().length ? 'show' : 'hide'](); + } + if ($allSelected) { + this.options.pageSize = this.options.formatAllRows(); + } + $pageList.off('click').on('click', $.proxy(this.onPageListChange, this)); + $first.off('click').on('click', $.proxy(this.onPageFirst, this)); + $pre.off('click').on('click', $.proxy(this.onPagePre, this)); + $next.off('click').on('click', $.proxy(this.onPageNext, this)); + $last.off('click').on('click', $.proxy(this.onPageLast, this)); + $number.off('click').on('click', $.proxy(this.onPageNumber, this)); + }; + + BootstrapTable.prototype.updatePagination = function (event) { + // Fix #171: IE disabled button can be clicked bug. + if (event && $(event.currentTarget).hasClass('disabled')) { + return; + } + + if (!this.options.maintainSelected) { + this.resetRows(); + } + + this.initPagination(); + if (this.options.sidePagination === 'server') { + this.initServer(); + } else { + this.initBody(); + } + + this.trigger('page-change', this.options.pageNumber, this.options.pageSize); + }; + + BootstrapTable.prototype.onPageListChange = function (event) { + var $this = $(event.currentTarget); + + $this.parent().addClass('active').siblings().removeClass('active'); + this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ? + this.options.formatAllRows() : +$this.text(); + this.$toolbar.find('.page-size').text(this.options.pageSize); + + this.updatePagination(event); + }; + + BootstrapTable.prototype.onPageFirst = function (event) { + this.options.pageNumber = 1; + this.updatePagination(event); + }; + + BootstrapTable.prototype.onPagePre = function (event) { + this.options.pageNumber--; + this.updatePagination(event); + }; + + BootstrapTable.prototype.onPageNext = function (event) { + this.options.pageNumber++; + this.updatePagination(event); + }; + + BootstrapTable.prototype.onPageLast = function (event) { + this.options.pageNumber = this.totalPages; + this.updatePagination(event); + }; + + BootstrapTable.prototype.onPageNumber = function (event) { + if (this.options.pageNumber === +$(event.currentTarget).text()) { + return; + } + this.options.pageNumber = +$(event.currentTarget).text(); + this.updatePagination(event); + }; + + BootstrapTable.prototype.initBody = function (fixedScroll) { + var that = this, + html = [], + data = this.getData(); + + this.trigger('pre-body', data); + + this.$body = this.$el.find('tbody'); + if (!this.$body.length) { + this.$body = $('').appendTo(this.$el); + } + + //Fix #389 Bootstrap-table-flatJSON is not working + + if (!this.options.pagination || this.options.sidePagination === 'server') { + this.pageFrom = 1; + this.pageTo = data.length; + } + + for (var i = this.pageFrom - 1; i < this.pageTo; i++) { + var key, + item = data[i], + style = {}, + csses = [], + data_ = '', + attributes = {}, + htmlAttributes = []; + + style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style); + + if (style && style.css) { + for (key in style.css) { + csses.push(key + ': ' + style.css[key]); + } + } + + attributes = calculateObjectValue(this.options, + this.options.rowAttributes, [item, i], attributes); + + if (attributes) { + for (key in attributes) { + htmlAttributes.push(sprintf('%s="%s"', key, escapeHTML(attributes[key]))); + } + } + + if (item._data && !$.isEmptyObject(item._data)) { + $.each(item._data, function (k, v) { + // ignore data-index + if (k === 'index') { + return; + } + data_ += sprintf(' data-%s="%s"', k, v); + }); + } + + html.push('' + ); + + if (this.options.cardView) { + html.push(sprintf('', this.header.fields.length)); + } + + if (!this.options.cardView && this.options.detailView) { + html.push('', + '', + '', + '', + ''); + } + + $.each(this.header.fields, function (j, field) { + var text = '', + value = item[field], + type = '', + cellStyle = {}, + id_ = '', + class_ = that.header.classes[j], + data_ = '', + rowspan_ = '', + column = that.options.columns[getFieldIndex(that.options.columns, field)]; + + style = sprintf('style="%s"', csses.concat(that.header.styles[j]).join('; ')); + + value = calculateObjectValue(column, + that.header.formatters[j], [value, item, i], value); + + // handle td's id and class + if (item['_' + field + '_id']) { + id_ = sprintf(' id="%s"', item['_' + field + '_id']); + } + if (item['_' + field + '_class']) { + class_ = sprintf(' class="%s"', item['_' + field + '_class']); + } + if (item['_' + field + '_rowspan']) { + rowspan_ = sprintf(' rowspan="%s"', item['_' + field + '_rowspan']); + } + cellStyle = calculateObjectValue(that.header, + that.header.cellStyles[j], [value, item, i], cellStyle); + if (cellStyle.classes) { + class_ = sprintf(' class="%s"', cellStyle.classes); + } + if (cellStyle.css) { + var csses_ = []; + for (var key in cellStyle.css) { + csses_.push(key + ': ' + cellStyle.css[key]); + } + style = sprintf('style="%s"', csses_.concat(that.header.styles[j]).join('; ')); + } + + if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) { + $.each(item['_' + field + '_data'], function (k, v) { + // ignore data-index + if (k === 'index') { + return; + } + data_ += sprintf(' data-%s="%s"', k, v); + }); + } + + if (column.checkbox || column.radio) { + type = column.checkbox ? 'checkbox' : type; + type = column.radio ? 'radio' : type; + + text = [that.options.cardView ? + '
    ' : '', + '', + that.options.cardView ? '
    ' : ''].join(''); + + item[that.header.stateField] = value === true || (value && value.checked); + } else { + value = typeof value === 'undefined' || value === null ? + that.options.undefinedText : value; + + text = that.options.cardView ? + ['
    ', + that.options.showHeader ? sprintf('%s', style, + getPropertyFromOther(that.options.columns, 'field', 'title', field)) : '', + sprintf('%s', value), + '
    '].join('') : + [sprintf('', id_, class_, style, data_, rowspan_), + value, + ''].join(''); + + // Hide empty data on Card view when smartDisplay is set to true. + if (that.options.cardView && that.options.smartDisplay && value === '') { + text = ''; + } + } + + html.push(text); + }); + + if (this.options.cardView) { + html.push(''); + } + + html.push(''); + } + + // show no records + if (!html.length) { + html.push('', + sprintf('%s', + this.$header.find('th').length, this.options.formatNoMatches()), + ''); + } + + this.$body.html(html.join('')); + + if (!fixedScroll) { + this.scrollTo(0); + } + + // click to select by column + this.$body.find('> tr > td').off('click').on('click', function () { + var $td = $(this), + $tr = $td.parent(), + item = that.data[$tr.data('index')], + cellIndex = $td[0].cellIndex, + $headerCell = that.$header.find('th:eq(' + cellIndex + ')'), + field = $headerCell.data('field'), + value = item[field]; + that.trigger('click-cell', field, value, item, $td); + that.trigger('click-row', item, $tr); + // if click to select - then trigger the checkbox/radio click + if (that.options.clickToSelect) { + if (that.header.clickToSelects[$tr.children().index($(this))]) { + $tr.find(sprintf('[name="%s"]', + that.options.selectItemName))[0].click(); // #144: .trigger('click') bug + } + } + }); + this.$body.find('> tr > td').off('dblclick').on('dblclick', function () { + var $td = $(this), + $tr = $td.parent(), + item = that.data[$tr.data('index')], + cellIndex = $td[0].cellIndex, + $headerCell = that.$header.find('th:eq(' + cellIndex + ')'), + field = $headerCell.data('field'), + value = item[field]; + that.trigger('dbl-click-cell', field, value, item, $td); + that.trigger('dbl-click-row', item, $tr); + }); + + this.$body.find('> tr > td > .detail-icon').off('click').on('click', function () { + var $this = $(this), + $tr = $this.parent().parent(), + index = $tr.data('index'), + row = that.options.data[index]; + + // remove and update + if ($tr.next().is('tr.detail-view')) { + $this.find('i').attr('class', 'glyphicon glyphicon-plus icon-plus'); + $tr.next().remove(); + that.trigger('collapse-row', index, row); + } else { + $this.find('i').attr('class', 'glyphicon glyphicon-minus icon-minus'); + $tr.after(sprintf('%s', + $tr.find('td').length, calculateObjectValue(that.options, + that.options.detailFormatter, [index, row], ''))); + that.trigger('expand-row', index, row, $tr.next().find('td')); + } + that.resetView(); + }); + + this.$selectItem = this.$body.find(sprintf('[name="%s"]', this.options.selectItemName)); + this.$selectItem.off('click').on('click', function (event) { + event.stopImmediatePropagation(); + + var checked = $(this).prop('checked'), + row = that.data[$(this).data('index')]; + + row[that.header.stateField] = checked; + + if (that.options.singleSelect) { + that.$selectItem.not(this).each(function () { + that.data[$(this).data('index')][that.header.stateField] = false; + }); + that.$selectItem.filter(':checked').not(this).prop('checked', false); + } + + that.updateSelected(); + that.trigger(checked ? 'check' : 'uncheck', row); + }); + + $.each(this.header.events, function (i, events) { + if (!events) { + return; + } + // fix bug, if events is defined with namespace + if (typeof events === 'string') { + events = calculateObjectValue(null, events); + } + if (!that.options.cardView && that.options.detailView) { + i += 1; + } + for (var key in events) { + that.$body.find('tr').each(function () { + var $tr = $(this), + $td = $tr.find(that.options.cardView ? '.card-view' : 'td').eq(i), + index = key.indexOf(' '), + name = key.substring(0, index), + el = key.substring(index + 1), + func = events[key]; + + $td.find(el).off(name).on(name, function (e) { + var index = $tr.data('index'), + row = that.data[index], + value = row[that.header.fields[i]]; + + func.apply(this, [e, value, row, index]); + }); + }); + } + }); + + this.updateSelected(); + this.resetView(); + + this.trigger('post-body'); + }; + + BootstrapTable.prototype.initServer = function (silent, query) { + var that = this, + data = {}, + params = { + pageSize: this.options.pageSize === this.options.formatAllRows() ? + this.options.totalRows : this.options.pageSize, + pageNumber: this.options.pageNumber, + searchText: this.searchText, + sortName: this.options.sortName, + sortOrder: this.options.sortOrder + }, + request; + + if (!this.options.url && !this.options.ajax) { + return; + } + + if (this.options.queryParamsType === 'limit') { + params = { + search: params.searchText, + sort: params.sortName, + order: params.sortOrder + }; + if (this.options.pagination) { + + params.size = this.options.pageSize === this.options.formatAllRows() ? + this.options.totalRows : this.options.pageSize; + params.page = this.options.pageNumber - 1; + } + } + + if (!($.isEmptyObject(this.filterColumnsPartial))) { + params['filter'] = JSON.stringify(this.filterColumnsPartial, null); + } + + data = calculateObjectValue(this.options, this.options.queryParams, [params], data); + + $.extend(data, query || {}); + + // false to stop request + if (data === false) { + return; + } + + if (!silent) { + this.$tableLoading.show(); + } + request = $.extend({}, calculateObjectValue(null, this.options.ajaxOptions), { + type: this.options.method, + url: this.options.url, + data: this.options.contentType === 'application/json' && this.options.method === 'post' ? + JSON.stringify(data) : data, + cache: this.options.cache, + contentType: this.options.contentType, + dataType: this.options.dataType, + success: function (res) { + res = calculateObjectValue(that.options, that.options.responseHandler, [res], res); + + that.load(res); + that.trigger('load-success', res); + }, + error: function (res) { + that.trigger('load-error', res.status); + }, + complete: function () { + if (!silent) { + that.$tableLoading.hide(); + } + } + }); + + if (this.options.ajax) { + calculateObjectValue(this, this.options.ajax, [request], null); + } else { + $.ajax(request); + } + }; + + BootstrapTable.prototype.getCaretHtml = function () { + var that = this; + + $.each(this.$header.find('th'), function (i, th) { + if ($(th).data('field') === that.options.sortName) { + $(th).find('.sortable').css('background-image', 'url(' + (that.options.sortOrder === 'desc' ? arrowDesc : arrowAsc) + ')'); + } else { + $(th).find('.sortable').css('background-image', 'url(' + arrowBoth +')'); + } + }); + }; + + BootstrapTable.prototype.updateSelected = function () { + var checkAll = this.$selectItem.filter(':enabled').length === + this.$selectItem.filter(':enabled').filter(':checked').length; + + this.$selectAll.add(this.$selectAll_).prop('checked', checkAll); + + this.$selectItem.each(function () { + $(this).parents('tr')[$(this).prop('checked') ? 'addClass' : 'removeClass']('selected'); + }); + }; + + BootstrapTable.prototype.updateRows = function () { + var that = this; + + this.$selectItem.each(function () { + that.data[$(this).data('index')][that.header.stateField] = $(this).prop('checked'); + }); + }; + + BootstrapTable.prototype.resetRows = function () { + var that = this; + + $.each(this.data, function (i, row) { + that.$selectAll.prop('checked', false); + that.$selectItem.prop('checked', false); + row[that.header.stateField] = false; + }); + }; + + BootstrapTable.prototype.trigger = function (name) { + var args = Array.prototype.slice.call(arguments, 1); + + name += '.bs.table'; + this.options[BootstrapTable.EVENTS[name]].apply(this.options, args); + this.$el.trigger($.Event(name), args); + + this.options.onAll(name, args); + this.$el.trigger($.Event('all.bs.table'), [name, args]); + }; + + BootstrapTable.prototype.resetHeader = function () { + // fix #61: the hidden table reset header bug. + // fix bug: get $el.css('width') error sometime (height = 500) + clearTimeout(this.timeoutId_); + this.timeoutId_ = setTimeout($.proxy(this.fitHeader, this), this.$el.is(':hidden') ? 100 : 0); + }; + + BootstrapTable.prototype.fitHeader = function () { + var that = this, + fixedBody, + scrollWidth; + + if (that.$el.is(':hidden')) { + that.timeoutFooter_ = setTimeout($.proxy(that.fitHeader, that), 100); + return; + } + fixedBody = this.$tableBody.get(0); + + scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth && + fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.height() ? + getScrollBarWidth() : 0; + + this.$el.css('margin-top', -this.$header.height()); + this.$header_ = this.$header.clone(true, true); + this.$selectAll_ = this.$header_.find('[name="btSelectAll"]'); + this.$tableHeader.css({ + 'margin-right': scrollWidth + }).find('table').css('width', this.$el.css('width')) + .html('').attr('class', this.$el.attr('class')) + .append(this.$header_); + + // fix bug: $.data() is not working as expected after $.append() + this.$header.find('th').each(function (i) { + that.$header_.find('th').eq(i).data($(this).data()); + }); + + this.$body.find('tr:first-child:not(.no-records-found) > *').each(function (i) { + that.$header_.find('div.fht-cell').eq(i).width($(this).innerWidth()); + }); + // horizontal scroll event + // TODO: it's probably better improving the layout than binding to scroll event + this.$tableBody.off('scroll').on('scroll', function () { + that.$tableHeader.scrollLeft($(this).scrollLeft()); + }); + that.trigger('post-header'); + }; + + BootstrapTable.prototype.resetFooter = function () { + var that = this, + data = that.getData(), + html = []; + + if (!this.options.showFooter || this.options.cardView) { //do nothing + return; + } + + if (!this.options.cardView && this.options.detailView) { + html.push(''); + } + + $.each(this.options.columns, function (i, column) { + var falign = '', // footer align style + style = '', + class_ = sprintf(' class="%s"', column['class']); + + if (!column.visible) { + return; + } + + if (that.options.cardView && (!column.cardVisible)) { + return; + } + + falign = sprintf('text-align: %s; ', column.falign ? column.falign : column.align); + style = sprintf('vertical-align: %s; ', column.valign); + + html.push(''); + + html.push(calculateObjectValue(column, column.footerFormatter, [data], ' ') || ' '); + html.push(''); + }); + + this.$tableFooter.find('tr').html(html.join('')); + clearTimeout(this.timeoutFooter_); + this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), + this.$el.is(':hidden') ? 100 : 0); + }; + + BootstrapTable.prototype.fitFooter = function () { + var that = this, + $footerTd, + elWidth, + scrollWidth; + + clearTimeout(this.timeoutFooter_); + if (this.$el.is(':hidden')) { + this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), 100); + return; + } + + elWidth = this.$el.css('width'); + scrollWidth = elWidth > this.$tableBody.width() ? getScrollBarWidth() : 0; + + this.$tableFooter.css({ + 'margin-right': scrollWidth + }).find('table').css('width', elWidth) + .attr('class', this.$el.attr('class')); + + $footerTd = this.$tableFooter.find('td'); + + this.$tableBody.find('tbody tr:first-child:not(.no-records-found) > td').each(function (i) { + $footerTd.eq(i).outerWidth($(this).outerWidth()); + }); + }; + + BootstrapTable.prototype.toggleColumn = function (index, checked, needUpdate) { + if (index === -1) { + return; + } + this.options.columns[index].visible = checked; + this.initHeader(); + this.initSearch(); + this.initPagination(); + this.initBody(); + + if (this.options.showColumns) { + var $items = this.$toolbar.find('.keep-open input').prop('disabled', false); + + if (needUpdate) { + $items.filter(sprintf('[value="%s"]', index)).prop('checked', checked); + } + + if ($items.filter(':checked').length <= this.options.minimumCountColumns) { + $items.filter(':checked').prop('disabled', true); + } + } + }; + + BootstrapTable.prototype.toggleRow = function (index, isIdField, visible) { + if (index === -1) { + return; + } + + $(this.$body[0]).children().filter(sprintf(isIdField ? '[data-uniqueid="%s"]' : '[data-index="%s"]', index)) + [visible ? 'show' : 'hide'](); + }; + + // PUBLIC FUNCTION DEFINITION + // ======================= + + BootstrapTable.prototype.resetView = function (params) { + var padding = 0; + + if (params && params.height) { + this.options.height = params.height; + } + + this.$selectAll.prop('checked', this.$selectItem.length > 0 && + this.$selectItem.length === this.$selectItem.filter(':checked').length); + + if (this.options.height) { + var toolbarHeight = getRealHeight(this.$toolbar), + paginationHeight = getRealHeight(this.$pagination), + height = this.options.height - toolbarHeight - paginationHeight; + + this.$tableContainer.css('height', height + 'px'); + } + + if (this.options.cardView) { + // remove the element css + this.$el.css('margin-top', '0'); + this.$tableContainer.css('padding-bottom', '0'); + return; + } + + if (this.options.showHeader && this.options.height) { + this.$tableHeader.show(); + this.resetHeader(); + padding += cellHeight; + } else { + this.$tableHeader.hide(); + this.trigger('post-header'); + } + + if (this.options.showFooter) { + this.resetFooter(); + if (this.options.height) { + padding += cellHeight; + } + } + + // Assign the correct sortable arrow + this.getCaretHtml(); + this.$tableContainer.css('padding-bottom', padding + 'px'); + }; + + BootstrapTable.prototype.getData = function (useCurrentPage) { + return (this.searchText + || !$.isEmptyObject(this.filterColumns) + || !$.isEmptyObject(this.filterColumnsPartial)) ? + (useCurrentPage ? this.data.slice(this.pageFrom -1, this.pageTo) + : this.data) : + (useCurrentPage ? this.options.data.slice(this.pageFrom - 1, this.pageTo) + : this.options.data); + }; + + BootstrapTable.prototype.load = function (data) { + var fixedScroll = false; + + // #431: support pagination + if (this.options.sidePagination === 'server') { + this.options.totalRows = data.total; + this.options.pageNumber = data.pageNumber; + this.options.pageSize = data.pageSize; + fixedScroll = data.fixedScroll; + data = data.rows; + } else if (!$.isArray(data)) { // support fixedScroll + fixedScroll = data.fixedScroll; + data = data.data; + } + + this.initData(data); + this.initSearch(); + this.initPagination(); + this.initBody(fixedScroll); + }; + + BootstrapTable.prototype.append = function (data) { + this.initData(data, 'append'); + this.initSearch(); + this.initPagination(); + this.initBody(true); + }; + + BootstrapTable.prototype.prepend = function (data) { + this.initData(data, 'prepend'); + this.initSearch(); + this.initPagination(); + this.initBody(true); + }; + + BootstrapTable.prototype.remove = function (params) { + var len = this.options.data.length, + i, row; + + if (!params.hasOwnProperty('field') || !params.hasOwnProperty('values')) { + return; + } + + for (i = len - 1; i >= 0; i--) { + row = this.options.data[i]; + + if (!row.hasOwnProperty(params.field)) { + continue; + } + if ($.inArray(row[params.field], params.values) !== -1) { + this.options.data.splice(i, 1); + } + } + + if (len === this.options.data.length) { + return; + } + + this.initSearch(); + this.initPagination(); + this.initBody(true); + }; + + BootstrapTable.prototype.removeAll = function () { + if (this.options.data.length > 0) { + this.options.data.splice(0, this.options.data.length); + this.initSearch(); + this.initPagination(); + this.initBody(true); + } + }; + + BootstrapTable.prototype.removeByUniqueId = function (id) { + var uniqueId = this.options.uniqueId, + len = this.options.data.length, + i, row; + + for (i = len - 1; i >= 0; i--) { + row = this.options.data[i]; + + if (!row.hasOwnProperty(uniqueId)) { + continue; + } + + if (typeof row[uniqueId] === 'string') { + id = id.toString(); + } else if (typeof row[uniqueId] === 'number') { + if ((Number(row[uniqueId]) === row[uniqueId]) && (row[uniqueId] % 1 === 0)) { + id = parseInt(id); + } else if ((row[uniqueId] === Number(row[uniqueId])) && (row[uniqueId] !== 0)) { + id = parseFloat(id); + } + } + + if (row[uniqueId] === id) { + this.options.data.splice(i, 1); + } + } + + if (len === this.options.data.length) { + return; + } + + this.initSearch(); + this.initPagination(); + this.initBody(true); + }; + + BootstrapTable.prototype.insertRow = function (params) { + if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) { + return; + } + this.data.splice(params.index, 0, params.row); + this.initSearch(); + this.initPagination(); + this.initSort(); + this.initBody(true); + }; + + BootstrapTable.prototype.updateRow = function (params) { + if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) { + return; + } + $.extend(this.data[params.index], params.row); + this.initSort(); + this.initBody(true); + }; + + BootstrapTable.prototype.showRow = function (params) { + if (!params.hasOwnProperty('index')) { + return; + } + + this.toggleRow(params.index, params.isIdField === undefined ? false : true, true); + }; + + BootstrapTable.prototype.hideRow = function (params) { + if (!params.hasOwnProperty('index')) { + return; + } + + this.toggleRow(params.index, params.isIdField === undefined ? false : true, false); + }; + + BootstrapTable.prototype.getRowsHidden = function (show) { + var rows = $(this.$body[0]).children().filter(':hidden'), + i = 0; + if (show) { + for (; i < rows.length; i++) { + $(rows[i]).show(); + } + } + return rows; + }; + + BootstrapTable.prototype.mergeCells = function (options) { + var row = options.index, + col = $.inArray(options.field, this.header.fields), + rowspan = options.rowspan || 1, + colspan = options.colspan || 1, + i, j, + $tr = this.$body.find('tr'), + $td = $tr.eq(row).find('td').eq(col); + + if (!this.options.cardView && this.options.detailView) { + col += 1; + } + $td = $tr.eq(row).find('td').eq(col); + + if (row < 0 || col < 0 || row >= this.data.length) { + return; + } + + for (i = row; i < row + rowspan; i++) { + for (j = col; j < col + colspan; j++) { + $tr.eq(i).find('td').eq(j).hide(); + } + } + + $td.attr('rowspan', rowspan).attr('colspan', colspan).show(); + }; + + BootstrapTable.prototype.updateCell = function (params) { + if (!params.hasOwnProperty('rowIndex') || !params.hasOwnProperty('fieldName') || !params.hasOwnProperty('fieldValue')) { + return; + } + this.data[params.rowIndex][params.fieldName] = params.fieldValue; + this.initSort(); + this.initBody(true); + }; + + BootstrapTable.prototype.getOptions = function () { + return this.options; + }; + + BootstrapTable.prototype.getSelections = function () { + var that = this; + + return $.grep(this.data, function (row) { + return row[that.header.stateField]; + }); + }; + + BootstrapTable.prototype.getAllSelections = function () { + var that = this; + + return $.grep(this.options.data, function (row) { + return row[that.header.stateField]; + }); + }; + + BootstrapTable.prototype.checkAll = function () { + this.checkAll_(true); + }; + + BootstrapTable.prototype.uncheckAll = function () { + this.checkAll_(false); + }; + + BootstrapTable.prototype.checkAll_ = function (checked) { + var rows; + if (!checked) { + rows = this.getSelections(); + } + this.$selectItem.filter(':enabled').prop('checked', checked); + this.updateRows(); + this.updateSelected(); + if (checked) { + rows = this.getSelections(); + } + this.trigger(checked ? 'check-all' : 'uncheck-all', rows); + }; + + BootstrapTable.prototype.check = function (index) { + this.check_(true, index); + }; + + BootstrapTable.prototype.uncheck = function (index) { + this.check_(false, index); + }; + + BootstrapTable.prototype.check_ = function (checked, index) { + this.$selectItem.filter(sprintf('[data-index="%s"]', index)).prop('checked', checked); + this.data[index][this.header.stateField] = checked; + this.updateSelected(); + this.trigger(checked ? 'check' : 'uncheck', this.data[index]); + }; + + BootstrapTable.prototype.checkBy = function (obj) { + this.checkBy_(true, obj); + }; + + BootstrapTable.prototype.uncheckBy = function (obj) { + this.checkBy_(false, obj); + }; + + BootstrapTable.prototype.checkBy_ = function (checked, obj) { + if (!obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) { + return; + } + + var that = this, + rows = []; + $.each(this.options.data, function (index, row) { + if (!row.hasOwnProperty(obj.field)) { + return false; + } + if ($.inArray(row[obj.field], obj.values) !== -1) { + that.$selectItem.filter(sprintf('[data-index="%s"]', index)).prop('checked', checked); + row[that.header.stateField] = checked; + rows.push(row); + that.trigger(checked ? 'check' : 'uncheck', row); + } + }); + this.updateSelected(); + this.trigger(checked ? 'check-some' : 'uncheck-some', rows); + }; + + BootstrapTable.prototype.destroy = function () { + this.$el.insertBefore(this.$container); + $(this.options.toolbar).insertBefore(this.$el); + this.$container.next().remove(); + this.$container.remove(); + this.$el.html(this.$el_.html()) + .css('margin-top', '0') + .attr('class', this.$el_.attr('class') || ''); // reset the class + }; + + BootstrapTable.prototype.showLoading = function () { + this.$tableLoading.show(); + }; + + BootstrapTable.prototype.hideLoading = function () { + this.$tableLoading.hide(); + }; + + BootstrapTable.prototype.togglePagination = function () { + this.options.pagination = !this.options.pagination; + var button = this.$toolbar.find('button[name="paginationSwitch"] i'); + if (this.options.pagination) { + button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchDown); + } else { + button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchUp); + } + this.updatePagination(); + }; + + BootstrapTable.prototype.refresh = function (params) { + if (params && params.url) { + this.options.url = params.url; + this.options.pageNumber = 1; + } + this.initServer(params && params.silent, params && params.query); + }; + + BootstrapTable.prototype.resetWidth = function () { + if (this.options.showHeader && this.options.height) { + this.fitHeader(); + } + if (this.options.showFooter) { + this.fitFooter(); + } + }; + + BootstrapTable.prototype.showColumn = function (field) { + this.toggleColumn(getFieldIndex(this.options.columns, field), true, true); + }; + + BootstrapTable.prototype.hideColumn = function (field) { + this.toggleColumn(getFieldIndex(this.options.columns, field), false, true); + }; + + BootstrapTable.prototype.filterBy = function (columns) { + this.filterColumns = $.isEmptyObject(columns) ? {} : columns; + this.options.pageNumber = 1; + this.initSearch(); + this.updatePagination(); + }; + + BootstrapTable.prototype.scrollTo = function (value) { + if (typeof value === 'string') { + value = value === 'bottom' ? this.$tableBody[0].scrollHeight : 0; + } + if (typeof value === 'number') { + this.$tableBody.scrollTop(value); + } + if (typeof value === 'undefined') { + return this.$tableBody.scrollTop(); + } + }; + + BootstrapTable.prototype.getScrollPosition = function () { + return this.scrollTo(); + } + + BootstrapTable.prototype.selectPage = function (page) { + if (page > 0 && page <= this.options.totalPages) { + this.options.pageNumber = page; + this.updatePagination(); + } + }; + + BootstrapTable.prototype.prevPage = function () { + if (this.options.pageNumber > 1) { + this.options.pageNumber--; + this.updatePagination(); + } + }; + + BootstrapTable.prototype.nextPage = function () { + if (this.options.pageNumber < this.options.totalPages) { + this.options.pageNumber++; + this.updatePagination(); + } + }; + + BootstrapTable.prototype.toggleView = function () { + this.options.cardView = !this.options.cardView; + this.initHeader(); + // Fixed remove toolbar when click cardView button. + //that.initToolbar(); + this.initBody(); + this.trigger('toggle', this.options.cardView); + }; + + // BOOTSTRAP TABLE PLUGIN DEFINITION + // ======================= + + var allowedMethods = [ + 'getOptions', + 'getSelections', 'getAllSelections', 'getData', + 'load', 'append', 'prepend', 'remove', 'removeAll', + 'insertRow', 'updateRow', 'updateCell', 'removeByUniqueId', + 'showRow', 'hideRow', 'getRowsHidden', + 'mergeCells', + 'checkAll', 'uncheckAll', + 'check', 'uncheck', + 'checkBy', 'uncheckBy', + 'refresh', + 'resetView', + 'resetWidth', + 'destroy', + 'showLoading', 'hideLoading', + 'showColumn', 'hideColumn', + 'filterBy', + 'scrollTo', + 'getScrollPosition', + 'selectPage', 'prevPage', 'nextPage', + 'togglePagination', + 'toggleView' + ]; + + $.fn.bootstrapTable = function (option) { + var value, + args = Array.prototype.slice.call(arguments, 1); + + this.each(function () { + var $this = $(this), + data = $this.data('bootstrap.table'), + options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(), + typeof option === 'object' && option); + + if (typeof option === 'string') { + if ($.inArray(option, allowedMethods) < 0) { + throw new Error("Unknown method: " + option); + } + + if (!data) { + return; + } + + value = data[option].apply(data, args); + + if (option === 'destroy') { + $this.removeData('bootstrap.table'); + } + } + + if (!data) { + $this.data('bootstrap.table', (data = new BootstrapTable(this, options))); + } + }); + + return typeof value === 'undefined' ? this : value; + }; + + $.fn.bootstrapTable.Constructor = BootstrapTable; + $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS; + $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS; + $.fn.bootstrapTable.locales = BootstrapTable.LOCALES; + $.fn.bootstrapTable.methods = allowedMethods; + + // BOOTSTRAP TABLE INIT + // ======================= + + $(function () { + $('[data-toggle="table"]').bootstrapTable(); + }); + +}(jQuery); diff --git a/web/querydsl/src/main/resources/static/bootstrap-table/bootstrap-table.min.css b/web/querydsl/src/main/resources/static/bootstrap-table/bootstrap-table.min.css new file mode 100644 index 00000000..056263a1 --- /dev/null +++ b/web/querydsl/src/main/resources/static/bootstrap-table/bootstrap-table.min.css @@ -0,0 +1 @@ +.bootstrap-table .table{margin-bottom:0!important;border-bottom:1px solid #ddd;border-collapse:collapse!important;border-radius:1px}.bootstrap-table .table,.bootstrap-table .table>tbody>tr>td,.bootstrap-table .table>tbody>tr>th,.bootstrap-table .table>tfoot>tr>td,.bootstrap-table .table>tfoot>tr>th,.bootstrap-table .table>thead>tr>td{padding:8px!important}.bootstrap-table .table.table-no-bordered>tbody>tr>td,.bootstrap-table .table.table-no-bordered>thead>tr>th{border-right:2px solid transparent}.fixed-table-container{position:relative;clear:both;border:1px solid #ddd;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px}.fixed-table-container.table-no-bordered{border:1px solid transparent}.fixed-table-footer,.fixed-table-header{height:37px;overflow:hidden;border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0}.fixed-table-header{border-bottom:1px solid #ddd}.fixed-table-footer{border-top:1px solid #ddd}.fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.fixed-table-container table{width:100%}.fixed-table-container thead th{height:0;padding:0;margin:0;border-left:1px solid #ddd}.fixed-table-container thead th:first-child{border-left:none;border-top-left-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px}.fixed-table-container thead th .th-inner{padding:8px;line-height:24px;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fixed-table-container thead th .sortable{cursor:pointer;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC');background-position:right;background-repeat:no-repeat;padding-right:30px}.fixed-table-container th.detail{width:30px}.fixed-table-container tbody td{border-left:1px solid #ddd}.fixed-table-container tbody tr:first-child td{border-top:none}.fixed-table-container tbody td:first-child{border-left:none}.fixed-table-container tbody .selected td{background-color:#f5f5f5}.fixed-table-container .bs-checkbox{text-align:center}.fixed-table-container .bs-checkbox .th-inner{padding:8px 0}.fixed-table-container input[type=radio],.fixed-table-container input[type=checkbox]{margin:0 auto!important}.fixed-table-container .no-records-found{text-align:center}.fixed-table-pagination .pagination-detail,.fixed-table-pagination div.pagination{margin-top:10px;margin-bottom:10px}.fixed-table-pagination div.pagination .pagination{margin:0}.fixed-table-pagination .pagination a{padding:6px 12px;line-height:1.428571429}.fixed-table-pagination .pagination-info{line-height:34px;margin-right:5px}.fixed-table-pagination .btn-group{position:relative;display:inline-block;vertical-align:middle}.fixed-table-pagination .dropup .dropdown-menu{margin-bottom:0}.fixed-table-pagination .page-list{display:inline-block}.fixed-table-toolbar .columns-left{margin-right:5px}.fixed-table-toolbar .columns-right{margin-left:5px}.fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.fixed-table-toolbar .bars,.fixed-table-toolbar .columns,.fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px;line-height:34px}.fixed-table-pagination li.disabled a{pointer-events:none;cursor:default}.fixed-table-loading{display:none;position:absolute;top:42px;right:0;bottom:0;left:0;z-index:99;background-color:#fff;text-align:center}.fixed-table-body .card-view .title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.fixed-table-body thead th .th-inner{box-sizing:border-box}.table td,.table th{vertical-align:middle;box-sizing:border-box}.fixed-table-toolbar .dropdown-menu{text-align:left;max-height:300px;overflow:auto}.fixed-table-toolbar .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.fixed-table-toolbar .btn-group>.btn-group>.btn{border-radius:0}.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.bootstrap-table .table thead>tr>th{padding:0;margin:0}.pull-right .dropdown-menu{right:0;left:auto}p.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden} \ No newline at end of file diff --git a/web/querydsl/src/main/resources/static/bootstrap-table/bootstrap-table.min.js b/web/querydsl/src/main/resources/static/bootstrap-table/bootstrap-table.min.js new file mode 100644 index 00000000..71124592 --- /dev/null +++ b/web/querydsl/src/main/resources/static/bootstrap-table/bootstrap-table.min.js @@ -0,0 +1,8 @@ +/* +* bootstrap-table - v1.8.1 - 2015-05-29 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2015 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";var b=37,c=null,d="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==",e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC",f="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= ",g=function(a){var b=arguments,c=!0,d=1;return a=a.replace(/%s/g,function(){var a=b[d++];return"undefined"==typeof a?(c=!1,""):a}),c?a:""},h=function(b,c,d,e){var f="";return a.each(b,function(a,b){return b[c]===e?(f=b[d],!1):!0}),f},i=function(b,c){var d=-1;return a.each(b,function(a,b){return b.field===c?(d=a,!1):!0}),d},j=function(){if(null===c){var b,d,e=a("

    ").addClass("fixed-table-scroll-inner"),f=a("

    ").addClass("fixed-table-scroll-outer");f.append(e),a("body").append(f),b=e[0].offsetWidth,f.css("overflow","scroll"),d=e[0].offsetWidth,b===d&&(d=f[0].clientWidth),f.remove(),c=b-d}return c},k=function(b,c,d,e){var f=c;if("string"==typeof c){var h=c.split(".");h.length>1?(f=window,a.each(h,function(a,b){f=f[b]})):f=window[c]}return"object"==typeof f?f:"function"==typeof f?f.apply(b,d):!f&&"string"==typeof c&&g.apply(this,[c].concat(d))?g.apply(this,[c].concat(d)):e},l=function(a){return"string"==typeof a?a.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"):a},m=function(b){var c=0;return b.children().each(function(){c','
    ',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'
    ':"",'
    ','
    ','
    ','
    ',this.options.formatLoadingMessage(),"
    ","
    ",'',"bottom"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'
    ':"","
    ","
    "].join("")),this.$container.insertAfter(this.$el),this.$tableContainer=this.$container.find(".fixed-table-container"),this.$tableHeader=this.$container.find(".fixed-table-header"),this.$tableBody=this.$container.find(".fixed-table-body"),this.$tableLoading=this.$container.find(".fixed-table-loading"),this.$tableFooter=this.$container.find(".fixed-table-footer"),this.$toolbar=this.$container.find(".fixed-table-toolbar"),this.$pagination=this.$container.find(".fixed-table-pagination"),this.$tableBody.append(this.$el),this.$container.after('
    '),this.$el.addClass(this.options.classes),this.options.striped&&this.$el.addClass("table-striped"),-1!==a.inArray("table-no-bordered",this.options.classes.split(" "))&&this.$tableContainer.addClass("table-no-bordered")},o.prototype.initTable=function(){var b=this,c=[],d=[];this.$header=this.$el.find("thead"),this.$header.length||(this.$header=a("").appendTo(this.$el)),this.$header.find("tr").length||this.$header.append(""),this.$header.find("th").each(function(){var b=a.extend({},{title:a(this).html(),"class":a(this).attr("class")},a(this).data());c.push(b)}),this.options.columns=a.extend(!0,[],c,this.options.columns),a.each(this.options.columns,function(c,d){b.options.columns[c]=a.extend({},o.COLUMN_DEFAULTS,{field:c},d)}),this.options.data.length||(this.$el.find("tbody tr").each(function(){var c={};c._id=a(this).attr("id"),c._class=a(this).attr("class"),c._data=n(a(this).data()),a(this).find("td").each(function(d){var e=b.options.columns[d].field;c[e]=a(this).html(),c["_"+e+"_id"]=a(this).attr("id"),c["_"+e+"_class"]=a(this).attr("class"),c["_"+e+"_rowspan"]=a(this).attr("rowspan"),c["_"+e+"_data"]=n(a(this).data())}),d.push(c)}),this.options.data=d)},o.prototype.initHeader=function(){var c=this,d=[],e=[];this.header={fields:[],styles:[],classes:[],formatters:[],events:[],sorters:[],sortNames:[],cellStyles:[],clickToSelects:[],searchables:[]},!this.options.cardView&&this.options.detailView&&(e.push('
    '),d.push({})),a.each(this.options.columns,function(a,b){var f="",h="",i="",j="",k=g(' class="%s"',b["class"]),l=(c.options.sortOrder||b.order,"px"),m=b.width;return b.visible?void((!c.options.cardView||b.cardVisible)&&(void 0===b.width||c.options.cardView||"string"==typeof b.width&&-1!==b.width.indexOf("%")&&(l="%"),b.width&&"string"==typeof b.width&&(m=b.width.replace("%","").replace("px","")),h=g("text-align: %s; ",b.halign?b.halign:b.align),i=g("text-align: %s; ",b.align),j=g("vertical-align: %s; ",b.valign),j+=g("width: %s%s; ",b.checkbox||b.radio?36:m,l),d.push(b),c.header.fields.push(b.field),c.header.styles.push(i+j),c.header.classes.push(k),c.header.formatters.push(b.formatter),c.header.events.push(b.events),c.header.sorters.push(b.sorter),c.header.sortNames.push(b.sortName),c.header.cellStyles.push(b.cellStyle),c.header.clickToSelects.push(b.clickToSelect),c.header.searchables.push(b.searchable),e.push(""),e.push(g('
    ',c.options.sortable&&b.sortable?"sortable":"")),f=b.title,b.checkbox&&(!c.options.singleSelect&&c.options.checkboxHeader&&(f=''),c.header.stateField=b.field),b.radio&&(f="",c.header.stateField=b.field,c.options.singleSelect=!0),e.push(f),e.push("
    "),e.push('
    '),e.push(""),e.push(""))):void(b.field===c.options.sortName&&c.header.fields.push(b.field))}),this.$header.find("tr").html(e.join("")),this.$header.find("th").each(function(b){a(this).data(d[b])}),this.$container.off("click",".th-inner").on("click",".th-inner",function(b){c.options.sortable&&a(this).parent().data().sortable&&c.onSort(b)}),!this.options.showHeader||this.options.cardView?(this.$header.hide(),this.$tableHeader.hide(),this.$tableLoading.css("top",0)):(this.$header.show(),this.$tableHeader.show(),this.$tableLoading.css("top",b+"px"),this.getCaretHtml()),this.$selectAll=this.$header.find('[name="btSelectAll"]'),this.$container.off("click",'[name="btSelectAll"]').on("click",'[name="btSelectAll"]',function(){var b=a(this).prop("checked");c[b?"checkAll":"uncheckAll"]()})},o.prototype.initFooter=function(){!this.options.showFooter||this.options.cardView?this.$tableFooter.hide():this.$tableFooter.show()},o.prototype.initData=function(a,b){this.data="append"===b?this.data.concat(a):"prepend"===b?[].concat(a).concat(this.data):a||this.options.data,this.options.data="append"===b?this.options.data.concat(a):"prepend"===b?[].concat(a).concat(this.options.data):this.data,"server"!==this.options.sidePagination&&this.initSort()},o.prototype.initSort=function(){var b=this,c=this.options.sortName,d="desc"===this.options.sortOrder?-1:1,e=a.inArray(this.options.sortName,this.header.fields);-1!==e&&this.data.sort(function(f,g){b.header.sortNames[e]&&(c=b.header.sortNames[e]);var h=f[c],i=g[c],j=k(b.header,b.header.sorters[e],[h,i]);return void 0!==j?d*j:((void 0===h||null===h)&&(h=""),(void 0===i||null===i)&&(i=""),a.isNumeric(h)&&a.isNumeric(i)?(h=parseFloat(h),i=parseFloat(i),i>h?-1*d:d):h===i?0:("string"!=typeof h&&(h=h.toString()),-1===h.localeCompare(i)?-1*d:d))})},o.prototype.onSort=function(b){var c=a(b.currentTarget).parent(),d=this.$header.find("th").eq(c.index());return this.$header.add(this.$header_).find("span.order").remove(),this.options.sortName===c.data("field")?this.options.sortOrder="asc"===this.options.sortOrder?"desc":"asc":(this.options.sortName=c.data("field"),this.options.sortOrder="asc"===c.data("order")?"desc":"asc"),this.trigger("sort",this.options.sortName,this.options.sortOrder),c.add(d).data("order",this.options.sortOrder),this.getCaretHtml(),"server"===this.options.sidePagination?void this.initServer():(this.initSort(),void this.initBody())},o.prototype.initToolbar=function(){var b,c,d=this,e=[],f=0,h=0;this.$toolbar.html(""),"string"==typeof this.options.toolbar&&a(g('
    ',this.options.toolbarAlign)).appendTo(this.$toolbar).append(a(this.options.toolbar)),e=[g('
    ',this.options.buttonsAlign,this.options.buttonsAlign)],"string"==typeof this.options.icons&&(this.options.icons=k(null,this.options.icons)),this.options.showPaginationSwitch&&e.push(g('"),this.options.showRefresh&&e.push(g('"),this.options.showToggle&&e.push(g('"),this.options.showColumns&&(e.push(g('
    ',this.options.formatColumns()),'",'","
    ")),e.push("
    "),(this.showToolbar||e.length>2)&&this.$toolbar.append(e.join("")),this.options.showPaginationSwitch&&this.$toolbar.find('button[name="paginationSwitch"]').off("click").on("click",a.proxy(this.togglePagination,this)),this.options.showRefresh&&this.$toolbar.find('button[name="refresh"]').off("click").on("click",a.proxy(this.refresh,this)),this.options.showToggle&&this.$toolbar.find('button[name="toggle"]').off("click").on("click",function(){d.toggleView()}),this.options.showColumns&&(b=this.$toolbar.find(".keep-open"),h<=this.options.minimumCountColumns&&b.find("input").prop("disabled",!0),b.find("li").off("click").on("click",function(a){a.stopImmediatePropagation()}),b.find("input").off("click").on("click",function(){var b=a(this);d.toggleColumn(i(d.options.columns,a(this).data("field")),b.prop("checked"),!1),d.trigger("column-switch",a(this).data("field"),b.prop("checked"))})),this.options.search&&(e=[],e.push('"),this.$toolbar.append(e.join("")),c=this.$toolbar.find(".search input"),c.off("keyup drop").on("keyup drop",function(a){clearTimeout(f),f=setTimeout(function(){d.onSearch(a)},d.options.searchTimeOut)}),""!==this.options.searchText&&(c.val(this.options.searchText),clearTimeout(f),f=setTimeout(function(){c.trigger("keyup")},d.options.searchTimeOut)))},o.prototype.onSearch=function(b){var c=a.trim(a(b.currentTarget).val());this.options.trimOnSearch&&a(b.currentTarget).val()!==c&&a(b.currentTarget).val(c),c!==this.searchText&&(this.searchText=c,this.options.pageNumber=1,this.initSearch(),this.updatePagination(),this.trigger("search",c))},o.prototype.initSearch=function(){var b=this;if("server"!==this.options.sidePagination){var c=this.searchText&&this.searchText.toLowerCase(),d=a.isEmptyObject(this.filterColumns)?null:this.filterColumns;this.data=d?a.grep(this.options.data,function(a){for(var b in d)if(a[b]!==d[b])return!1;return!0}):this.options.data,this.data=c?a.grep(this.data,function(d,e){for(var f in d){f=a.isNumeric(f)?parseInt(f,10):f;var g=d[f],h=b.options.columns[i(b.options.columns,f)],j=a.inArray(f,b.header.fields);g=k(h,b.header.formatters[j],[g,d,e],g);var l=a.inArray(f,b.header.fields);if(-1!==l&&b.header.searchables[l]&&("string"==typeof g||"number"==typeof g)&&-1!==(g+"").toLowerCase().indexOf(c))return!0}return!1}):this.data}},o.prototype.initPagination=function(){if(!this.options.pagination)return void this.$pagination.hide();this.$pagination.show();var b,c,d,e,f,h,i,j,k,l=this,m=[],n=!1,o=this.getData();if("server"!==this.options.sidePagination&&(this.options.totalRows=o.length),this.totalPages=0,this.options.totalRows){if(this.options.pageSize===this.options.formatAllRows())this.options.pageSize=this.options.totalRows,n=!0;else if(this.options.pageSize===this.options.totalRows){var p="string"==typeof this.options.pageList?this.options.pageList.replace("[","").replace("]","").replace(/ /g,"").toLowerCase().split(","):this.options.pageList;p.indexOf(this.options.formatAllRows().toLowerCase())>-1&&(n=!0)}this.totalPages=~~((this.options.totalRows-1)/this.options.pageSize)+1,this.options.totalPages=this.totalPages}this.totalPages>0&&this.options.pageNumber>this.totalPages&&(this.options.pageNumber=this.totalPages),this.pageFrom=(this.options.pageNumber-1)*this.options.pageSize+1,this.pageTo=this.options.pageNumber*this.options.pageSize,this.pageTo>this.options.totalRows&&(this.pageTo=this.options.totalRows),m.push('
    ','',this.options.formatShowingRows(this.pageFrom,this.pageTo,this.options.totalRows),""),m.push('');var q=[g('',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?"dropdown":"dropup"),'",'"),m.push(this.options.formatRecordsPerPage(q.join(""))),m.push(""),m.push("
    ",'"),this.$pagination.html(m.join("")),e=this.$pagination.find(".page-list a"),f=this.$pagination.find(".page-first"),h=this.$pagination.find(".page-pre"),i=this.$pagination.find(".page-next"),j=this.$pagination.find(".page-last"),k=this.$pagination.find(".page-number"),this.options.pageNumber<=1&&(f.addClass("disabled"),h.addClass("disabled")),this.options.pageNumber>=this.totalPages&&(i.addClass("disabled"),j.addClass("disabled")),this.options.smartDisplay&&(this.totalPages<=1&&this.$pagination.find("div.pagination").hide(),(r.length<2||this.options.totalRows<=r[0])&&this.$pagination.find("span.page-list").hide(),this.$pagination[this.getData().length?"show":"hide"]()),n&&(this.options.pageSize=this.options.formatAllRows()),e.off("click").on("click",a.proxy(this.onPageListChange,this)),f.off("click").on("click",a.proxy(this.onPageFirst,this)),h.off("click").on("click",a.proxy(this.onPagePre,this)),i.off("click").on("click",a.proxy(this.onPageNext,this)),j.off("click").on("click",a.proxy(this.onPageLast,this)),k.off("click").on("click",a.proxy(this.onPageNumber,this))},o.prototype.updatePagination=function(b){b&&a(b.currentTarget).hasClass("disabled")||(this.options.maintainSelected||this.resetRows(),this.initPagination(),"server"===this.options.sidePagination?this.initServer():this.initBody(),this.trigger("page-change",this.options.pageNumber,this.options.pageSize))},o.prototype.onPageListChange=function(b){var c=a(b.currentTarget);c.parent().addClass("active").siblings().removeClass("active"),this.options.pageSize=c.text().toUpperCase()===this.options.formatAllRows().toUpperCase()?this.options.formatAllRows():+c.text(),this.$toolbar.find(".page-size").text(this.options.pageSize),this.updatePagination(b)},o.prototype.onPageFirst=function(a){this.options.pageNumber=1,this.updatePagination(a)},o.prototype.onPagePre=function(a){this.options.pageNumber--,this.updatePagination(a)},o.prototype.onPageNext=function(a){this.options.pageNumber++,this.updatePagination(a)},o.prototype.onPageLast=function(a){this.options.pageNumber=this.totalPages,this.updatePagination(a)},o.prototype.onPageNumber=function(b){this.options.pageNumber!==+a(b.currentTarget).text()&&(this.options.pageNumber=+a(b.currentTarget).text(),this.updatePagination(b))},o.prototype.initBody=function(b){var c=this,d=[],e=this.getData();this.trigger("pre-body",e),this.$body=this.$el.find("tbody"),this.$body.length||(this.$body=a("").appendTo(this.$el)),this.options.pagination&&"server"!==this.options.sidePagination||(this.pageFrom=1,this.pageTo=e.length);for(var f=this.pageFrom-1;f"),this.options.cardView&&d.push(g('',this.header.fields.length)),!this.options.cardView&&this.options.detailView&&d.push("",'','',"",""),a.each(this.header.fields,function(b,e){var j="",l=m[e],p="",q={},r="",s=c.header.classes[b],t="",u="",v=c.options.columns[i(c.options.columns,e)];if(n=g('style="%s"',o.concat(c.header.styles[b]).join("; ")),l=k(v,c.header.formatters[b],[l,m,f],l),m["_"+e+"_id"]&&(r=g(' id="%s"',m["_"+e+"_id"])),m["_"+e+"_class"]&&(s=g(' class="%s"',m["_"+e+"_class"])),m["_"+e+"_rowspan"]&&(u=g(' rowspan="%s"',m["_"+e+"_rowspan"])),q=k(c.header,c.header.cellStyles[b],[l,m,f],q),q.classes&&(s=g(' class="%s"',q.classes)),q.css){var w=[];for(var x in q.css)w.push(x+": "+q.css[x]);n=g('style="%s"',w.concat(c.header.styles[b]).join("; "))}m["_"+e+"_data"]&&!a.isEmptyObject(m["_"+e+"_data"])&&a.each(m["_"+e+"_data"],function(a,b){"index"!==a&&(t+=g(' data-%s="%s"',a,b))}),v.checkbox||v.radio?(p=v.checkbox?"checkbox":p,p=v.radio?"radio":p,j=[c.options.cardView?'
    ':'',"",c.options.cardView?"
    ":""].join(""),m[c.header.stateField]=l===!0||l&&l.checked):(l="undefined"==typeof l||null===l?c.options.undefinedText:l,j=c.options.cardView?['
    ',c.options.showHeader?g('%s',n,h(c.options.columns,"field","title",e)):"",g('%s',l),"
    "].join(""):[g("",r,s,n,t,u),l,""].join(""),c.options.cardView&&c.options.smartDisplay&&""===l&&(j="")),d.push(j)}),this.options.cardView&&d.push(""),d.push("")}d.length||d.push('',g('%s',this.$header.find("th").length,this.options.formatNoMatches()),""),this.$body.html(d.join("")),b||this.scrollTo(0),this.$body.find("> tr > td").off("click").on("click",function(){var b=a(this),d=b.parent(),e=c.data[d.data("index")],f=b[0].cellIndex,h=c.$header.find("th:eq("+f+")"),i=h.data("field"),j=e[i];c.trigger("click-cell",i,j,e,b),c.trigger("click-row",e,d),c.options.clickToSelect&&c.header.clickToSelects[d.children().index(a(this))]&&d.find(g('[name="%s"]',c.options.selectItemName))[0].click()}),this.$body.find("> tr > td").off("dblclick").on("dblclick",function(){var b=a(this),d=b.parent(),e=c.data[d.data("index")],f=b[0].cellIndex,g=c.$header.find("th:eq("+f+")"),h=g.data("field"),i=e[h];c.trigger("dbl-click-cell",h,i,e,b),c.trigger("dbl-click-row",e,d)}),this.$body.find("> tr > td > .detail-icon").off("click").on("click",function(){var b=a(this),d=b.parent().parent(),e=d.data("index"),f=c.options.data[e];d.next().is("tr.detail-view")?(b.find("i").attr("class","glyphicon glyphicon-plus icon-plus"),d.next().remove(),c.trigger("collapse-row",e,f)):(b.find("i").attr("class","glyphicon glyphicon-minus icon-minus"),d.after(g('%s',d.find("td").length,k(c.options,c.options.detailFormatter,[e,f],""))),c.trigger("expand-row",e,f,d.next().find("td"))),c.resetView()}),this.$selectItem=this.$body.find(g('[name="%s"]',this.options.selectItemName)),this.$selectItem.off("click").on("click",function(b){b.stopImmediatePropagation();var d=a(this).prop("checked"),e=c.data[a(this).data("index")];e[c.header.stateField]=d,c.options.singleSelect&&(c.$selectItem.not(this).each(function(){c.data[a(this).data("index")][c.header.stateField]=!1}),c.$selectItem.filter(":checked").not(this).prop("checked",!1)),c.updateSelected(),c.trigger(d?"check":"uncheck",e)}),a.each(this.header.events,function(b,d){if(d){"string"==typeof d&&(d=k(null,d)),!c.options.cardView&&c.options.detailView&&(b+=1);for(var e in d)c.$body.find("tr").each(function(){var f=a(this),g=f.find(c.options.cardView?".card-view":"td").eq(b),h=e.indexOf(" "),i=e.substring(0,h),j=e.substring(h+1),k=d[e];g.find(j).off(i).on(i,function(a){var d=f.data("index"),e=c.data[d],g=e[c.header.fields[b]];k.apply(this,[a,g,e,d])})})}}),this.updateSelected(),this.resetView(),this.trigger("post-body")},o.prototype.initServer=function(b,c){var d,e=this,f={},g={pageSize:this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,pageNumber:this.options.pageNumber,searchText:this.searchText,sortName:this.options.sortName,sortOrder:this.options.sortOrder};(this.options.url||this.options.ajax)&&("limit"===this.options.queryParamsType&&(g={search:g.searchText,sort:g.sortName,order:g.sortOrder},this.options.pagination&&(g.limit=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,g.offset=this.options.pageSize===this.options.formatAllRows()?0:this.options.pageSize*(this.options.pageNumber-1))),a.isEmptyObject(this.filterColumnsPartial)||(g.filter=JSON.stringify(this.filterColumnsPartial,null)),f=k(this.options,this.options.queryParams,[g],f),a.extend(f,c||{}),f!==!1&&(b||this.$tableLoading.show(),d=a.extend({},k(null,this.options.ajaxOptions),{type:this.options.method,url:this.options.url,data:"application/json"===this.options.contentType&&"post"===this.options.method?JSON.stringify(f):f,cache:this.options.cache,contentType:this.options.contentType,dataType:this.options.dataType,success:function(a){a=k(e.options,e.options.responseHandler,[a],a),e.load(a),e.trigger("load-success",a)},error:function(a){e.trigger("load-error",a.status)},complete:function(){b||e.$tableLoading.hide()}}),this.options.ajax?k(this,this.options.ajax,[d],null):a.ajax(d)))},o.prototype.getCaretHtml=function(){var b=this;a.each(this.$header.find("th"),function(c,g){a(g).data("field")===b.options.sortName?a(g).find(".sortable").css("background-image","url("+("desc"===b.options.sortOrder?f:d)+")"):a(g).find(".sortable").css("background-image","url("+e+")")})},o.prototype.updateSelected=function(){var b=this.$selectItem.filter(":enabled").length===this.$selectItem.filter(":enabled").filter(":checked").length;this.$selectAll.add(this.$selectAll_).prop("checked",b),this.$selectItem.each(function(){a(this).parents("tr")[a(this).prop("checked")?"addClass":"removeClass"]("selected")})},o.prototype.updateRows=function(){var b=this;this.$selectItem.each(function(){b.data[a(this).data("index")][b.header.stateField]=a(this).prop("checked")})},o.prototype.resetRows=function(){var b=this;a.each(this.data,function(a,c){b.$selectAll.prop("checked",!1),b.$selectItem.prop("checked",!1),c[b.header.stateField]=!1})},o.prototype.trigger=function(b){var c=Array.prototype.slice.call(arguments,1);b+=".bs.table",this.options[o.EVENTS[b]].apply(this.options,c),this.$el.trigger(a.Event(b),c),this.options.onAll(b,c),this.$el.trigger(a.Event("all.bs.table"),[b,c])},o.prototype.resetHeader=function(){clearTimeout(this.timeoutId_),this.timeoutId_=setTimeout(a.proxy(this.fitHeader,this),this.$el.is(":hidden")?100:0)},o.prototype.fitHeader=function(){var b,c,d=this;return d.$el.is(":hidden")?void(d.timeoutFooter_=setTimeout(a.proxy(d.fitHeader,d),100)):(b=this.$tableBody.get(0),c=b.scrollWidth>b.clientWidth&&b.scrollHeight>b.clientHeight+this.$header.height()?j():0,this.$el.css("margin-top",-this.$header.height()),this.$header_=this.$header.clone(!0,!0),this.$selectAll_=this.$header_.find('[name="btSelectAll"]'),this.$tableHeader.css({"margin-right":c}).find("table").css("width",this.$el.css("width")).html("").attr("class",this.$el.attr("class")).append(this.$header_),this.$header.find("th").each(function(b){d.$header_.find("th").eq(b).data(a(this).data())}),this.$body.find("tr:first-child:not(.no-records-found) > *").each(function(b){d.$header_.find("div.fht-cell").eq(b).width(a(this).innerWidth()) +}),this.$tableBody.off("scroll").on("scroll",function(){d.$tableHeader.scrollLeft(a(this).scrollLeft())}),void d.trigger("post-header"))},o.prototype.resetFooter=function(){var b=this,c=b.getData(),d=[];this.options.showFooter&&!this.options.cardView&&(!this.options.cardView&&this.options.detailView&&d.push(""),a.each(this.options.columns,function(a,e){var f="",h="",i=g(' class="%s"',e["class"]);e.visible&&(!b.options.cardView||e.cardVisible)&&(f=g("text-align: %s; ",e.falign?e.falign:e.align),h=g("vertical-align: %s; ",e.valign),d.push(""),d.push(k(e,e.footerFormatter,[c]," ")||" "),d.push(""))}),this.$tableFooter.find("tr").html(d.join("")),clearTimeout(this.timeoutFooter_),this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),this.$el.is(":hidden")?100:0))},o.prototype.fitFooter=function(){var b,c,d;return clearTimeout(this.timeoutFooter_),this.$el.is(":hidden")?void(this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),100)):(c=this.$el.css("width"),d=c>this.$tableBody.width()?j():0,this.$tableFooter.css({"margin-right":d}).find("table").css("width",c).attr("class",this.$el.attr("class")),b=this.$tableFooter.find("td"),void this.$tableBody.find("tbody tr:first-child:not(.no-records-found) > td").each(function(c){b.eq(c).outerWidth(a(this).outerWidth())}))},o.prototype.toggleColumn=function(a,b,c){if(-1!==a&&(this.options.columns[a].visible=b,this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns)){var d=this.$toolbar.find(".keep-open input").prop("disabled",!1);c&&d.filter(g('[value="%s"]',a)).prop("checked",b),d.filter(":checked").length<=this.options.minimumCountColumns&&d.filter(":checked").prop("disabled",!0)}},o.prototype.toggleRow=function(b,c,d){-1!==b&&a(this.$body[0]).children().filter(g(c?'[data-uniqueid="%s"]':'[data-index="%s"]',b))[d?"show":"hide"]()},o.prototype.resetView=function(a){var c=0;if(a&&a.height&&(this.options.height=a.height),this.$selectAll.prop("checked",this.$selectItem.length>0&&this.$selectItem.length===this.$selectItem.filter(":checked").length),this.options.height){var d=m(this.$toolbar),e=m(this.$pagination),f=this.options.height-d-e;this.$tableContainer.css("height",f+"px")}return this.options.cardView?(this.$el.css("margin-top","0"),void this.$tableContainer.css("padding-bottom","0")):(this.options.showHeader&&this.options.height?(this.$tableHeader.show(),this.resetHeader(),c+=b):(this.$tableHeader.hide(),this.trigger("post-header")),this.options.showFooter&&(this.resetFooter(),this.options.height&&(c+=b)),this.getCaretHtml(),void this.$tableContainer.css("padding-bottom",c+"px"))},o.prototype.getData=function(b){return!this.searchText&&a.isEmptyObject(this.filterColumns)&&a.isEmptyObject(this.filterColumnsPartial)?b?this.options.data.slice(this.pageFrom-1,this.pageTo):this.options.data:b?this.data.slice(this.pageFrom-1,this.pageTo):this.data},o.prototype.load=function(b){var c=!1;"server"===this.options.sidePagination?(this.options.totalRows=b.total,c=b.fixedScroll,b=b.rows):a.isArray(b)||(c=b.fixedScroll,b=b.data),this.initData(b),this.initSearch(),this.initPagination(),this.initBody(c)},o.prototype.append=function(a){this.initData(a,"append"),this.initSearch(),this.initPagination(),this.initBody(!0)},o.prototype.prepend=function(a){this.initData(a,"prepend"),this.initSearch(),this.initPagination(),this.initBody(!0)},o.prototype.remove=function(b){var c,d,e=this.options.data.length;if(b.hasOwnProperty("field")&&b.hasOwnProperty("values")){for(c=e-1;c>=0;c--)d=this.options.data[c],d.hasOwnProperty(b.field)&&-1!==a.inArray(d[b.field],b.values)&&this.options.data.splice(c,1);e!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initBody(!0))}},o.prototype.removeAll=function(){this.options.data.length>0&&(this.options.data.splice(0,this.options.data.length),this.initSearch(),this.initPagination(),this.initBody(!0))},o.prototype.removeByUniqueId=function(a){var b,c,d=this.options.uniqueId,e=this.options.data.length;for(b=e-1;b>=0;b--)c=this.options.data[b],c.hasOwnProperty(d)&&("string"==typeof c[d]?a=a.toString():"number"==typeof c[d]&&(Number(c[d])===c[d]&&c[d]%1===0?a=parseInt(a):c[d]===Number(c[d])&&0!==c[d]&&(a=parseFloat(a))),c[d]===a&&this.options.data.splice(b,1));e!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initBody(!0))},o.prototype.insertRow=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("row")&&(this.data.splice(a.index,0,a.row),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))},o.prototype.updateRow=function(b){b.hasOwnProperty("index")&&b.hasOwnProperty("row")&&(a.extend(this.data[b.index],b.row),this.initSort(),this.initBody(!0))},o.prototype.showRow=function(a){a.hasOwnProperty("index")&&this.toggleRow(a.index,void 0===a.isIdField?!1:!0,!0)},o.prototype.hideRow=function(a){a.hasOwnProperty("index")&&this.toggleRow(a.index,void 0===a.isIdField?!1:!0,!1)},o.prototype.getRowsHidden=function(b){var c=a(this.$body[0]).children().filter(":hidden"),d=0;if(b)for(;de||0>f||e>=this.data.length)){for(c=e;e+g>c;c++)for(d=f;f+h>d;d++)i.eq(c).find("td").eq(d).hide();j.attr("rowspan",g).attr("colspan",h).show()}},o.prototype.updateCell=function(a){a.hasOwnProperty("rowIndex")&&a.hasOwnProperty("fieldName")&&a.hasOwnProperty("fieldValue")&&(this.data[a.rowIndex][a.fieldName]=a.fieldValue,this.initSort(),this.initBody(!0))},o.prototype.getOptions=function(){return this.options},o.prototype.getSelections=function(){var b=this;return a.grep(this.data,function(a){return a[b.header.stateField]})},o.prototype.getAllSelections=function(){var b=this;return a.grep(this.options.data,function(a){return a[b.header.stateField]})},o.prototype.checkAll=function(){this.checkAll_(!0)},o.prototype.uncheckAll=function(){this.checkAll_(!1)},o.prototype.checkAll_=function(a){var b;a||(b=this.getSelections()),this.$selectItem.filter(":enabled").prop("checked",a),this.updateRows(),this.updateSelected(),a&&(b=this.getSelections()),this.trigger(a?"check-all":"uncheck-all",b)},o.prototype.check=function(a){this.check_(!0,a)},o.prototype.uncheck=function(a){this.check_(!1,a)},o.prototype.check_=function(a,b){this.$selectItem.filter(g('[data-index="%s"]',b)).prop("checked",a),this.data[b][this.header.stateField]=a,this.updateSelected(),this.trigger(a?"check":"uncheck",this.data[b])},o.prototype.checkBy=function(a){this.checkBy_(!0,a)},o.prototype.uncheckBy=function(a){this.checkBy_(!1,a)},o.prototype.checkBy_=function(b,c){if(c.hasOwnProperty("field")&&c.hasOwnProperty("values")){var d=this,e=[];a.each(this.options.data,function(f,h){return h.hasOwnProperty(c.field)?void(-1!==a.inArray(h[c.field],c.values)&&(d.$selectItem.filter(g('[data-index="%s"]',f)).prop("checked",b),h[d.header.stateField]=b,e.push(h),d.trigger(b?"check":"uncheck",h))):!1}),this.updateSelected(),this.trigger(b?"check-some":"uncheck-some",e)}},o.prototype.destroy=function(){this.$el.insertBefore(this.$container),a(this.options.toolbar).insertBefore(this.$el),this.$container.next().remove(),this.$container.remove(),this.$el.html(this.$el_.html()).css("margin-top","0").attr("class",this.$el_.attr("class")||"")},o.prototype.showLoading=function(){this.$tableLoading.show()},o.prototype.hideLoading=function(){this.$tableLoading.hide()},o.prototype.togglePagination=function(){this.options.pagination=!this.options.pagination;var a=this.$toolbar.find('button[name="paginationSwitch"] i');this.options.pagination?a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchDown):a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchUp),this.updatePagination()},o.prototype.refresh=function(a){a&&a.url&&(this.options.url=a.url,this.options.pageNumber=1),this.initServer(a&&a.silent,a&&a.query)},o.prototype.resetWidth=function(){this.options.showHeader&&this.options.height&&this.fitHeader(),this.options.showFooter&&this.fitFooter()},o.prototype.showColumn=function(a){this.toggleColumn(i(this.options.columns,a),!0,!0)},o.prototype.hideColumn=function(a){this.toggleColumn(i(this.options.columns,a),!1,!0)},o.prototype.filterBy=function(b){this.filterColumns=a.isEmptyObject(b)?{}:b,this.options.pageNumber=1,this.initSearch(),this.updatePagination()},o.prototype.scrollTo=function(a){return"string"==typeof a&&(a="bottom"===a?this.$tableBody[0].scrollHeight:0),"number"==typeof a&&this.$tableBody.scrollTop(a),"undefined"==typeof a?this.$tableBody.scrollTop():void 0},o.prototype.getScrollPosition=function(){return this.scrollTo()},o.prototype.selectPage=function(a){a>0&&a<=this.options.totalPages&&(this.options.pageNumber=a,this.updatePagination())},o.prototype.prevPage=function(){this.options.pageNumber>1&&(this.options.pageNumber--,this.updatePagination())},o.prototype.nextPage=function(){this.options.pageNumber + + + User Center + + + + + + + + + +
    +

    User Center

    + +
    +
    +

    Search

    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + + +
    MeFirstnameLastnameCitySteetEMail
    + + + + + + + +
    + + + + \ No newline at end of file