diff options
Diffstat (limited to 'juick-spring-www')
79 files changed, 0 insertions, 4805 deletions
diff --git a/juick-spring-www/.eslintrc b/juick-spring-www/.eslintrc deleted file mode 100644 index 70f0fc89..00000000 --- a/juick-spring-www/.eslintrc +++ /dev/null @@ -1,32 +0,0 @@ -{ - // Extend existing configuration - // from ESlint and eslint-plugin-react defaults. - "extends": [ - "eslint:recommended" - //, "plugin:react/recommended" - ], - // Enable ES6 support. If you want to use custom Babel - // features, you will need to enable a custom parser - // as described in a section below. - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "env": { - "browser": true, - "node": true - }, - // Enable custom plugin known as eslint-plugin-react - "plugins": [ - // "react" - ], - "rules": { - // Disable `no-console` rule - "no-console": 0, - // Give a warning if identifiers contain underscores - "no-underscore-dangle": 1, - // Default to single quotes and raise an error if something - // else is used - "quotes": [2, "single"] - } -}
\ No newline at end of file diff --git a/juick-spring-www/build.gradle b/juick-spring-www/build.gradle deleted file mode 100644 index 8c1df178..00000000 --- a/juick-spring-www/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -buildscript { - repositories { - mavenCentral() - jcenter() - } -} - -plugins { - id "com.moowork.node" version "1.1.0" -} - -task compileFrontend(type: NpmTask) { - args = ['run', 'compile'] -} - -apply plugin: 'java' -apply plugin: 'war' -apply plugin: 'org.akhikhl.gretty' -apply plugin: 'com.github.ben-manes.versions' - -def thymeleafVersion = "3.0.3.RELEASE" - -dependencies { - compile project(':juick-server') - compile "com.sun.mail:javax.mail:1.5.6" - compile "org.pegdown:pegdown:1.6.0" - compile "org.springframework:spring-webmvc:${rootProject.springFrameworkVersion}" - compile "org.springframework:spring-context-support:${rootProject.springFrameworkVersion}" - compile "org.thymeleaf:thymeleaf:${thymeleafVersion}" - compile "org.thymeleaf:thymeleaf-spring4:${thymeleafVersion}" - compile "org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.0.RELEASE" - compile "org.thymeleaf.extras:thymeleaf-extras-springsecurity4:3.0.2.RELEASE" - compile "nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:2.2.1" - - compile 'org.imgscalr:imgscalr-lib:4.2' - testCompile "junit:junit:${rootProject.junitVersion}" - testCompile "org.hamcrest:hamcrest-all:${rootProject.hamcrestVersion}" - testCompile "org.mockito:mockito-core:${rootProject.mockitoVersion}" - testCompile "org.springframework:spring-test:${rootProject.springFrameworkVersion}" - testCompile "ch.vorburger.mariaDB4j:mariaDB4j:2.2.3" - - testCompile "org.thymeleaf:thymeleaf-testing:3.0.2.RELEASE" - testCompile "org.springframework.security:spring-security-test:${rootProject.springSecurityVersion}" - - providedCompile "javax.servlet:javax.servlet-api:3.1.0" - - providedRuntime "mysql:mysql-connector-java:5.1.40" -} - -compileFrontend.dependsOn 'npmInstall' -war.dependsOn 'compileFrontend' -compileJava.options.encoding = 'UTF-8' - -gretty { - httpPort = 8080 - contextPath = '' - servletContainer = 'tomcat8' -} - -configurations { - all*.exclude module: 'commons-logging' -} diff --git a/juick-spring-www/lynks.txt b/juick-spring-www/lynks.txt deleted file mode 100644 index 8df4fe80..00000000 --- a/juick-spring-www/lynks.txt +++ /dev/null @@ -1,37 +0,0 @@ -* Exception Handling in Spring MVC -https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc - -* Spring security EL -http://docs.spring.io/spring-security/site/docs/4.2.0.RELEASE/reference/htmlsingle/#el-access - -* Tutorial: Using Thymeleaf -http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html - - -* Tutorial: Thymeleaf + Spring -http://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html - - -* Spring MVC and Thymeleaf: how to access data from templates -http://www.thymeleaf.org/doc/articles/springmvcaccessdata.html - - -* Thymeleaf + Spring Security integration basics -http://www.thymeleaf.org/doc/articles/springsecurity.html - - -* Thymeleaf Layout Dialect -https://ultraq.github.io/thymeleaf-layout-dialect/ - - -* Thymeleaf Testing Library -https://github.com/thymeleaf/thymeleaf-testing - - -* Markdown to HTML with Java/Scala -http://stackoverflow.com/questions/19784525/markdown-to-html-with-java-scala - - -* A pure-Java Markdown processor based on a parboiled PEG parser supporting a number of extensions - pegdown -https://github.com/sirthias/pegdown - diff --git a/juick-spring-www/package.json b/juick-spring-www/package.json deleted file mode 100644 index 2eda35cd..00000000 --- a/juick-spring-www/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "juick", - "version": "1.0.0", - "private": true, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "compile": "webpack --colors -p" - }, - "repository": { - "type": "git", - "url": "https://github.com/juick/juick.git" - }, - "license": "AGPLv3", - "devDependencies": { - "css-loader": "^0.23.1", - "csslint": "^1.0.2", - "csslint-loader": "^1.0.0", - "eslint": "^3.1.1", - "eslint-loader": "^1.4.1", - "extract-text-webpack-plugin": "^1.0.1", - "file-loader": "^0.9.0", - "globby": "^4.1.0", - "script-loader": "^0.7.0", - "style-loader": "^0.13.1", - "uglify-loader": "^1.3.0", - "url-loader": "^0.5.7", - "webpack": "^1.13.1" - }, - "dependencies": { - "autosize": "^3.0.16", - "classlist.js": "^1.1.20150312", - "element-closest": "^2.0.1", - "evil-icons": "^1.8.0", - "whatwg-fetch": "^1.0.0" - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/HelpService.java b/juick-spring-www/src/main/java/com/juick/www/HelpService.java deleted file mode 100644 index 8ece4cfb..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/HelpService.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.juick.www; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.cache.annotation.Cacheable; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.regex.Pattern; - -/** - * Created by aalexeev on 12/11/16. - */ -public class HelpService { - private static final Pattern LANG_PATTERN = Pattern.compile("[a-z]{2}"); - - private static final Pattern PAGE_PATTERN = Pattern.compile("[a-zA-Z0-9\\-_]+"); - - private final String helpPath; - - - public HelpService(String helpPath) { - this.helpPath = helpPath; - } - - @Cacheable("help") - public String getHelp(final String page, final String lang) { - if (canBePage(page) && canBeLang(lang)) { - String path = StringUtils.joinWith("/", helpPath, lang, page); - - try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path)) { - if (is != null) - return IOUtils.toString(is, StandardCharsets.UTF_8); - } catch (IOException e) { - } - } - return null; - } - - public boolean canBePage(final String anything) { - return anything != null && PAGE_PATTERN.matcher(anything).matches(); - } - - public boolean canBeLang(final String anything) { - return anything != null && LANG_PATTERN.matcher(anything).matches(); - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/WebApp.java b/juick-spring-www/src/main/java/com/juick/www/WebApp.java deleted file mode 100644 index 6b26ec03..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/WebApp.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.juick.www; - -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.math.NumberUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.Environment; -import rocks.xmpp.core.XmppException; -import rocks.xmpp.core.session.Extension; -import rocks.xmpp.core.session.XmppSessionConfiguration; -import rocks.xmpp.extensions.component.accept.ExternalComponent; - -import javax.annotation.PostConstruct; - -/** - * Created by vitalyster on 09.12.2016. - */ -public class WebApp implements AutoCloseable { - private static Logger logger = LoggerFactory.getLogger(WebApp.class); - - private ExternalComponent xmpp; - - public String tmpDir; - public String imgDir; - - private String xmppHost, xmppPassword, xmppJid; - private int xmppPort; - private boolean isXmppDisabled; - - - public WebApp(Environment conf) { - tmpDir = conf.getProperty("upload_tmp_dir", "/var/www/juick.com/i/tmp/"); - imgDir = conf.getProperty("img_path", "/var/www/juick.com/i/"); - isXmppDisabled = BooleanUtils.toBoolean(conf.getProperty("xmpp_disabled")); - xmppHost = conf.getProperty("xmpp_host", "localhost"); - xmppPort = NumberUtils.toInt(conf.getProperty("xmpp_port", "5347"), 5347); - xmppJid = conf.getProperty("xmpp_jid", "www.localhost"); - xmppPassword = conf.getProperty("xmpp_password"); - } - - @PostConstruct - public void init() { - if (!isXmppDisabled) { - setupXmppComponent(xmppHost, xmppPort, xmppJid, xmppPassword); - } - } - - @Override - public void close() { - try { - if (getXmpp() != null) - getXmpp().close(); - - logger.info("ExternalComponent on juick-www destroyed"); - } catch (Exception e) { - logger.warn("Exception occurs on juick-www destroy", e); - } - } - - public void setupXmppComponent(final String host, final int port, final String jid, final String password) { - XmppSessionConfiguration configuration = XmppSessionConfiguration.builder() - .extensions(Extension.of(com.juick.Message.class)) - .build(); - setXmpp(ExternalComponent.create(jid, password, configuration, host, port)); - try { - getXmpp().connect(); - } catch (XmppException e) { - logger.warn("xmpp extension", e); - } - } - - public ExternalComponent getXmpp() { - return xmpp; - } - - public void setXmpp(ExternalComponent xmpp) { - this.xmpp = xmpp; - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WebAppConfiguration.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WebAppConfiguration.java deleted file mode 100644 index 4482dce1..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/configuration/WebAppConfiguration.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.juick.www.configuration; - -import com.juick.www.HelpService; -import com.juick.www.WebApp; -import org.apache.commons.lang3.CharEncoding; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.cache.guava.GuavaCacheManager; -import org.springframework.cache.interceptor.KeyGenerator; -import org.springframework.cache.interceptor.SimpleKeyGenerator; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; -import org.springframework.context.support.ResourceBundleMessageSource; -import org.springframework.core.env.Environment; - -import javax.annotation.Resource; - -/** - * Created by aalexeev on 11/22/16. - */ -@Configuration -@PropertySource("classpath:juick.conf") -@EnableCaching -public class WebAppConfiguration { - @Resource - private Environment env; - - @Bean - public ResourceBundleMessageSource messageSource() { - ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); - - messageSource.setBasenames("messages", "errors"); - messageSource.setDefaultEncoding(CharEncoding.UTF_8); - messageSource.setFallbackToSystemLocale(false); - messageSource.setUseCodeAsDefaultMessage(true); - - return messageSource; - } - - @Bean - public WebApp webApp() { - return new WebApp(env); - } - - @Bean - public GuavaCacheManager cacheManager() { - return new GuavaCacheManager("help"); - } - - @Bean - public HelpService helpService() { - return new HelpService("help"); - } - - @Bean - public KeyGenerator keyGenerator() { - // configure and return an implementation of Spring's KeyGenerator SPI - return new SimpleKeyGenerator(); - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WebSecurityConfig.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WebSecurityConfig.java deleted file mode 100644 index 19485579..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/configuration/WebSecurityConfig.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.juick.www.configuration; - -import com.juick.server.security.entities.JuickUser; -import com.juick.service.UserService; -import com.juick.service.security.JuickUserDetailsService; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.PropertySource; -import org.springframework.core.env.Environment; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.userdetails.UserDetailsService; - -import javax.annotation.Resource; - -/** - * Created by aalexeev on 11/21/16. - */ -@EnableWebSecurity -@PropertySource("classpath:juick.conf") -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - @Resource - private Environment env; - @Resource - private UserService userService; - - @Bean("userDetailsService") - @Override - public UserDetailsService userDetailsServiceBean() throws Exception { - return super.userDetailsServiceBean(); - } - - @Override - public UserDetailsService userDetailsService() { - return new JuickUserDetailsService(userService); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .antMatchers("/settings", "/pm/**").authenticated() - .anyRequest().permitAll() - .and() - .anonymous().principal(JuickUser.ANONYMOUS_USER).authorities(JuickUser.ANONYMOUS_AUTHORITY) - .and() - .sessionManagement().invalidSessionUrl("/") - .and() - .logout().invalidateHttpSession(true).logoutUrl("/logout").logoutSuccessUrl("/") - .and() - .formLogin() - .loginPage("/login") - .permitAll() - .defaultSuccessUrl("/") - .loginProcessingUrl("/do_login") - .usernameParameter("j_username") - .passwordParameter("j_password") - .failureUrl("/login-error") - .and() - .rememberMe() - .tokenValiditySeconds(6 * 30 * 24 * 3600) - .alwaysRemember(true) - //.useSecureCookie(true) // TODO Enable if https is supports - .rememberMeCookieDomain(env.getProperty("web_domain", "juick.com")) - .userDetailsService(userDetailsService()) - .key(env.getProperty("auth_remember_me_key")) - .and() - .csrf().disable(); - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java deleted file mode 100644 index 33687983..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.juick.www.configuration; - -import com.juick.configuration.DataConfiguration; -import com.juick.configuration.SearchConfiguration; -import org.apache.commons.lang3.CharEncoding; -import org.springframework.web.filter.CharacterEncodingFilter; -import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; - -import javax.servlet.FilterRegistration; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; - -/** - * Created by aalexeev on 11/20/16. - */ -public class WwwInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { - - @Override - protected Class<?>[] getRootConfigClasses() { - return new Class<?>[]{ - WebAppConfiguration.class, - DataConfiguration.class, - SearchConfiguration.class, - WebSecurityConfig.class}; - } - - @Override - protected Class<?>[] getServletConfigClasses() { - return new Class<?>[]{WwwServletConfiguration.class}; - } - - @Override - protected String[] getServletMappings() { - return new String[]{"/"}; - } - - @Override - protected String getServletName() { - return "WWW-spring dispatcher servlet"; - } - - @Override - public void onStartup(ServletContext servletContext) throws ServletException { - super.onStartup(servletContext); - - FilterRegistration.Dynamic registration = servletContext.addFilter( - "encodingFilter", new CharacterEncodingFilter(CharEncoding.UTF_8, true)); - - registration.addMappingForUrlPatterns(null, true, "/*"); - } -} - diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwSecurityInitializer.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WwwSecurityInitializer.java deleted file mode 100644 index 0ea8c907..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwSecurityInitializer.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.juick.www.configuration; - -/** - * Created by vitalyster on 25.11.2016. - */ - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; - -import javax.servlet.ServletContext; - -public class WwwSecurityInitializer extends AbstractSecurityWebApplicationInitializer { - private final Logger logger = LoggerFactory.getLogger(getClass()); - - @Override - protected void afterSpringSecurityFilterChain(ServletContext servletContext) { - logger.info("SpringSecurityFilterChain initialized"); - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java deleted file mode 100644 index 5cd251e6..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.juick.www.configuration; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.juick.www.formatter.SpringDateFormatter; -import nz.net.ultraq.thymeleaf.LayoutDialect; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.CharEncoding; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; -import org.springframework.core.env.Environment; -import org.springframework.format.FormatterRegistry; -import org.springframework.http.CacheControl; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.web.multipart.MultipartResolver; -import org.springframework.web.multipart.commons.CommonsMultipartResolver; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import org.springframework.web.servlet.resource.PathResourceResolver; -import org.thymeleaf.extras.springsecurity4.dialect.SpringSecurityDialect; -import org.thymeleaf.spring4.SpringTemplateEngine; -import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; -import org.thymeleaf.spring4.view.ThymeleafViewResolver; -import org.thymeleaf.templatemode.TemplateMode; - -import javax.annotation.Resource; -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - * Created by vitalyster on 28.06.2016. - */ -@Configuration -@ComponentScan(basePackages = {"com.juick.www.controllers"}) -@PropertySource("classpath:juick.conf") -public class WwwServletConfiguration extends WebMvcConfigurationSupport { - @Resource - private Environment env; - - @Bean - public SpringResourceTemplateResolver templateResolver() { - // SpringResourceTemplateResolver automatically integrates with Spring's own - // resource resolution infrastructure, which is highly recommended. - SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); - templateResolver.setApplicationContext(getApplicationContext()); - templateResolver.setPrefix("/WEB-INF/templates/"); - templateResolver.setSuffix(".html"); - // HTML is the default value, added here for the sake of clarity. - templateResolver.setTemplateMode(TemplateMode.HTML); - // Template cache is true by default. Set to false if you want - // templates to be automatically updated when modified. - templateResolver.setCacheable(true); - - templateResolver.setCharacterEncoding(CharEncoding.UTF_8); - return templateResolver; - } - - @Bean - public SpringTemplateEngine templateEngine() { - // SpringTemplateEngine automatically applies SpringStandardDialect and - // enables Spring's own MessageSource message resolution mechanisms. - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - templateEngine.setTemplateResolver(templateResolver()); - // Enabling the SpringEL compiler with Spring 4.2.4 or newer can - // speed up execution in most scenarios, but might be incompatible - // with specific cases when expressions in one template are reused - // across different data types, so this flag is "false" by default - // for safer backwards compatibility. - templateEngine.setEnableSpringELCompiler(true); - // Thymeleaf Layout Dialect - templateEngine.addDialect(new LayoutDialect()); - // Thymeleaf Spring Security integration dialect - templateEngine.addDialect(new SpringSecurityDialect()); - - return templateEngine; - } - - @Bean - public ThymeleafViewResolver viewResolver() { - ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); - viewResolver.setTemplateEngine(templateEngine()); - viewResolver.setCharacterEncoding(CharEncoding.UTF_8); - - viewResolver.addStaticVariable( - "showSape", BooleanUtils.toBoolean(env.getProperty("template.showSape", "true"))); - viewResolver.addStaticVariable( - "showAdv", BooleanUtils.toBoolean(env.getProperty("template.showAdv", "true"))); - viewResolver.addStaticVariable( - "showSponsors", BooleanUtils.toBoolean(env.getProperty("template.showSponsors", "false"))); - - return viewResolver; - } - - @Override - protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) { - Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() - .serializationInclusion(JsonInclude.Include.NON_DEFAULT) - .serializationInclusion(JsonInclude.Include.NON_NULL) - .serializationInclusion(JsonInclude.Include.NON_ABSENT) - .serializationInclusion(JsonInclude.Include.NON_EMPTY); - - MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build()); - converter.getObjectMapper().registerModule(new Jdk8Module()); - converters.add(converter); - - super.configureMessageConverters(converters); - } - - @Override - protected void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.setOrder(0); - registry.addResourceHandler( - "/scripts.js*", - "/style.css*", - "/*.png", - "/favicon.ico") - .addResourceLocations("/") - .setCacheControl(CacheControl.maxAge(30, TimeUnit.DAYS)) - .resourceChain(true) - .addResolver(new PathResourceResolver()); - - registry.addResourceHandler("/static/**") - .addResourceLocations("/static/") - .setCacheControl(CacheControl.maxAge(30, TimeUnit.DAYS)); - } - - @Override - public RequestMappingHandlerMapping requestMappingHandlerMapping() { - RequestMappingHandlerMapping result = super.requestMappingHandlerMapping(); - - result.setOrder(1); - - return result; - } - - @Override - public void addFormatters(final FormatterRegistry registry) { - registry.addFormatter(dateFormatter()); - } - - @Bean - public SpringDateFormatter dateFormatter() { - return new SpringDateFormatter(); - } - - @Bean - public MultipartResolver multipartResolver() { - CommonsMultipartResolver resolver = new CommonsMultipartResolver(); - resolver.setMaxUploadSize(10000000); - return resolver; - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/ErrorController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/ErrorController.java deleted file mode 100644 index 57a34076..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/controllers/ErrorController.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.juick.www.controllers; - -import com.juick.server.util.HttpBadRequestException; -import com.juick.server.util.HttpForbiddenException; -import com.juick.server.util.HttpNotFoundException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; - -/** - * Created by aalexeev on 12/12/16. - */ -@ControllerAdvice -public class ErrorController { - private static Logger logger = LoggerFactory.getLogger(ErrorController.class); - - @ExceptionHandler(HttpBadRequestException.class) - @ResponseStatus(value = HttpStatus.BAD_REQUEST) - public String badRequest() { - return "views/error"; - } - - @ExceptionHandler(HttpForbiddenException.class) - @ResponseStatus(value = HttpStatus.FORBIDDEN) - public String forbidden() { - return "views/error"; - } - - @ExceptionHandler(HttpNotFoundException.class) - @ResponseStatus(value = HttpStatus.NOT_FOUND) - public String notFound() { - return "views/error"; - } - - @ExceptionHandler(Throwable.class) - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public String exception(final Throwable throwable, final Model model) { - logger.error("Exception during execution of SpringSecurity application", throwable); - - String errorMessage = (throwable != null ? throwable.getMessage() : "Unknown error"); - model.addAttribute("errorMessage", errorMessage); - - return "views/error"; - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java deleted file mode 100644 index 3387f821..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.juick.www.controllers; - -import com.juick.server.util.HttpNotFoundException; -import com.juick.util.UserUtils; -import com.juick.www.HelpService; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; - -import javax.inject.Inject; -import java.io.IOException; -import java.net.URISyntaxException; -import java.util.Locale; -import java.util.Objects; -import java.util.Optional; - -/** - * Created by aalexeev on 11/21/16. - */ -@Controller -public class HelpController { - @Inject - private HelpService helpService; - - @RequestMapping({"/help", "/help/{langOrPage}", "/help/{lang}/{page}"}) - public String showHelp( - Locale locale, - @PathVariable("lang") Optional<String> langParam, - @PathVariable("page") Optional<String> pageParam, - @PathVariable("langOrPage") Optional<String> langOrPageParam, - Model model) throws IOException, URISyntaxException { - - String page = pageParam.orElse("index"); - String lang = langParam.orElse(locale.getLanguage()); - - String navigation = null; - - if (langOrPageParam.isPresent()) { - String langOrPage = langOrPageParam.get(); - - if (helpService.canBeLang(langOrPage)) { - navigation = helpService.getHelp("navigation", langOrPage); - if (navigation != null) - lang = langOrPage; - } - - if (navigation == null && helpService.canBePage(langOrPage)) - page = langOrPage; - } - - String content = helpService.getHelp(page, lang); - if (content == null && !Objects.equals("index", page)) - content = helpService.getHelp("index", lang); - - if (navigation == null) - navigation = helpService.getHelp("navigation", lang); - - if (content == null || navigation == null) - throw new HttpNotFoundException(); - - model.addAttribute("help_nav", navigation); - model.addAttribute("help_data", content); - - return "views/help"; - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java deleted file mode 100644 index 87540795..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.juick.www.controllers; - -import com.juick.Message; -import com.juick.User; -import com.juick.service.MessagesService; -import com.juick.service.TagService; -import com.juick.service.UserService; -import com.juick.util.UserUtils; -import com.juick.www.util.EncodeUtils; -import org.apache.commons.lang3.StringEscapeUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.context.MessageSource; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; - -import javax.inject.Inject; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * Created by aalexeev on 11/21/16. - */ -@Controller -public class IndexController { - @Inject - private MessageSource messageSource; - @Inject - private UserService userService; - @Inject - private MessagesService messagesService; - @Inject - private TagService tagService; - - @RequestMapping(value = "/", method = RequestMethod.GET) - public String indexPage( - @RequestParam("show") Optional<String> paramShow, - @RequestParam("tag") Optional<String> paramTagStr, - @RequestParam(value = "before") Optional<Integer> paramBefore, - @RequestParam(value = "search", required = false) String paramSearch, - ModelMap model) throws IOException { - - int before = paramBefore.orElse(0); - String tag = paramTagStr.orElse(StringUtils.EMPTY); - - if (StringUtils.isNotEmpty(tag)) { - StringBuilder builder = new StringBuilder(); - builder.append("redirect:").append("/tag/").append(tag); - if (before > 0) - builder.append("?before=").append(before); - return builder.toString(); - } - - if (StringUtils.isNotEmpty(paramSearch) && paramSearch.length() > 64) - paramSearch = StringUtils.EMPTY; - - User visitor = UserUtils.getCurrentUser(); - - String title = StringUtils.EMPTY; - - List<Integer> mids = new ArrayList<>(); - - if (StringUtils.isNotEmpty(paramSearch)) { - title = "Поиск: " + StringEscapeUtils.escapeHtml4(paramSearch); - mids = messagesService.getSearch(EncodeUtils.encodeSphinx(paramSearch), - before); - } else if (!paramShow.isPresent()) { - mids = messagesService.getPopular(visitor.getUid(), before); - } else if (paramShow.get().equals("top")) { - return "redirect:/"; - } else if (paramShow.get().equals("my") && visitor.getUid() > 0) { - title = "Моя лента"; - mids = messagesService.getMyFeed(visitor.getUid(), before); - } else if (paramShow.get().equals("private") && visitor.getUid() > 0) { - title = "Приватные"; - mids = messagesService.getPrivate(visitor.getUid(), before); - } else if (paramShow.get().equals("discuss") && visitor.getUid() > 0) { - title = "Обсуждения"; - mids = messagesService.getDiscussions(visitor.getUid(), before); - } else if (paramShow.get().equals("recommended") && visitor.getUid() > 0) { - title = "Рекомендации"; - mids = messagesService.getRecommended(visitor.getUid(), before); - } else if (paramShow.get().equals("photos")) { - title = "Фотографии"; - mids = messagesService.getPhotos(visitor.getUid(), before); - } else if (paramShow.get().equals("all")) { - title = "Все сообщения"; - mids = messagesService.getAll(visitor.getUid(), before); - } - model.addAttribute("title", title); - model.addAttribute("tags", tagService.getPopularTags()); - List<Message> msgs = messagesService.getMessages(mids); - List<Integer> blUIDs = userService.checkBL(visitor.getUid(), - msgs.stream().map(m -> m.getUser().getUid()).collect(Collectors.toList())); - model.addAttribute("msgs", - msgs.stream().map(msg -> { - msg.ReadOnly |= blUIDs.contains(msg.getUser().getUid()); - if (msg.ReadOnly) { - msg.ReadOnly = visitor.getUid() != msg.getUser().getUid(); - } - return msg; - }).collect(Collectors.toList()) - ); - if (mids.size() >= 20) { - String nextpage = "?before=" + mids.get(mids.size() - 1); - if (paramShow.isPresent()) { - nextpage += "&show=" + paramShow.get(); - } - if (StringUtils.isNotEmpty(paramSearch)) { - nextpage += "&search=" + paramSearch; - } - model.addAttribute("nextpage", nextpage); - } - return "views/index"; - } - - @RequestMapping(value = "/login", method = RequestMethod.GET) - public String getLoginForm() { - return "views/login"; - } - - @RequestMapping(value = "/login-error", method = RequestMethod.GET) - public String getLoginErrorForm(Model model) { - model.addAttribute("loginError", true); - return "views/login"; - } -}
\ No newline at end of file diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/PMController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/PMController.java deleted file mode 100644 index f590fc7c..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/controllers/PMController.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.juick.www.controllers; - -import com.juick.Message; -import com.juick.User; -import com.juick.server.util.HttpBadRequestException; -import com.juick.server.util.HttpForbiddenException; -import com.juick.service.PMQueriesService; -import com.juick.service.TagService; -import com.juick.service.UserService; -import com.juick.util.MessageUtils; -import com.juick.util.UserUtils; -import com.juick.util.WebUtils; -import com.juick.www.WebApp; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import rocks.xmpp.addr.Jid; - -import javax.inject.Inject; -import java.util.List; - -/** - * Created by vitalyster on 09.12.2016. - */ -@Controller -public class PMController { - private static final Logger logger = LoggerFactory.getLogger(PMController.class); - - @Inject - PMQueriesService pmQueriesService; - @Inject - UserService userService; - @Inject - TagService tagService; - @Inject - WebApp webApp; - - @RequestMapping("/pm/inbox") - public String doGetInbox(ModelMap context) { - User visitor = UserUtils.getCurrentUser(); - - String title = "PM: Inbox"; - List<Message> msgs = pmQueriesService.getLastPMInbox(visitor.getUid()); - - msgs.forEach(m -> m.setText(MessageUtils.formatMessage(m.getText()))); - - context.put("title", title); - context.put("msgs", msgs); - context.put("tags", tagService.getPopularTags()); - - return "views/pm_inbox"; - } - - @RequestMapping(value = "/pm/sent", method = RequestMethod.GET) - public String doGetSent( - @RequestParam String uname, - ModelMap context) { - String title = "PM: Sent"; - User visitor = UserUtils.getCurrentUser(); - List<com.juick.Message> msgs = pmQueriesService.getLastPMSent(visitor.getUid()); - - if (WebUtils.isNotUserName(uname)) { - uname = StringUtils.EMPTY; - } - context.put("title", title); - context.put("msgs", msgs); - context.put("tags", tagService.getPopularTags()); - context.put("uname", uname); - return "views/pm_sent"; - } - - @RequestMapping(value = "/pm/send", method = RequestMethod.POST) - public String doPostPM( - @RequestParam String uname, - @RequestParam String body, - ModelMap context) { - User visitor = UserUtils.getCurrentUser(); - if (uname.startsWith("@")) { - uname = uname.substring(1); - } - int uid = 0; - if (WebUtils.isUserName(uname)) { - uid = userService.getUIDbyName(uname); - } - - if (uid == 0 || body == null || body.length() < 1 || body.length() > 10240) { - throw new HttpBadRequestException(); - } - - if (userService.isInBLAny(uid, visitor.getUid())) { - throw new HttpForbiddenException(); - } - - if (pmQueriesService.createPM(visitor.getUid(), uid, body)) { - if (webApp.getXmpp() != null) { - rocks.xmpp.core.stanza.model.Message msg = new rocks.xmpp.core.stanza.model.Message(); - msg.setFrom(Jid.of("juick@juick.com")); - msg.setTo(Jid.of(String.format("%d@push.juick.com", uid))); - com.juick.Message jmsg = new com.juick.Message(); - jmsg.setUser(visitor); - jmsg.setText(body); - msg.addExtension(jmsg); - webApp.getXmpp().send(msg); - - msg.setTo(Jid.of(String.format("%d@ws.juick.com", uid))); - webApp.getXmpp().send(msg); - - List<String> jids = userService.getJIDsbyUID(uid); - for (String jid : jids) { - rocks.xmpp.core.stanza.model.Message mm = new rocks.xmpp.core.stanza.model.Message(); - mm.setTo(Jid.of(jid)); - mm.setType(rocks.xmpp.core.stanza.model.Message.Type.CHAT); - if (pmQueriesService.havePMinRoster(visitor.getUid(), jid)) { - mm.setFrom(Jid.of(jmsg.getUser().getName(), "juick.com", "Juick")); - mm.setBody(body); - } else { - mm.setFrom(Jid.of("juick", "juick.com", "Juick")); - mm.setBody("Private message from @" + jmsg.getUser().getName() + ":\n" + body); - } - webApp.getXmpp().send(mm); - } - } else { - logger.warn("XMPP unavailable"); - } - return "redirect:/pm/sent"; - } - throw new HttpBadRequestException(); - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/PostController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/PostController.java deleted file mode 100644 index 8ad06402..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/controllers/PostController.java +++ /dev/null @@ -1,286 +0,0 @@ -package com.juick.www.controllers; - -import com.juick.Tag; -import com.juick.User; -import com.juick.server.util.HttpBadRequestException; -import com.juick.server.util.HttpForbiddenException; -import com.juick.server.util.HttpNotFoundException; -import com.juick.server.util.HttpUtils; -import com.juick.service.MessagesService; -import com.juick.service.SubscriptionService; -import com.juick.service.TagService; -import com.juick.service.UserService; -import com.juick.util.UserUtils; -import com.juick.www.WebApp; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang3.CharEncoding; -import org.apache.commons.lang3.StringUtils; -import org.imgscalr.Scalr; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; -import rocks.xmpp.addr.Jid; -import rocks.xmpp.core.stanza.model.Message; -import rocks.xmpp.extensions.nick.model.Nickname; -import rocks.xmpp.extensions.oob.model.x.OobX; - -import javax.imageio.ImageIO; -import javax.inject.Inject; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLEncoder; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; - -/** - * Created by vitalyster on 20.12.2016. - */ -@Controller -public class PostController { - - private static final Logger logger = LoggerFactory.getLogger(PostController.class); - - @Inject - MessagesService messagesService; - @Inject - UserService userService; - @Inject - SubscriptionService subscriptionService; - @Inject - TagService tagService; - @Inject - WebApp webApp; - @Inject - Environment env; - - @RequestMapping(value = "/post", method = RequestMethod.POST) - public String doPost( - @RequestParam(required = false, value = "tags") String tagsStr, - @RequestParam String body, - @RequestParam(required = false) String img, - @RequestParam(required = false) MultipartFile attach, - ModelMap modelMap - ) throws IOException { - body = body.replace("\r", StringUtils.EMPTY); - - List<Tag> tags = tagService.fromString(tagsStr, true); - - String attachmentFName = HttpUtils.receiveMultiPartFile(attach, env.getProperty("upload_tmp_dir", - "/var/www/juick.com/i/tmp/")); - - if (StringUtils.isBlank(attachmentFName) && img != null && img.length() > 10) { - try { - URL imgUrl = new URL(img); - attachmentFName = HttpUtils.downloadImage(imgUrl); - } catch (Exception e) { - logger.error("DOWNLOAD ERROR", e); - throw new HttpBadRequestException(); - } - } - - User visitor = UserUtils.getCurrentUser(); - - String attachmentType = StringUtils.isNotEmpty(attachmentFName) ? attachmentFName.substring(attachmentFName.length() - 3) : null; - int mid = messagesService.createMessage(visitor.getUid(), body, attachmentType, tags); - subscriptionService.subscribeMessage(mid, visitor.getUid()); - - Message xmsg = new Message(); - xmsg.setFrom(Jid.of("juick@juick.com")); - xmsg.setType(Message.Type.CHAT); - xmsg.setThread("juick-" + mid); - com.juick.Message jmsg = messagesService.getMessage(mid); - xmsg.addExtension(jmsg); - xmsg.addExtension(new Nickname("@" + jmsg.getUser().getName())); - - if (StringUtils.isNotEmpty(attachmentFName)) { - String fname = mid + "." + attachmentType; - String attachmentURL = "http://i.juick.com/photos-1024/" + fname; - - Path origName = Paths.get(webApp.imgDir, "p", fname); - Files.move(Paths.get(webApp.tmpDir, attachmentFName), origName); - BufferedImage originalImage = ImageIO.read(origName.toFile()); - ImageIO.write(Scalr.resize(originalImage, 1024), - FilenameUtils.getExtension(origName.toString()), - Paths.get(webApp.imgDir, "photos-1024", fname).toFile()); - ImageIO.write(Scalr.resize(originalImage, 512), - FilenameUtils.getExtension(origName.toString()), - Paths.get(webApp.imgDir, "photos-512", fname).toFile()); - ImageIO.write(Scalr.resize(originalImage, 160), - FilenameUtils.getExtension(origName.toString()), - Paths.get(webApp.imgDir, "ps", fname).toFile()); - - body = attachmentURL + "\n" + body; - try { - xmsg.addExtension(new OobX(new URI(attachmentURL))); - } catch (URISyntaxException e) { - logger.warn("invalid uri: {} exception {}", attachmentURL, e); - } - } - if (webApp.getXmpp() != null) { - - xmsg.setBody("@" + jmsg.getUser().getName() + ":" + jmsg.getTagsString() + "\n" + body + "\n\n#" + mid + " http://juick.com/" + mid); - - xmsg.setTo(Jid.of("juick@s2s.juick.com")); - webApp.getXmpp().send(xmsg); - - xmsg.setTo(Jid.of("juick@ws.juick.com")); - webApp.getXmpp().send(xmsg); - - xmsg.setTo(Jid.of("juick@push.juick.com")); - webApp.getXmpp().send(xmsg); - - xmsg.setTo(Jid.of("jubo@nologin.ru")); - webApp.getXmpp().send(xmsg); - } else { - logger.warn("XMPP unavailable"); - } - - String hashtags = StringUtils.EMPTY; - String tagscomma = StringUtils.EMPTY; - for (int i = 0; i < jmsg.getTags().size(); i++) { - if (i > 0) { - hashtags += " "; - tagscomma += ","; - } - hashtags += "#" + jmsg.getTags().get(i); - tagscomma += jmsg.getTags().get(i); - } - - String url = URLEncoder.encode("http://juick.com/" + mid, CharEncoding.UTF_8); - String sharetwi = hashtags + " " + body; - if (sharetwi.length() > 115) { - sharetwi = sharetwi.substring(0, 114) + "…"; - } - sharetwi += " http://juick.com/" + mid; - String sharelj = URLEncoder.encode(body + "\n", CharEncoding.UTF_8) + url; - - modelMap.put("title", "Сообщение опубликовано"); - modelMap.put("url", url); - modelMap.put("sharetwi", URLEncoder.encode(sharetwi, CharEncoding.UTF_8)); - modelMap.put("sharelj", sharelj); - modelMap.put("mid", mid); - - return "views/posted"; - } - - @RequestMapping(value = "/comment", method = RequestMethod.POST) - public String doComment( - @RequestParam(defaultValue = "0") int mid, - @RequestParam(required = false, defaultValue = "0") int rid, - @RequestParam String body, - @RequestParam(required = false) String img, - @RequestParam(required = false) MultipartFile attach) throws IOException { - com.juick.Message msg = messagesService.getMessage(mid); - if (msg == null) { - throw new HttpNotFoundException(); - } - - com.juick.Message reply = null; - if (rid > 0) { - reply = messagesService.getReply(mid, rid); - if (reply == null) { - throw new HttpNotFoundException(); - } - } - - if (body.length() < 1 || body.length() > 4096) { - throw new HttpBadRequestException(); - } - body = body.replace("\r", StringUtils.EMPTY); - - User visitor = UserUtils.getCurrentUser(); - - if ((msg.ReadOnly && msg.getUser().getUid() != visitor.getUid()) - || userService.isInBLAny(msg.getUser().getUid(), visitor.getUid()) - || (reply != null && userService.isInBLAny(reply.getUser().getUid(), visitor.getUid()))) { - throw new HttpForbiddenException(); - } - - String attachmentFName = HttpUtils.receiveMultiPartFile(attach, env.getProperty("upload_tmp_dir", - "/var/www/juick.com/i/tmp/")); - - if (StringUtils.isBlank(attachmentFName) && img != null && img.length() > 10) { - try { - URL imgUrl = new URL(img); - attachmentFName = HttpUtils.downloadImage(imgUrl); - } catch (Exception e) { - logger.error("DOWNLOAD ERROR", e); - throw new HttpBadRequestException(); - } - } - - String attachmentType = StringUtils.isNotEmpty(attachmentFName) ? attachmentFName.substring(attachmentFName.length() - 3) : null; - int ridnew = messagesService.createReply(mid, rid, visitor.getUid(), body, attachmentType); - subscriptionService.subscribeMessage(mid, visitor.getUid()); - - com.juick.Message jmsg = messagesService.getReply(mid, ridnew); - - Message xmsg = new Message(); - xmsg.setFrom(Jid.of("juick@juick.com")); - xmsg.setType(Message.Type.CHAT); - xmsg.setThread("juick-" + mid); - - xmsg.addExtension(jmsg); - - String quote = reply != null ? reply.getText() : msg.getText(); - if (quote.length() >= 50) { - quote = quote.substring(0, 47) + "..."; - } - xmsg.addExtension(new Nickname("@" + jmsg.getUser().getName())); - - if (StringUtils.isNotEmpty(attachmentFName)) { - String fname = mid + "-" + ridnew + "." + attachmentType; - String attachmentURL = "http://i.juick.com/photos-1024/" + fname; - - Path origName = Paths.get(webApp.imgDir, "p", fname); - Files.move(Paths.get(webApp.tmpDir, attachmentFName), origName); - BufferedImage originalImage = ImageIO.read(origName.toFile()); - ImageIO.write(Scalr.resize(originalImage, 1024), - FilenameUtils.getExtension(origName.toString()), - Paths.get(webApp.imgDir, "photos-1024", fname).toFile()); - ImageIO.write(Scalr.resize(originalImage, 512), - FilenameUtils.getExtension(origName.toString()), - Paths.get(webApp.imgDir, "photos-512", fname).toFile()); - ImageIO.write(Scalr.resize(originalImage, 160), - FilenameUtils.getExtension(origName.toString()), - Paths.get(webApp.imgDir, "ps", fname).toFile()); - - body = attachmentURL + "\n" + body; - try { - xmsg.addExtension(new OobX(new URI(attachmentURL))); - } catch (URISyntaxException e) { - logger.warn("invalid uri: {}, exception {}", attachmentURL, e); - } - } - - if (webApp.getXmpp() != null) { - - xmsg.setBody("Reply by @" + jmsg.getUser().getName() + ":\n>" + quote + "\n" + body + "\n\n#" + - mid + "/" + ridnew + " http://juick.com/" + mid + "#" + ridnew); - - xmsg.setTo(Jid.of("juick@s2s.juick.com")); - webApp.getXmpp().send(xmsg); - - xmsg.setTo(Jid.of("juick@ws.juick.com")); - webApp.getXmpp().send(xmsg); - - xmsg.setTo(Jid.of("juick@push.juick.com")); - webApp.getXmpp().send(xmsg); - } else { - logger.warn("XMPP unavailable"); - } - - return "redirect:/" + msg.getUser().getName() + "/" + mid + "#" + ridnew; - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java deleted file mode 100644 index 58668dc1..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java +++ /dev/null @@ -1,278 +0,0 @@ -package com.juick.www.controllers; - -import com.juick.User; -import com.juick.server.helpers.NotifyOpts; -import com.juick.server.helpers.UserInfo; -import com.juick.server.util.HttpBadRequestException; -import com.juick.server.util.HttpForbiddenException; -import com.juick.server.util.HttpUtils; -import com.juick.service.*; -import com.juick.util.UserUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang3.StringUtils; -import org.imgscalr.Scalr; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.Environment; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; - -import javax.imageio.ImageIO; -import javax.inject.Inject; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletResponse; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -/** - * Created by aalexeev on 11/21/16. - */ -@Controller -public class SettingsController { - private static final Logger logger = LoggerFactory.getLogger(SettingsController.class); - @Inject - UserService userService; - @Inject - TagService tagService; - @Inject - CrosspostService crosspostService; - @Inject - SubscriptionService subscriptionService; - @Inject - EmailService emailService; - @Inject - TelegramService telegramService; - @Inject - Environment env; - - @RequestMapping(value = "settings", method = RequestMethod.GET) - public String showSettings( - @RequestParam(required = false) String page, - @RequestParam(required = false) String code, - ModelMap context) { - User visitor = UserUtils.getCurrentUser(); - if (visitor.getUid() == 0) { - return "redirect:/login"; - } - List<String> pages = Arrays.asList("main", "password", "about", "auth-email", "privacy"); - if (StringUtils.isEmpty(page) || !pages.contains(page)) { - page = "main"; - } - context.put("title", "Настройки"); - context.put("tags", tagService.getPopularTags()); - context.put("auths", userService.getAuthCodes(visitor)); - context.put("eopts", userService.getEmailOpts(visitor)); - context.put("ehash", userService.getEmailHash(visitor)); - context.put("emails", userService.getEmails(visitor)); - context.put("jids", userService.getAllJIDs(visitor)); - List<String> hours = IntStream.rangeClosed(0, 23).boxed() - .map(i -> StringUtils.leftPad(String.format("%d", i), 2, "0")).collect(Collectors.toList()); - context.put("hours", hours); - context.put("fbstatus", crosspostService.getFbCrossPostStatus(visitor.getUid())); - context.put("twitter_name", crosspostService.getTwitterName(visitor.getUid())); - context.put("telegram_name", crosspostService.getTelegramName(visitor.getUid())); - context.put("notify_options", subscriptionService.getNotifyOptions(visitor)); - context.put("userinfo", userService.getUserInfo(visitor)); - if (page.equals("auth-email")) { - String response = emailService.verifyAddressByCode(visitor.getUid(), code) ? - "OK!" : "Sorry, code unknown."; - context.put("result", response); - } - return String.format("views/settings_%s", page); - } - @RequestMapping(value = "/settings", method = RequestMethod.POST) - protected String doPost( - HttpServletResponse response, - @RequestParam String page, - @RequestParam(required = false) String password, - @RequestParam(required = false) String jnotify, - @RequestParam(required = false) String subscr_notify, - @RequestParam(required = false) String recomm, - @RequestParam(required = false) String fullname, - @RequestParam(required = false) String country, - @RequestParam(required = false) String url, - @RequestParam(required = false) String descr, - @RequestParam(required = false) MultipartFile avatar, - @RequestParam(required = false) String account, - @RequestParam(required = false) String time, - ModelMap context) throws IOException { - User visitor = UserUtils.getCurrentUser(); - if (visitor.getUid() == 0) { - throw new HttpForbiddenException(); - } - List<String> pages = Arrays.asList("main", "password", "about", "email", "email-add", "email-del", - "email-subscr", "auth-email", "privacy", "jid-del", "twitter-del", "telegram-del", "facebook-disable", - "facebook-enable", "vk-del"); - if (StringUtils.isEmpty(page) || !pages.contains(page)) { - throw new HttpBadRequestException(); - } - String result = StringUtils.EMPTY; - switch (page) { - case "password": - if (userService.updatePassword(visitor, password)) { - result = "<p>Password has been changed.</p>"; - String hash = userService.getHashByUID(visitor.getUid()); - Cookie c = new Cookie("hash", hash); - c.setMaxAge(365 * 24 * 60 * 60); - // FIXME: use spring-security - response.addCookie(c); - } - break; - case "main": - NotifyOpts opts = new NotifyOpts(); - opts.setRepliesEnabled(StringUtils.isNotEmpty(jnotify)); - opts.setSubscriptionsEnabled(StringUtils.isNotEmpty(subscr_notify)); - opts.setRecommendationsEnabled(StringUtils.isNotEmpty(recomm)); - if (subscriptionService.setNotifyOptions(visitor, opts)) { - result = "<p>Notification options has been updated</p>"; - } - break; - case "about": - UserInfo info = new UserInfo(); - info.setFullName(fullname); - info.setCountry(country); - info.setUrl(url); - info.setDescription(descr); - String imgPath = env.getProperty("img_path", "/var/www/juick.com/i/"); - String tmpDir = env.getProperty("upload_tmp_dir", - "/var/www/juick.com/i/tmp/"); - String avatarTmpPath = HttpUtils.receiveMultiPartFile(avatar, tmpDir); - if (StringUtils.isNotEmpty(avatarTmpPath)) { - String originalExtension = FilenameUtils.getExtension(avatarTmpPath); - String originalName = String.format("%s.%s", visitor.getUid(), originalExtension); - String targetName = String.format("%s.png", visitor.getUid()); - Path ao = Paths.get(imgPath, "ao", originalName); - Path a = Paths.get(imgPath, "a", targetName); - Path as = Paths.get(imgPath, "as", targetName); - Files.move(Paths.get(tmpDir, avatarTmpPath), ao, StandardCopyOption.REPLACE_EXISTING); - BufferedImage originalImage = ImageIO.read(ao.toFile()); - ImageIO.write(Scalr.resize(originalImage, 96), "png", a.toFile()); - ImageIO.write(Scalr.resize(originalImage, 32), "png", as.toFile()); - } - if (userService.updateUserInfo(visitor, info)) { - result = String.format("<p>Your info is updated.</p><p><a href='/%s/'>Back to blog</a>.</p>", visitor.getName()); - } - break; - case "jid-del": - // FIXME: stop using ugnich-csv in parameters -// String[] params = request.getParameter("delete").split(";", 2); -// int res = -1; -// if (params[0].equals("xmpp")) { -// res = sql.update("DELETE FROM jids WHERE user_id=? AND jid=?", visitor.getUid(), params[1]); -// } else if (params[0].equals("xmpp-unauth")) { -// res = sql.update("DELETE FROM auth WHERE user_id=? AND protocol='xmpp' AND account=?", visitor.getUid(), params[1]); -// } -// if (res == 1) { -// result = "<p>Deleted. <a href=\"/settings\">Back</a>.</p>"; -// } else { -// result = "<p>Error</p>"; -// } - break; - case "email": - String newHash = userService.updateSecretEmail(visitor); - if (StringUtils.isNotEmpty(newHash)) { - result = String.format("<p>New secret email: <strong>%s@mail.juick.com</strong></p>" + - "<p><a href=\"/settings\">Back</a>.</p>", newHash); - } else { - throw new HttpBadRequestException(); - } - break; - case "email-add": - try { - emailService.verifyAddressByCode(visitor.getUid(), account); - } catch (EmptyResultDataAccessException e) { - String authCode = UserUtils.generateHash(8); - if (emailService.addVerificationCode(visitor.getUid(), account, authCode)) { - Session session = Session.getDefaultInstance(System.getProperties()); - try { - MimeMessage message = new MimeMessage(session); - message.setFrom(new InternetAddress("noreply@mail.juick.com")); - message.addRecipient(Message.RecipientType.TO, new InternetAddress(account)); - message.setSubject("Juick authorization link"); - message.setText(String.format("Follow link to attach this email to Juick account:\n" + - "http://juick.com/settings?page=auth-email&code=%s\n\n" + - "If you don't know, what this mean - just ignore this mail.\n", authCode)); - Transport.send(message); - result = "<p>Authorization link has been sent to your email. Follow it to proceed.</p>" + - "<p><a href=\"/settings\">Back</a></p>"; - - } catch (MessagingException ex) { - logger.error("mail exception", ex); - throw new HttpBadRequestException(); - } - } - } - break; - case "email-del": - if (emailService.deleteEmail(visitor.getUid(), account)) { - result = "<p>Deleted. <a href=\"/settings\">Back</a>.</p>"; - } else { - result = "<p>An error occured while deleting.</p>"; - } - break; - case "email-subscr": - if (emailService.setSubscriptionHour(visitor.getUid(), account, time)) { - result = String.format("<p>Saved! Will send to <strong>%s</strong> at <strong>%s:00 GMT</strong>." + - "</p><p><a href=\"/settings\">Back</a></p>", account, time); - } else { - result = "<p>Disabled.</p><p><a href=\"/settings\">Back</a></p>"; - } - break; - case "twitter-del": - crosspostService.deleteTwitterToken(visitor.getUid()); - // FIXME: use spring-security -// for (Cookie cookie : request.getCookies()) { -// if (cookie.getName().equals("request_token")) { -// cookie.setMaxAge(0); -// response.addCookie(cookie); -// } -// if (cookie.getName().equals("request_token_secret")) { -// cookie.setMaxAge(0); -// response.addCookie(cookie); -// } -// } - result = "<p><a href=\"/settings\">Back</a></p>"; - break; - case "telegram-del": - telegramService.deleteTelegramUser(visitor.getUid()); - result = "<p><a href=\"/settings\">Back</a></p>"; - break; - case "facebook-disable": - crosspostService.disableFBCrosspost(visitor.getUid()); - result = "<p><a href=\"/settings\">Back</a></p>"; - break; - case "facebook-enable": - crosspostService.enableFBCrosspost(visitor.getUid()); - result = "<p><a href=\"/settings\">Back</a></p>"; - break; - case "vk-del": - crosspostService.deleteVKUser(visitor.getUid()); - result = "<p><a href=\"/settings\">Back</a></p>"; - break; - default: - throw new HttpBadRequestException(); - } - context.put("title", "Настройки"); - context.put("result", result); - return "views/settings_result"; - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/ShowMessageController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/ShowMessageController.java deleted file mode 100644 index 93039a37..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/controllers/ShowMessageController.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.juick.www.controllers; - -import com.juick.User; -import com.juick.server.util.HttpNotFoundException; -import com.juick.service.MessagesService; -import com.juick.service.UserService; -import com.juick.util.WebUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.math.NumberUtils; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import javax.inject.Inject; - -/** - * Created by aalexeev on 11/21/16. - */ -@Controller -public class ShowMessageController { - @Inject - private UserService userService; - @Inject - private MessagesService messagesService; - - - @RequestMapping("/{anything}") - public String parseAnything( - @PathVariable String anything, - @RequestParam(required = false, defaultValue = "0") int before, - Model model) { - - if (before == 0) { - boolean isPostNumber = WebUtils.isPostNumber(anything); - int messageId = isPostNumber ? - NumberUtils.toInt(anything) : 0; - - if (isPostNumber && anything.equals(Integer.toString(messageId))) { - if (messageId > 0) { - com.juick.User author = messagesService.getMessageAuthor(messageId); - - if (author != null) - return "redirect:/" + author.getName() + "/" + anything; - } - - model.addAttribute("messageId", anything); - - throw new HttpNotFoundException(); - } - } - return showUserMessages(anything, null, before, model); - } - - //@RequestMapping("/{userName}/tag/{tagName}") - public String showUserMessagesByTag( - @PathVariable String userName, - @PathVariable String tagName, - @RequestParam(required = false, defaultValue = "0") int before, - Model model) { - - return showUserMessages(userName, tagName, before, model); - } - - private String showUserMessages( - String userName, - String tagName, - int before, - Model model) { - // Check validity of user name before quering from database - if (WebUtils.isNotUserName(userName)) { - model.addAttribute("userName", userName); - throw new HttpNotFoundException(); - } - - User user = userService.getUserByName(userName); - if (user.getUid() == 0) { - model.addAttribute("userName", userName); - throw new HttpNotFoundException(); - } - - return "views/index"; - } - - //@RequestMapping("/{userName}/friends") - public String getFriends( - @PathVariable String userName, - Model model) { - // Check validity of user name before quering from database - if (WebUtils.isNotUserName(userName)) { - model.addAttribute("userName", userName); - throw new HttpNotFoundException(); - } - - User user = userService.getUserByName(userName); - if (user.getUid() == 0) { - model.addAttribute("userName", userName); - throw new HttpNotFoundException(); - } - - return "views/index"; - } - - //@RequestMapping("/{userName}/readers") - public String getReaders( - @PathVariable String userName, - Model model) { - // Check validity of user name before quering from database - if (WebUtils.isNotUserName(userName)) { - model.addAttribute("userName", userName); - throw new HttpNotFoundException(); - } - - User user = userService.getUserByName(userName); - if (user.getUid() == 0) { - model.addAttribute("userName", userName); - throw new HttpNotFoundException(); - } - - return "views/index"; - } - - @RequestMapping("/{userName}/tags") - public String geTags( - @PathVariable String userName, - Model model) { - // Check validity of user name before quering from database - if (WebUtils.isNotUserName(userName)) { - model.addAttribute("userName", userName); - throw new HttpNotFoundException(); - } - - User user = userService.getUserByName(userName); - if (user.getUid() == 0) { - model.addAttribute("userName", userName); - throw new HttpNotFoundException(); - } - - return "views/index"; - } - - //@RequestMapping("/{userName}/{postNumber}") - public String checkShowPost( - @PathVariable String userName, - @PathVariable String postNumber, - Model model) { - // Check validity of post number before quering from database - if (WebUtils.isNotPostNumber(postNumber)) { - model.addAttribute("messageId", postNumber); - throw new HttpNotFoundException(); - } - - // Check validity of user name before quering from database - if (WebUtils.isNotUserName(userName)) { - model.addAttribute("userName", userName); - throw new HttpNotFoundException(); - } - - User user = userService.getUserByName(userName); - if (user.getUid() == 0) { - model.addAttribute("userName", userName); - throw new HttpNotFoundException(); - } - - - return "views/thread"; - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java deleted file mode 100644 index 8c4ab46d..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.juick.www.controllers; - -import com.juick.Message; -import com.juick.User; -import com.juick.server.util.HttpNotFoundException; -import com.juick.service.AdsService; -import com.juick.service.MessagesService; -import com.juick.service.TagService; -import com.juick.service.UserService; -import com.juick.util.UserUtils; -import com.juick.www.helpers.QueryString; -import org.apache.commons.lang3.CharEncoding; -import org.apache.commons.lang3.StringEscapeUtils; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import javax.inject.Inject; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * Created by aalexeev on 11/21/16. - */ -@Controller -public class TagController { - @Inject - private TagService tagService; - @Inject - private MessagesService messagesService; - @Inject - private AdsService adsService; - @Inject - private UserService userService; - - - @RequestMapping("/tag/{tagName}") - protected String doGet( - @PathVariable("tagName") String paramTagStr, - @RequestParam(value = "before", required = false, defaultValue = "0") Integer paramBefore, - @QueryString Optional<String> queryString, - ModelMap model) throws UnsupportedEncodingException { - User visitor = UserUtils.getCurrentUser(); - - com.juick.Tag paramTag = tagService.getTag(paramTagStr, false); - if (paramTag == null) { - throw new HttpNotFoundException(); - } else if (paramTag.SynonymID > 0 && paramTag.TID != paramTag.SynonymID) { - com.juick.Tag synTag = tagService.getTag(paramTag.SynonymID); - String url = "/tag/" + URLEncoder.encode(synTag.getName(), CharEncoding.UTF_8); - if (queryString.isPresent()) { - url += "?" + queryString.get(); - } - return "redirect:" + url; - } else if (!paramTag.getName().equals(paramTagStr)) { - String url = "/tag/" + URLEncoder.encode(paramTag.getName(), CharEncoding.UTF_8); - if (queryString.isPresent()) { - url += "?" + queryString.get(); - } - return "redirect:" + url; - } - - int visitor_uid = visitor != null ? visitor.getUid() : 0; - - String title = "*" + StringEscapeUtils.escapeHtml4(paramTag.getName()); - List<Integer> mids = messagesService.getTag(paramTag.TID, visitor_uid, paramBefore, (visitor == null) ? 40 : 20); - model.addAttribute("title", title); - if (tagService.getTagNoIndex(paramTag.TID)) { - model.addAttribute("headers", "<meta name=\"robots\" content=\"noindex,nofollow\"/>"); - } else if (paramBefore > 0 || mids.size() < 5) { - model.addAttribute("headers", "<meta name=\"robots\" content=\"noindex\"/>"); - } - if (mids.size() > 0) { - int vuid = visitor != null ? visitor.getUid() : 0; - int ad_mid = adsService.getAdMid(vuid); - if (ad_mid > 0 && mids.indexOf(ad_mid) == -1) { - mids.add(0, ad_mid); - adsService.logAdMid(vuid, ad_mid); - } else { - ad_mid = 0; - } - } - List<Message> msgs = messagesService.getMessages(mids); - List<Integer> blUIDs = userService.checkBL(visitor_uid, - msgs.stream().map(m -> m.getUser().getUid()).collect(Collectors.toList())); - model.addAttribute("msgs", - msgs.stream().map(msg -> { - msg.ReadOnly |= blUIDs.contains(msg.getUser().getUid()); - if (msg.ReadOnly) { - msg.ReadOnly = visitor.getUid() != msg.getUser().getUid(); - } - return msg; - }).collect(Collectors.toList()) - ); - if (mids.size() >= 20) { - String nextpage = "/tag/" + URLEncoder.encode(paramTag.getName(), CharEncoding.UTF_8) + "?before=" + mids.get(mids.size() - 1); - model.addAttribute("nextpage", nextpage); - } - model.addAttribute("tags", tagService.getPopularTags()); - return "views/index"; - } - - @RequestMapping("/tag") - public String redirectToMain() { - return "redirect:/"; - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/ThreadController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/ThreadController.java deleted file mode 100644 index f8693e13..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/controllers/ThreadController.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.juick.www.controllers; - -import com.juick.server.util.HttpForbiddenException; -import com.juick.service.MessagesService; -import com.juick.service.UserService; -import com.juick.util.UserUtils; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import javax.inject.Inject; - -/** - * Created by vitalyster on 20.12.2016. - */ -@Controller -public class ThreadController { - @Inject - MessagesService messagesService; - @Inject - UserService userService; - - @RequestMapping(value = "/{userName}/{mid}") - public String doGetThread( - @PathVariable int mid, - @RequestParam(required = false, value = "view") String paramView, - ModelMap modelMap) { - com.juick.User visitor = UserUtils.getCurrentUser(); - - if (!messagesService.canViewThread(mid, visitor.getUid())) { - throw new HttpForbiddenException(); - } - - com.juick.Message msg = messagesService.getMessage(mid); - - boolean listview = false; - if (paramView != null) { - if (paramView.equals("list")) { - listview = true; - if (visitor.getUid() > 0) { - userService.setUserOptionInt(visitor.getUid(), "repliesview", 1); - } - } else if (paramView.equals("tree") && visitor.getUid() > 0) { - userService.setUserOptionInt(visitor.getUid(), "repliesview", 0); - } - } else if (visitor.getUid() > 0 && userService.getUserOptionInt(visitor.getUid(), "repliesview", 0) == 1) { - listview = true; - } - - String title = msg.getUser().getName() + ": " + msg.getTagsString(); - - modelMap.put("title", title); - String headers = "<link rel=\"alternate\" type=\"application/rss+xml\" title=\"@" + msg.getUser().getName() + "\" href=\"//rss.juick.com/" + msg.getUser().getName() + "/blog\"/>"; - if (paramView != null) { - headers += "<link rel=\"canonical\" href=\"http://juick.com/" + msg.getUser().getName() + "/" + msg.getMid() + "\"/>"; - } - if (msg.Hidden) { - headers += "<meta name=\"robots\" content=\"noindex\"/>"; - } - modelMap.put("headers", headers); - modelMap.put("msg", msg); - modelMap.put("listview", listview); - return "views/thread"; - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/formatter/SpringDateFormatter.java b/juick-spring-www/src/main/java/com/juick/www/formatter/SpringDateFormatter.java deleted file mode 100644 index bbc776c2..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/formatter/SpringDateFormatter.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.juick.www.formatter; - -import com.juick.util.DateFormatter; -import org.springframework.context.MessageSource; -import org.springframework.format.Formatter; - -import javax.annotation.Resource; -import java.text.ParseException; -import java.util.Date; -import java.util.Locale; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -/** - * Created by aalexeev on 11/22/16. - */ -public class SpringDateFormatter implements Formatter<Date> { - @Resource - private MessageSource messageSource; - private ConcurrentMap<Locale, com.juick.util.DateFormatter> formattersMap = - new ConcurrentHashMap<>(4, 0.75f, 2); // MAX 4 languages and 4/2=2 threads for write - - - @Override - public Date parse(final String text, final Locale locale) throws ParseException { - DateFormatter formatter = formattersMap.getOrDefault( - locale, createFormatter(locale)); - - return formatter.parse(text); - } - - @Override - public String print(final Date object, final Locale locale) { - DateFormatter formatter = formattersMap.getOrDefault( - locale, createFormatter(locale)); - return formatter.format(object); - } - - private DateFormatter createFormatter(final Locale locale) { - String pattern = messageSource.getMessage("date.format", null, locale); - - return new DateFormatter(pattern); - } -} diff --git a/juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java b/juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java deleted file mode 100644 index 0eb6c76f..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.juick.www.helpers; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by vt on 22/03/16. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.PARAMETER) -public @interface QueryString { -}
\ No newline at end of file diff --git a/juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java b/juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java deleted file mode 100644 index 812c4497..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.juick.www.helpers; - -import org.springframework.core.MethodParameter; -import org.springframework.web.bind.support.WebDataBinderFactory; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.method.support.ModelAndViewContainer; - -import javax.servlet.http.HttpServletRequest; -import java.lang.annotation.Annotation; -import java.util.Optional; - -public class QueryStringResolver implements HandlerMethodArgumentResolver { - @Override - public boolean supportsParameter(MethodParameter parameter) { - Annotation[] parameterAnnotations = parameter.getParameterAnnotations(); - for (Annotation parameterAnnotation : parameterAnnotations) { - if (QueryString.class.isInstance(parameterAnnotation)) { - return true; - } - } - - return false; - } - - @Override - public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { - HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); - return Optional.ofNullable(request.getQueryString()); - } -}
\ No newline at end of file diff --git a/juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java b/juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java deleted file mode 100644 index a444ec4d..00000000 --- a/juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.juick.www.util; - -/** - * Created by vitalyster on 09.12.2016. - */ -public class EncodeUtils { - public static String encodeSphinx(String str) { - return str.replaceAll("@", "\\\\@"); - } -} diff --git a/juick-spring-www/src/main/resources/errors.properties b/juick-spring-www/src/main/resources/errors.properties deleted file mode 100644 index 7ec8fbfd..00000000 --- a/juick-spring-www/src/main/resources/errors.properties +++ /dev/null @@ -1,3 +0,0 @@ -error.title = Error page - -error.login=Wrong user or password
\ No newline at end of file diff --git a/juick-spring-www/src/main/resources/errors_ru.properties b/juick-spring-www/src/main/resources/errors_ru.properties deleted file mode 100644 index ca13b926..00000000 --- a/juick-spring-www/src/main/resources/errors_ru.properties +++ /dev/null @@ -1,3 +0,0 @@ -error.title = Произошла ошибка - -error.login=Произошла ошибка, проверьте имя пользователя и пароль
\ No newline at end of file diff --git a/juick-spring-www/src/main/resources/help b/juick-spring-www/src/main/resources/help deleted file mode 160000 -Subproject 491a2f167939a81fc6da354c67a1efdb7d60845 diff --git a/juick-spring-www/src/main/resources/messages.properties b/juick-spring-www/src/main/resources/messages.properties deleted file mode 100644 index 0d98f7d0..00000000 --- a/juick-spring-www/src/main/resources/messages.properties +++ /dev/null @@ -1,51 +0,0 @@ -date.format=MM/dd/yyyy - -link.settings=Settings -link.returnToMain=Back to Home Page -link.contacts=Contacts -link.help=Help -link.adv=Advertisement - -link.popular=Popular -link.allMessages=All messages -link.withPhotos=Photos -link.my=My feed -link.privateMessages=PM -link.discuss=Discuss -link.recommended=Recommended -link.postMessage=Post -link.logout=Logout - -link.settings.main=Main -link.settings.password=Password -link.settings.about=About - -label.sponsor=Sponsor -label.sponsors=Sponsors -label.search=Search -label.register=Register -label.username=User name -label.password=Password - -postForm.newMessage=New message -postForm.imageLink=Link to image (JPG/PNG, up to 10 MB) -postForm.orImageUpload=or <a href="#">Upload</a><br/> -postForm.tags=Tags (space separated) - -button.send=Send - -message.loginForSending=<a href="{0}">Login</a> for post messages and comments -message.recommend=Recommend -message.sendLoginToXmpp=Send <b>LOGIN</b> to <a href="xmpp:juick@juick.com?message;body=LOGIN">juick@juick.com</a> - -question.areRegistered=Are you registered? - -title.help=Help -title.loginOrSignup=Juick - Log In or Sign Up -title.index.anonym=Juick microblogs: popular posts -title.index.user=Popular -message.comment=Comment -postForm.writeReply=Write a reply -messages.next=Next -error.pageNotFound=Page not found -error.pageNotFound.description=Probably, user deleted this post, or this page never existed.
\ No newline at end of file diff --git a/juick-spring-www/src/main/resources/messages_ru.properties b/juick-spring-www/src/main/resources/messages_ru.properties deleted file mode 100644 index 20d53c8f..00000000 --- a/juick-spring-www/src/main/resources/messages_ru.properties +++ /dev/null @@ -1,51 +0,0 @@ -date.format=dd.MM.yyyy - -link.settings = Настройки -link.returnToMain =Вернуться на главную -link.contacts=Контакты -link.help=Помощь -link.adv=Реклама - -link.popular=Популярные -link.allMessages=Все сообщения -link.withPhotos=Фотографии -link.my=Моя лента -link.privateMessages=Приватные -link.discuss=Обсуждения -link.recommended=Рекомендации -link.postMessage=Написать сообщение -link.logout=Выйти - -link.settings.main=Главная -link.settings.password=Пароль -link.settings.about=О пользователе - -label.sponsor=Спонсор -label.sponsors=Спонсоры -label.search=Поиск -label.register=Зарегистрироваться -label.username=Имя пользователя -label.password=Пароль - -postForm.newMessage=Новое сообщение -postForm.imageLink=Ссылка на изображение (JPG/PNG, до 10Мб) -postForm.orImageUpload=или <a href="#">загрузить</a><br/> -postForm.tags=Теги (через пробел) - -button.send=Отправить - -message.loginForSending=Чтобы добавлять сообщения и комментарии, <a href="{0}">представьтесь</a> -message.recommend=Рекомендовать -message.sendLoginToXmpp=Отправьте <b>LOGIN</b> на <a href="xmpp:juick@juick.com?message;body=LOGIN">juick@juick.com</a> - -question.areRegistered=Уже зарегистрированы? - -title.help=Справка -title.loginOrSignup=Juick - Войдите в систему или зарегистрируйтесь -title.index.anonym=Микроблоги Juick: популярные записи -title.index.user=Популярные -message.comment=Комментировать -postForm.writeReply=Написать ответ -messages.next=Читать далее -error.pageNotFound=Страница не найдена -error.pageNotFound.description=Сожалеем, но страницу с этим адресом удалил её автор, либо её никогда не существовало.
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/mainLayout.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/mainLayout.html deleted file mode 100644 index c07886b6..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/mainLayout.html +++ /dev/null @@ -1,29 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> -<head> - <meta charset="UTF-8" /> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/> - - <link rel="stylesheet" href="/style.css" th:href="@{/style.css}"/> - - <script type="text/javascript" src="/scripts.js" th:href="@{/scripts.js}"></script> - - <title layout:title-pattern="$LAYOUT_TITLE - $CONTENT_TITLE">Juick.com</title> - <link rel="icon" href="//i.juick.com/favicon.png" th:href="@{/favicon.png}"/> - <!--[if lt IE 9 & (!IEMobile 7)]> - <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script> - <![endif]--> -</head> -<body id="body"> - <div layout:replace="~{layout/partial/navigation}">Navigation block</div> - <section id="content"> - <p layout:fragment="content">Main content</p> - </section> - <aside id="column"> - <p layout:fragment="column">Side column</p> - </aside> - <footer layout:replace="~{layout/partial/footer}">Footer</footer> -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/footer.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/footer.html deleted file mode 100644 index 1d565db3..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/footer.html +++ /dev/null @@ -1,37 +0,0 @@ -<footer layout:fragment="footer" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> - <div id="footer"> - <div id="footer-right"> - <a href="/help/ru/contacts" th:href="@{/help/contacts}" th:text="#{link.contacts}" rel="nofollow">Контакты</a> · - <a href="/help/" th:href="@{/help/}" th:text="#{link.help}" rel="nofollow">Справка</a> · - <a href="/help/ru/adv" th:href="@{/help/adv}" th:text="#{link.adv}" rel="nofollow">Реклама</a> - </div> - <div id="footer-social"> - <a href="https://twitter.com/Juick" rel="nofollow" class="ico32-twi">Twitter</a> - <a href="https://vk.com/juick" rel="nofollow" class="ico32-vk">VK</a> - <a href="https://www.facebook.com/JuickCom" rel="nofollow" class="ico32-fb">Facebook</a> - </div> - <div id="footer-left"> - <a href="http://juick.com">juick.com</a> © 2008-2017 - <div th:if="${showSponsors}"> - <span th:text="#{label.sponsors}">Спонсоры:</span> - <span th:text="${links}"> </span> - </div> - </div> - </div> - <script> - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); - ga('create','UA-385578-4','juick.com'); - ga('require','displayfeatures'); - ga('send','pageview'); - </script> - <script th:if="${showSape}"> - var _acic={dataProvider:10}; - (function(){ - var e=document.createElement('script');e.type='text/javascript';e.async=true;e.src='//www2.aci'+'nt.net/aci.js'; - var t=document.getElementsByTagName('script')[0];t.parentNode.insertBefore(e,t); - })(); - </script> -</footer>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/navigation.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/navigation.html deleted file mode 100644 index 3b2d3bff..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/navigation.html +++ /dev/null @@ -1,55 +0,0 @@ -<header layout:fragment="nav" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> - <div id="logo"><a href="/" th:href="@{/}">Juick</a></div> - <nav id="global"> - <ul> - <li><a href="/" th:href="@{/}" th:text="#{link.popular}">Популярные</a></li> - <li><a href="/?show=all" th:href="@{/?show=all}" rel="nofollow" th:text="#{link.allMessages}">Все сообщения</a></li> - <li><a href="/?show=photos" th:href="@{/?show=photos}" rel="nofollow" th:text="#{link.withPhotos}">Фотографии</a></li> - </ul> - </nav> - <div id="search"> - <form action="/"> - <input type="text" name="search" class="text" placeholder="Поиск" - th:placeholder="#{label.search}" th:value="${param.search}"/> - </form> - </div> - <section id="headdiv"> - <th:block th:if="${#authorization.expression('isAuthenticated()')}"> - <nav id="user"> - <ul> - <li> - <a href="/?show=my" th:href="@{/?show=my}" th:text="#{link.my}">Моя лента</a> - </li> - <li> - <a href="/pm/inbox" th:href="@{/pm/inbox}" th:text="#{link.privateMessages}">Приватные</a> - </li> - <li> - <a href="/?show=discuss" th:href="@{/?show=discuss}" th:text="#{link.discuss}">Обсуждения</a> - </li> - <li> - <a href="/?show=recommended" th:href="@{/?show=recommended}" th:text="#{link.recommended}">Рекомендации</a> - </li> - </ul> - </nav> - <nav id="actions"> - <ul> - <li> - <a href="/#post" th:href="@{/#post}" th:text="#{link.postMessage}">Написать</a> - </li> - <li> - <a href="/ugnich" th:href="@{/{userName}(userName=${#authentication.name})}" th:text="'@'+${#authentication.name}">@ugnich</a> - </li> - <li> - <a href="/settings" th:href="@{/settings}" th:text="#{link.settings}" rel="nofollow">Настройки</a> - </li> - <li> - <a href="/logout" th:href="@{/logout}" th:text="#{link.logout}">Выйти</a> - </li> - </ul> - </nav> - </th:block> - <th:block th:if="${#authorization.expression('isAnonymous()')}"> - <p>[(#{message.loginForSending(@{/login})})]</p> - </th:block> - </section> -</header>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/error.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/error.html deleted file mode 100644 index 9d763feb..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/error.html +++ /dev/null @@ -1,16 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:text="#{error.pageNotFound}">Page not found</title> -</head> -<body> -<section id="content"> - <article layout:fragment="content"> - <h1 th:text="#{error.pageNotFound}">Page not found</h1> - <p th:text="#{error.pageNotFound.description}">Probably, user deleted this post, or this page never existed.</p> - </article> -</section> -<p layout:fragment="column" th:replace="views/partial/homecolumn">Main side column</p> -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/help.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/help.html deleted file mode 100644 index d935b9d4..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/help.html +++ /dev/null @@ -1,17 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:text="#{title.help}">Help title</title> -</head> - -<body> -<section id="content"> - <article layout:fragment="content" th:utext="${help_data}">Help text</article> -</section> -<aside id="column"> - <p layout:fragment="column" th:utext="${help_nav}">Help navigation</p> -</aside> -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/index.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/index.html deleted file mode 100644 index 24aa9472..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/index.html +++ /dev/null @@ -1,21 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:if="${#authorization.expression('isAuthenticated()')}" th:text="${title}">Page title</title> -</head> - -<body> -<th:block layout:fragment="content"> - <div th:replace="views/partial/blog_postform"></div> - <div th:replace="views/partial/blog_messages"></div> - <div th:replace="views/partial/blog_paginator"></div> -</th:block> - -<aside id="column"> - <p layout:fragment="column" th:replace="views/partial/homecolumn">Main side column</p> -</aside> - -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/login.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/login.html deleted file mode 100644 index 2736ca53..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/login.html +++ /dev/null @@ -1,145 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org"> -<head> - <meta charset="UTF-8" /> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/> - - <title th:text="#{title.loginOrSignup}">Juick</title> - <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" defer="defer"></script> - <style> - * { margin: 0; padding: 0; } - html { font-family: sans-serif; } - html { background: #eeeee5; } - body { margin: 100px auto 0 auto; width: 1000px; } - a { color: #069; } - ul { float: left; width: 700px; height: 350px; list-style-type: none; background: url(/static/tagscloud.png) no-repeat; position: relative; } - ul a { position: absolute; display: block; text-indent: 100%; white-space: nowrap; overflow: hidden; } - - #bottom1 { position: absolute; left: 0px; bottom: 10px; width: 100%; text-align: center; color: #555; } - #bottom2 { position: absolute; left: 0px; bottom: -50px; width: 100%; padding-bottom: 20px; text-align: center; font-size: small; color: #777; } - - #signup,#signin { margin-left: 730px; width: 250px; } - #signup { padding-top: 25px; } - #signup>div { width: 100%; margin: 15px 0; } - #signup>div>a { display: block; width: 100%; height: 32px; line-height: 32px; text-indent: 37px; text-decoration: none; overflow: hidden; } - - #facebook a { color: #FFF; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAADNQTFRFO1edX3ewl6bLnKrOoK3QrrrYvMXe2N7r3OLu3+Tv5urz7O/29vf6+Pn7+vv9/Pz9////ykQjsQAAAEZJREFUOMtjYBgFuAATO68ADxdOaUYuATDAqYBbAL8CFgECCjiBcqz4XMiPz3oQEKCtAgEkwEdIAQchBWyEFDAPkDdHsAIAhZkIwz/VK/UAAAAASUVORK5CYII=") no-repeat #3A569C; } - #vk a { color: #FFF; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAHJQTFRFbY+zbo+zbpCzb5C0cpO1c5O2dZW3dpa4e5m6gJ29gZ69lq/In7bNo7jPrcDUs8XXvs3dv87dy9fkztnlz9rm0Nrm093o1N7o1+Dq3OTt3ubu4Ofv5Orw7fH27vL28PP38vX49Pb5+vv8+/z9/Pz9////2jSYlQAAAG5JREFUOMvtkEcOgDAMBE3vvXdIyP+/iMMRKfYHmMtcRtE6AD8f1Is8pyKgAs0RGYO2HSWqMQaoBHVRgYsS3AsrtyFlrqgdJlCLb95gxQO6IkZCqL+KCjz0TQU5ejOf2a3aJXPF7BOB2PvMhp8PDzGRFgEe7xvEAAAAAElFTkSuQmCC") no-repeat #6d8fb3; } - #xmpp>a { color: #333; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAt9QTFRFBj5rCUFoFz5mDEFuDUNqGUJkGUNgAEprEkVtGkRhHURnHEZjAE+BIElmEEx/HEx0PUdTHE5wMEtfO0laJk5sFlN6Nk1cKFBuIlJ1R0pYRExTGF2KMVh1OFhxDGSQT1deNlx6TVhkIGKPUlphKWOFU1tiOmB+Vl1kmlAuNmaDQGpaIG6ba2Q2SGeBN2uUNW+LF3mGRmyLV3BAL3xWgmVJ2VAa2lEb0VYX11UafWlmam9mam5xy1km3lUea29y2VccvF8obHBz21gd4VcXS3ebPoVG1lwl5FkaU3iYYHaH2F0ejHFIx2Iv4V0aP4o+02As218g4l4bPYtFX351KZFaymU43mIrVYoz5mEfT4w0xGsrSo82eXqDw2s+z2k1OZVAT4SoPZU5RZM4NJVYbYc8VoSiWY43WItbuXBK52gYOI20TpM6YYSYfX98T5Q7foB9aYSZSZc8Ro21cYxH7GwdT46e0HFGeopO2HA8V5ZEf4s8528l1HM7UJs5UI+xXoyrWZhGY4ylyHdMwXhXQZS7XpdNU5tH4XJBYJZZcIuhbpJk0HdPU588kohqOZ2pVZS30XpX6XcxSaFrz4FIUqVWWqVCYZm23YBGxYRrZZ2QXpy/5YFC7IA+6oBRb6ZUcKZn44ZSgKJu54hHmJqXbbBNfKh3cq5nYqrMpJyVdrBjx5WCo56diamAjaWdyZeE8JFV8ZJWnqOlaK/Sd7Zh7pVdgbN6x52N8JdfwqCU8ZhgZLbXb7a5grtTmK+UxKKWtqahq6qhd7bHqauop6yvqqyp755pbbzRrK6rwamgib53qq+xra+sobSg86Jza8PJsLKujMVctrGwqLapv7Crr7Wr8ad1srSxj8R9uLOys7WyubSztLazkcZ/sre6tbe0r7m0tri1t7m2vri3uLq3v7m4ubu4nc9mpNBvos2UptJxtNWXtteFuNmbuNyQud2Rut6SwN+aweCbwuGdw+KeweKkF4OfHQAAAadJREFUOMtjeEoAMAwfBQ9vYJO68RCu4BYDq1bXmr2XHoMlnlzet2qGpTgX8y2EFWwensEdrW2FbUAlJ2zDKsqaYwo6eZHcIGzoor/s5IdPSfefPt3nf3Xn3HZpPU8xJAXWIvU88VOffcm78vTptrijJe4OfAmy1kgKzjMlaIfUPvvQcObp03U120ucTZQaGc8je1NZrd8g8cL7eUufPp0wfX2mvVydripKONzkTG1JXvL6TuXTR/Zb5gR6F+Vw30QNqNUss/pqn3/MvrTD7Wy1V9Y0jtXoIZnLv2nSnrfzF3bP3hDRu1wwHzOo1VWOTXn5yi/q7MTJuxTUscTFQyHNc5vfbU1btOCgjNBDbJH1UF5i9/XP6VVrJRUfYo/Nx3YcpS/euOo4Pn6MqeDx44f3LoY2SYnOXBlUfPPug8cwRQxQ6Qf39sda+HqZaQiwGydFlx+4eQ+qAqrg4b3bPqbmNhkrNm5cbGUUHply7d6Dh8hWPH744Oa186eOHDl06NDh46fP33zwEMUEiCMe3L13GwjuPbj38PHTx9jT5OPHj5G9MFQyDgA8riWAv9eLFAAAAABJRU5ErkJggg==") no-repeat #BBB; } - #xmppinfo { background: #FFF; padding: 10px; display: none; } - - #signin { text-align: center; font-size: small; } - #signinform { background: #FFF; padding: 10px 15px; margin-top: 15px; display: none; } - input.txt { width: 212px; border: 1px solid #CCC; margin: 3px 0; padding: 3px; } - input.submit { width: 70px; border: 1px solid #CCC; margin: 3px 0; padding: 3px; } - </style> - <link rel="icon" href="//i.juick.com/favicon.png" th:href="@{/favicon.png}"/> -</head> -<body> - -<ul id="tags"> - <li><a href="/tag/juick" th:href="@{/tag/juick}" style="left: 359px; top: 120px; width: 311px; height: 99px">juick</a></li> - <li><a href="/tag/linux" th:href="@{/tag/linux}" style="left: 201px; top: 100px; width: 98px; height: 35px">linux</a></li> - <li><a href="/tag/android" th:href="@{/tag/android}" style="left: 314px; top: 42px; width: 45px; height: 158px">android</a></li> - <li><a href="/tag/работа" th:href="@{/tag/работа}" style="left: 149px; top: 138px; width: 165px; height: 41px">работа</a></li> - <li><a href="/tag/music" th:href="@{/tag/music}" style="left: 119px; top: 249px; width: 124px; height: 32px">music</a></li> - <li><a href="/tag/windows" th:href="@{/tag/windows}" style="left: 448px; top: 234px; width: 186px; height: 32px">windows</a></li> - <li><a href="/tag/google" th:href="@{/tag/google}" style="left: 244px; top: 252px; width: 134px; height: 41px">google</a></li> - <li><a href="/tag/кино" th:href="@{/tag/кино}" style="left: 68px; top: 83px; width: 97px; height: 28px">кино</a></li> - <li><a href="/tag/фото" th:href="@{/tag/фото}" style="left: 400px; top: 266px; width: 101px; height: 29px">фото</a></li> - <li><a href="/tag/жизнь" th:href="@{/tag/жизнь}" style="left: 554px; top: 266px; width: 125px; height: 27px">жизнь</a></li> - <li><a href="/tag/еда" th:href="@{/tag/еда}" style="left: 46px; top: 196px; width: 71px; height: 32px">еда</a></li> - <li><a href="/tag/музыка" th:href="@{/tag/музыка}" style="left: 61px; top: 111px; width: 139px; height: 27px">музыка</a></li> - <li><a href="/tag/прекрасное" th:href="@{/tag/прекрасное}" style="left: 152px; top: 200px; width: 205px; height: 32px">прекрасное</a></li> - <li><a href="/tag/книги" th:href="@{/tag/книги}" style="left: 148px; top: 293px; width: 103px; height: 25px">книги</a></li> - <li><a href="/tag/цитата" th:href="@{/tag/цитата}" style="left: 325px; top: 301px; width: 126px; height: 27px">цитата</a></li> <li><a href="/tag/games" style="left: 117px; top: 142px; width: 30px; height: 104px">games</a></li> - <li><a href="/tag/ubuntu" th:href="@{/tag/ubuntu}" style="left: 503px; top: 2px; width: 28px; height: 102px">ubuntu</a></li> - <li><a href="/tag/котэ" th:href="@{/tag/котэ}" style="left: 534px; top: 27px; width: 76px; height: 28px">котэ</a></li> - <li><a href="/tag/ВНЕЗАПНО" th:href="@{/tag/ВНЕЗАПНО}" style="left: 501px; top: 293px; width: 146px; height: 23px">ВНЕЗАПНО</a></li> - <li><a href="/tag/юмор" th:href="@{/tag/юмор}" style="left: 73px; top: 53px; width: 84px; height: 28px">юмор</a></li> - <li><a href="/tag/мысли" th:href="@{/tag/мысли}" style="left: 202px; top: 179px; width: 102px; height: 21px">мысли</a></li> - <li><a href="/tag/pic" th:href="@{/tag/pic}" style="left: 400px; top: 78px; width: 33px; height: 38px">pic</a></li> - <li><a href="/tag/политота" th:href="@{/tag/политота}" style="left: 531px; top: 60px; width: 130px; height: 24px">политота</a></li> - <li><a href="/tag/WOT" th:href="@{/tag/WOT}" style="left: 159px; top: 63px; width: 48px; height: 20px">WOT</a></li> - <li><a href="/tag/fail" th:href="@{/tag/fail}" style="left: 8px; top: 170px; width: 34px; height: 27px">fail</a></li> - <li><a href="/tag/погода" th:href="@{/tag/погода}" style="left: 670px; top: 126px; width: 24px; height: 93px">погода</a></li> - <li><a href="/tag/apple" th:href="@{/tag/apple}" style="left: 42px; top: 167px; width: 64px; height: 29px">apple</a></li> - <li><a href="/tag/jabber" th:href="@{/tag/jabber}" style="left: 436px; top: 43px; width: 25px; height: 75px">jabber</a></li> - <li><a href="/tag/тян" th:href="@{/tag/тян}" style="left: 532px; top: 94px; width: 47px; height: 21px">тян</a></li> - <li><a href="/tag/work" th:href="@{/tag/work}" style="left: 359px; top: 55px; width: 58px; height: 23px">work</a></li> - <li><a href="/tag/Python" th:href="@{/tag/Python}" style="left: 240px; top: 63px; width: 74px; height: 23px">Python</a></li> - <li><a href="/tag/Видео" th:href="@{/tag/Видео}" style="left: 266px; top: 232px; width: 76px; height: 20px">Видео</a></li> - <li><a href="/tag/авто" th:href="@{/tag/авто}" style="left: 359px; top: 30px; width: 58px; height: 24px">авто</a></li> - <li><a href="/tag/Anime" th:href="@{/tag/Anime}" style="left: 360px; top: 328px; width: 66px; height: 21px">Anime</a></li> - <li><a href="/tag/игры" th:href="@{/tag/игры}" style="left: 378px; top: 242px; width: 22px; height: 58px">игры</a></li> - <li><a href="/tag/вело" th:href="@{/tag/вело}" style="left: 176px; top: 9px; width: 18px; height: 54px">вело</a></li> - <li><a href="/tag/web" th:href="@{/tag/web}" style="left: 661px; top: 219px; width: 22px; height: 47px">web</a></li> - <li><a href="/tag/YouTube" th:href="@{/tag/YouTube}" style="left: 498px; top: 316px; width: 81px; height: 24px">YouTube</a></li> - <li><a href="/tag/Вопрос" th:href="@{/tag/Вопрос}" style="left: 208px; top: 18px; width: 22px; height: 72px">Вопрос</a></li> - <li><a href="/tag/железо" th:href="@{/tag/железо}" style="left: 159px; top: 318px; width: 75px; height: 16px">железо</a></li> - <li><a href="/tag/Microsoft" th:href="@{/tag/Microsoft}" style="left: 20px; top: 146px; width: 86px; height: 21px">Microsoft</a></li> - <li><a href="/tag/video" th:href="@{/tag/video}" style="left: 616px; top: 101px; width: 51px; height: 19px">video</a></li> - <li><a href="/tag/Россия" th:href="@{/tag/Россия}" style="left: 32px; top: 242px; width: 68px; height: 16px">Россия</a></li> - <li><a href="/tag/java" th:href="@{/tag/java}" style="left: 409px; top: 226px; width: 39px; height: 22px">java</a></li> - <li><a href="/tag/новости" th:href="@{/tag/новости}" style="left: 39px; top: 67px; width: 21px; height: 79px">новости</a></li> - <li><a href="/tag/интернет" th:href="@{/tag/интернет}" style="left: 100px; top: 233px; width: 17px; height: 85px">интернет</a></li> - <li><a href="/tag/steam" th:href="@{/tag/steam}" style="left: 14px; top: 228px; width: 52px; height: 13px">steam</a></li> - <li><a href="/tag/слова" th:href="@{/tag/слова}" style="left: 501px; top: 272px; width: 51px; height: 18px">слова</a></li> - <li><a href="/tag/почта" th:href="@{/tag/почта}" style="left: 477px; top: 27px; width: 17px; height: 56px">почта</a></li> - <li><a href="/tag/help" th:href="@{/tag/help}" style="left: 123px; top: 281px; width: 21px; height: 35px">help</a></li> - <li><a href="/tag/skype" th:href="@{/tag/skype}" style="left: 110px; top: 320px; width: 49px; height: 20px">skype</a></li> - <li><a href="/tag/debian" th:href="@{/tag/debian}" style="left: 461px; top: 47px; width: 16px; height: 51px">debian</a></li> - <li><a href="/tag/win" th:href="@{/tag/win}" style="left: 505px; top: 104px; width: 27px; height: 16px">win</a></li> - <li><a href="/tag/Религия" th:href="@{/tag/Религия}" style="left: 33px; top: 281px; width: 67px; height: 17px">Религия</a></li> - <li><a href="/tag/soft" th:href="@{/tag/soft}" style="left: 286px; top: 86px; width: 28px; height: 14px">soft</a></li> - <li><a href="/tag/Политика" th:href="@{/tag/Политика}" style="left: 144px; top: 281px; width: 75px; height: 12px">Политика</a></li> - <li><a href="/tag/сны" th:href="@{/tag/сны}" style="left: 426px; top: 328px; width: 33px; height: 13px">сны</a></li> - <li><a href="/tag/Питер" th:href="@{/tag/Питер}" style="left: 146px; top: 233px; width: 50px; height: 16px">Питер</a></li> - <li><a href="/tag/bash" th:href="@{/tag/bash}" style="left: 451px; top: 311px; width: 38px; height: 16px">bash</a></li> - <li><a href="/tag/code" th:href="@{/tag/code}" style="left: 279px; top: 310px; width: 39px; height: 16px">code</a></li> - <li><a href="/tag/yandex" th:href="@{/tag/yandex}" style="left: 19px; top: 263px; width: 56px; height: 18px">yandex</a></li> - <li><a href="/tag/firefox" th:href="@{/tag/firefox}" style="left: 452px; top: 295px; width: 48px; height: 16px">firefox</a></li> - <li><a href="/tag/hardware" th:href="@{/tag/hardware}" style="left: 230px; top: 40px; width: 67px; height: 18px">hardware</a></li> - <li><a href="/tag/git" th:href="@{/tag/git}" style="left: 78px; top: 258px; width: 20px; height: 19px">git</a></li> - <li><a href="/tag/dev" th:href="@{/tag/dev}" style="left: 165px; top: 88px; width: 31px; height: 19px">dev</a></li> - <li><a href="/tag/mobile" th:href="@{/tag/mobile}" style="left: 421px; top: 24px; width: 15px; height: 47px">mobile</a></li> - <li><a href="/tag/люди" th:href="@{/tag/люди}" style="left: 151px; top: 184px; width: 43px; height: 15px">люди</a></li> - <li><a href="/tag/php" th:href="@{/tag/php}" style="left: 149px; top: 24px; width: 27px; height: 18px">php</a></li> - <li><a href="/tag/haskell" th:href="@{/tag/haskell}" style="left: 271px; top: 293px; width: 48px; height: 16px">haskell</a></li> - <li><a href="/tag/стихи" th:href="@{/tag/стихи}" style="left: 135px; top: 42px; width: 41px; height: 11px">стихи</a></li> - <li><a href="/tag/photo" th:href="@{/tag/photo}" style="left: 639px; top: 219px; width: 20px; height: 39px">photo</a></li> - <li><a href="/tag/чай" th:href="@{/tag/чай}" style="left: 448px; top: 220px; width: 27px; height: 14px">чай</a></li> - <li><a href="/tag/Опрос" th:href="@{/tag/Опрос}" style="left: 297px; top: 22px; width: 14px; height: 41px">Опрос</a></li> - <li><a href="/tag/Chrome" th:href="@{/tag/Chrome}" style="left: 311px; top: 25px; width: 48px; height: 17px">Chrome</a></li> - <li><a href="/tag/life" th:href="@{/tag/life}" style="left: 255px; top: 311px; width: 23px; height: 16px">life</a></li> - <li><a href="/tag/opera" th:href="@{/tag/opera}" style="left: 226px; top: 232px; width: 38px; height: 14px">opera</a></li> - <li><a href="/tag/programming" th:href="@{/tag/programming}" style="left: 234px; top: 327px; width: 81px; height: 14px">programming</a></li> - <li><a href="/tag/дети" th:href="@{/tag/дети}" style="left: 15px; top: 197px; width: 31px; height: 13px">дети</a></li> - <li><a href="/tag/сериалы" th:href="@{/tag/сериалы}" style="left: 575px; top: 219px; width: 61px; height: 13px">сериалы</a></li> - <li><a href="/tag/учеба" th:href="@{/tag/учеба}" style="left: 616px; top: 84px; width: 43px; height: 17px">учеба</a></li> -</ul> - -<div id="bottom1">juick.com © 2008-2017 <a href="/help/ru/contacts" th:href="@{/help/contacts}" rel="nofollow" th:text="#{link.contacts}">Контакты</a> · <a href="/help/" th:href="@{/help}" rel="nofollow" th:text="#{link.help}">Помощь</a></div> - -<div id="signup"> - <span th:text="#{label.register}">Зарегистрироваться:</span> - <div id="facebook"><a href="/_fblogin" rel="nofollow">Facebook</a></div> - <div id="vk"><a href="/_vklogin" rel="nofollow">VK</a></div> - <div id="xmpp"><a href="#" onclick="$('#xmppinfo').toggle(); return false">XMPP</a> - <div id="xmppinfo">[(#{message.sendLoginToXmpp})]</div> - </div> -</div> -<div id="signin"> - <p th:if="${loginError}" class="error" th:text="#{error.login}">Произошла ошибка, проверьте имя пользователя и пароль</p> - <a href="#" onclick="$('#signinform').toggle(); $('#nickinput').focus(); return false" th:text="#{question.areRegistered}">Уже зарегистрированы?</a> - <div id="signinform"> - <form action="#" th:action="@{/do_login}" method="POST"> - <input class="txt" type="text" name="j_username" placeholder="Имя пользователя" th:placeholder="#{label.username}" id="nickinput"/> - <input class="txt" type="password" name="j_password" placeholder="Пароль" th:placeholder="#{label.password}"/> - <input class="submit" type="submit" value="OK" th:value="#{button.send}"/> - </form> - </div> -</div> -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_messages.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_messages.html deleted file mode 100644 index 5d808f98..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_messages.html +++ /dev/null @@ -1,54 +0,0 @@ -<th:block th:each="msg:${msgs}" xmlns:th="http://www.thymeleaf.org"> - <article th:data-mid="${msg.getMid()}"> - <header class="u"> - @<a th:href="|/${msg.getUser().getName()}/|" th:text="${msg.getUser().getName()}">ugnich</a>: - <div class="msg-avatar"> - <a th:href="|/${msg.getUser().getName()}/|"> - <img th:src="|//i.juick.com/a/${msg.getUser().getUid()}.png|" - th:alt="${msg.getUser().getName()}"/> - </a> - </div> - <div class="msg-ts"> - <a th:href="|/${msg.getUser().getName()}/${msg.getMid()}|"> - <time th:datetime="|${msg.getDate()}Z|" - th:title="|${msg.getDate()} GMT|" - th:text="${msg.getDate()}">01.01.1970 - </time> - </a> - </div> - <div class="msg-tags" th:text="${msg.getTagsString()}"></div> - </header> - <p class="ir" th:if="${msg.getAttachmentType() != null}"> - <a href="|//i.juick.com/photos-512/${msg.getMid()}.${msg.getAttachmentType()}|"> - <img src="|//i.juick.com/photos-512/${msg.getMid()}.${msg.getAttachmentType()}|" - th:data-fname="|${msg.getMid()}.${msg.getAttachmentType()}|" alt=""/></a> - </p> - <p th:utext="${msg.getText()}">Lorem ipsum</p> - <div class="irbr" th:if="${msg.getAttachmentType() != null}"></div> - <nav class="l"> - <th:block th:switch="${#authorization.expression('isAuthenticated()')}"> - <a th:case="false" class="a-login" th:href="|/${msg.getMid()}/|" th:text="#{message.recommend}">Recommend</a> - <a th:case="true" class="a-like" th:href="|/post?body=!+%23${msg.getMid()}/|" th:text="#{message.recommend}">Recommend</a> - </th:block> - <a th:if="${#authorization.expression('isAuthenticated()') == false && !msg.ReadOnly}" class="a-login" - th:href="|/${msg.getMid()}/|" th:text="#{message.comment}">Comment</a> - <a th:if="${#authorization.expression('isAuthenticated()') == true && !msg.ReadOnly}" - class="a-comment" th:href="|/${msg.getMid()}/|" th:text="#{message.comment}">Comment</a> - - <th:block th:if="${#authorization.expression('hasRole(''ROLE_ADMIN'')')}"> - <a href="#" class="a-popular-plus">+</a> - <a href="#" class="a-popular-minus">-</a> - <a href="#" class="a-popular-delete">x</a> - </th:block> - </nav> - <nav class="s"> - <a th:if="${msg.getLikes() > 0}" th:href="|/${msg.getUser().getName()}/${msg.getMid()}|" - class="likes"><i data-icon="ei-heart" data-size="s"></i> - <span th:text="${msg.getLikes()}" th:remove="tag"> 10</span></a> - <a th:if="${msg.getReplies() > 0}" th:href="|/${msg.getUser().getName()}/${msg.getMid()}|" - class="replies"><i data-icon="ei-comment" data-size="s"></i> - <span th:text="${msg.getReplies()}" th:remove="tag"> 42</span> - </a> - </nav> - </article> -</th:block>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_paginator.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_paginator.html deleted file mode 100644 index aa1e0466..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_paginator.html +++ /dev/null @@ -1,3 +0,0 @@ -<p class="page" th:if="${nextpage != null}" xmlns:th="http://www.thymeleaf.org"> - <a th:href="${nextpage}" rel="prev"><span th:text="#{messages.next}" th:remove="tag">Next</span> →</a> -</p>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_postform.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_postform.html deleted file mode 100644 index a9ed9f5d..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_postform.html +++ /dev/null @@ -1,14 +0,0 @@ -<div th:if="${#authorization.expression('isAuthenticated()')}" xmlns:th="http://www.thymeleaf.org"> - <form action="/post" th:action="@{/post}" method="post" enctype="multipart/form-data"> - <section id="newmessage"> - <textarea name="body" placeholder="Новое сообщение..." th:placeholder="#{postForm.newMessage}"></textarea> - <div> - <input type="text" class="img" name="img" placeholder="Ссылка на изображение (JPG/PNG, до 10Мб)" th:placeholder="#{postForm.imageLink}" style="margin-bottom: 8pt"/> - [(#{postForm.orImageUpload})] - - <input type="text" class="tags" name="tags" placeholder="Теги (через пробел)" th:placeholder="#{postForm.tags}"/><br/> - <input type="submit" class="subm" value="Отправить" th:value="#{button.send}"/> - </div> - </section> - </form> -</div>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/homecolumn.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/homecolumn.html deleted file mode 100644 index 46c146f2..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/homecolumn.html +++ /dev/null @@ -1,4 +0,0 @@ -<p class="tags" xmlns:th="http://www.thymeleaf.org"> - <div th:replace="views/partial/tags">Tags</div> - <a href="http://ru.wix.com/" th:if="${showAdv}">конструктор сайтов</a> -</p> diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/settings_tabs.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/settings_tabs.html deleted file mode 100644 index 253511b5..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/settings_tabs.html +++ /dev/null @@ -1,7 +0,0 @@ -<div id="pagetabs" xmlns:th="http://www.thymeleaf.org"> - <ul> - <li><a href="/settings" th:href="@{/settings}" th:text="#{link.settings.main}">Main</a></li> - <li><a href="/settings?page=password" th:href="@{/settings?page=password}" th:text="#{link.settings.password}">Password</a></li> - <li><a href="/settings?page=about" th:href="@{/settings?page=about}" th:text="#{link.settings.about}">About</a></li> - </ul> -</div>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/tags.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/tags.html deleted file mode 100644 index f4822b4a..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/tags.html +++ /dev/null @@ -1,3 +0,0 @@ -<th:block th:each="tag:${tags}" xmlns:th="http://www.thymeleaf.org"> - <a th:href="|/tag/${tag}|" th:title="${tag}" th:text="${tag}">Tag</a> -</th:block>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/thread_message.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/thread_message.html deleted file mode 100644 index 159eebf5..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/thread_message.html +++ /dev/null @@ -1,57 +0,0 @@ -<ul xmlns:th="http://www.thymeleaf.org"> - <li th:id="|msg-${msg.getMid()}|" th:data-mid="${msg.getMid()}" class="msg msgthread"> - <div class="msg-cont"> - <div class="msg-menu"><a href="#"></a></div> - <div class="msg-ts" th:text="${msg.getDate()}">01.01.1970</div> - <div class="msg-avatar"> - <a th:href="|/${msg.getUser().getName()}/|"> - <img th:src="|//i.juick.com/a/${msg.getUser().getUid()}.png|" - th:alt="${msg.getUser().getName()}"/> - </a> - </div> - <div class="msg-header"> - @<a th:href="|/${msg.getUser().getName()}/|" th:text="${msg.getUser().getName()}">ugnich</a>: - <th:block th:text="${tagsStr}"/> - </div> - <div class="msg-txt" th:utext="${msg.getText()}"> - Lorem ipsum - </div> - <div class="msg-media" th:if="${msg.getAttachmentType() != null}"> - <a href="|//i.juick.com/p/${msg.getMid()}.${msg.getAttachmentType()}|"> - <img src="|//i.juick.com/photos-512/${msg.getMid()}.${msg.getAttachmentType()}|"/> - </a> - </div> - <form th:if="${msg.VisitorCanComment}" action="/comment" method="POST" enctype="multipart/form-data"> - <input type="hidden" name="mid" th:value="${msg.getMid()}"/> - <div class="msg-comment"> - <div class="ta-wrapper"> - <textarea name="body" rows="1" class="reply" placeholder="Написать комментарий"></textarea> - </div> - </div> - </form> - <div class="msg-recomms" th:text="|Рекомендовали (${recommsCount}): ${recomms}|">Recommended(1): @ugnich</div> - </div> - </li> - <li id="mtoolbar"> - <ul> - <li><a th:href="|/${msg.getMid()}|"> - <div style="background-position: -64px 0"></div> - <th:block th:text="${msg.getMid()}"></th:block> - </a></li> - <th:block th:if="${#authorization.expression('isAuthenticated()')}"> - <li th:if="${isSubscribed}"><a th:href="|/post?body=U+%23${msg.getMid()}|"> - <div style="background-position: -48px 0"></div> - Подписан</a></li> - <li th:if="${isSubscribed == false}"><a th:href="|/post?body=S+%23${msg.getMid()}|"> - <div style="background-position: -16px 0"></div> - Подписаться</a></li> - <li th:if="${visitorInBL == false}"><a th:href="|/post?body=%21+%23${msg.getMid()}|"> - <div style="background-position: -32px 0"></div> - Рекомендовать</a></li> - <li th:if="${isOwnMessage}"><a th:href="|/post?body=D+%23${msg.getMid()}|"> - <div style="background-position: 0"></div> - Удалить</a></li> - </th:block> - </ul> - </li> -</ul>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_inbox.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_inbox.html deleted file mode 100644 index 80464e65..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_inbox.html +++ /dev/null @@ -1,45 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:text="${title}">Inbox title</title> -</head> - -<body> -<section id="content"> - <ul layout:fragment="content" id="private-messages" th:if="${not #lists.isEmpty(msgs)}"> - <li class="msg" th:each="msg:${msgs}"> - <div class="msg-cont"> - <div class="msg-header"> - @<a th:href="|/${msg.getUser().getName()}/|" th:text="${msg.getUser().getName()}">ugnich</a>: - <div class="msg-avatar"> - <a th:href="|/${msg.getUser().getName()}/|"> - <img th:src="|//i.juick.com/a/${msg.getUser().getUid()}.png|" th:alt="${msg.getUser().getName()}"/> - </a> - </div> - <div class="msg-ts" th:text="${msg.getDate()}">01.01.1970</div> - </div> - - <div class="msg-txt" th:utext="${msg.getText()}">Lorem ipsum</div> - - <form action="/pm/send" method="POST" enctype="multipart/form-data"> - <input type="hidden" name="uname" th:value="${msg.getUser().getName()}"/> - <div class="msg-comment"> - <div class="ta-wrapper"> - <textarea name="body" rows="1" class="replypm" placeholder="Write a reply" - th:placeholder="#{postForm.writeReply}"></textarea> - </div> - </div> - </form> - - </div> - </li> - </ul> -</section> -<aside id="column"> - <p layout:fragment="column" th:replace="views/partial/homecolumn">Main side column</p> -</aside> - -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_sent.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_sent.html deleted file mode 100644 index 8978ff67..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_sent.html +++ /dev/null @@ -1,42 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:text="${title}">Settings title</title> -</head> - -<body> -<section id="content"> - <div layout:fragment="content"> - <form action="/pm/send" method="POST" enctype="multipart/form-data"> - <div class="newpm"> - <div class="newpm-to">To: <input type="text" name="uname" placeholder="username" th:value="${uname}"/></div> - <div class="newpm-body"><textarea name="body" rows="2"></textarea></div> - <div class="newpm-send"><input type="submit" value="OK"/></div> - </div> - </form> - <ul id="private-messages" th:if="#{not lists.isEmpty(msgs)}"> - <li class="msg" th:each="msg:${msgs}"> - <div class="msg-cont"> - <div class="msg-header"> - @<a th:href="|/${msg.getUser().getName()}/|" th:text="${msg.getUser().getName()}">ugnich</a>: - <div class="msg-avatar"> - <a th:href="|/${msg.getUser().getName()}/|"> - <img th:src="|//i.juick.com/a/${msg.getUser().getUid()}.png|" th:alt="${msg.getUser().getName()}"/> - </a> - </div> - <div class="msg-ts" th:text="${msg.getDate()}">01.01.1970</div> - </div> - <div class="msg-txt" th:utext="${msg.getText()}"></div> - </div> - </li> - </ul> - </div> -</section> -<aside id="column"> - <p layout:fragment="column" th:replace="views/partial/homecolumn">Main side column</p> -</aside> - -</body> -</html> diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/posted.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/posted.html deleted file mode 100644 index 25432c2c..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/posted.html +++ /dev/null @@ -1,40 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:if="${#authorization.expression('isAuthenticated()')}" th:text="${title}">Page title</title> -</head> - -<body> -<article layout:fragment="content"> - <h1>Сообщение опубликовано</h1> - <p>Поделитесь своим новым постом в социальных сетях:</p> - <p class="social" th:if="${sharetwi} != null"> - <a - th:href="|https://twitter.com/intent/tweet?text=${sharetwi}|" - class="ico32-twi sharenew">Отправить в Twitter</a> - </p> - <p class="social"> - <a th:href="|http://www.livejournal.com/update.bml?subject=${hashtags}&event=${sharelj}&prop_taglist=${tagscomma}|" - target="_blank" class="ico32-lj sharenew">Отправить в LiveJournal</a> - </p> - <p class="social"> - <a th:href="|https://vk.com/share.php?url=${url}|" class="ico32-vk sharenew">Отправить в ВКонтакте</a> - </p> - <p class="social"> - <a th:href="|https://www.facebook.com/sharer/sharer.php?u=${url}|" - class="ico32-fb sharenew">Отправить в Facebook</a> - </p> - <p>Ссылка на сообщение: - <a th:href="|http://juick.com/${mid}|" th:text="|http://juick.com/${mid}|">http://juick.com/12345 - </a> - </p> -</article> - -<aside id="column"> - <p layout:fragment="column" th:replace="views/partial/homecolumn">Main side column</p> -</aside> - -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_about.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_about.html deleted file mode 100644 index 6f8f61dd..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_about.html +++ /dev/null @@ -1,31 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:text="${title}">Settings title</title> -</head> - -<body> -<section id="content"> - <article layout:fragment="content"> - <form action="/settings" method="POST" enctype="multipart/form-data"> - <p>Full name: <input type="text" name="fullname" th:value="${userinfo.getFullName()}"/></p> - <p>Country: <input type="text" name="country" th:value="${userinfo.getCountry()}"/></p> - <p>URL: <input type="text" name="url" th:value="${userinfo.getUrl()}" size="32"/><br/> - <small>Please, start with "http://"</small></p> - <p>About:<br/> - <input type="text" name="descr" th:value="${userinfo.getDescription()}" style="width: 100%"/><br/> - <small>Max. 255 symbols</small></p> - <p>Avatar: <input type="file" name="avatar"/><br/> - <small>Recommendations: PNG, 96x96, <50Kb. Also, JPG and GIF supported.</small></p> - <p><input type="hidden" name="page" value="about"/><input type="submit" value=" OK "/></p> - </form> - </article> -</section> -<aside id="column"> - <p layout:fragment="column" th:replace="views/partial/settings_tabs">Settings navigation</p> -</aside> - -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_auth-email.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_auth-email.html deleted file mode 100644 index 715d474d..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_auth-email.html +++ /dev/null @@ -1,20 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:text="${title}">Settings title</title> -</head> - -<body> -<section id="content"> - <article layout:fragment="content"> - <p th:text="${result}">Authentication result</p><p><a href="/settings">Settings</a>.</p> - </article> -</section> -<aside id="column"> - <p layout:fragment="column" th:replace="views/partial/settings_tabs">Settings navigation</p> -</aside> - -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_main.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_main.html deleted file mode 100644 index 2db977f4..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_main.html +++ /dev/null @@ -1,153 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:text="${title}">Settings title</title> -</head> - -<body> -<section id="content"> - <article layout:fragment="content"> - <h1>Настройки</h1> - <form action="/settings" method="POST" enctype="multipart/form-data"> - <fieldset> - <legend>Notification options</legend> - <p><input type="checkbox" name="jnotify" value="1" - th:checked="${notify_options.isRepliesEnabled()}"/> Reply notifications ("Message posted")</p> - <p><input type="checkbox" name="subscr_notify" value="1" - th:checked="${notify_options.isSubscriptionsEnabled()}"/> Subscriptions notifications ("@user subscribed...")</p> - <p><input type="checkbox" name="recomm" value="1" - th:checked="${notify_options.isRecommendationsEnabled()}"/> Posts recommendations ("Recommended by @user")</p> - <p><input type="hidden" name="page" value="main"/><input type="submit" value=" OK "/></p> - </fieldset> - </form> - <fieldset> - <legend style="background: url(//telegram.org/favicon.ico?3) no-repeat; padding-left: 58px; line-height: 48px;"> - Telegram</legend> - <form action="/settings" method="post" th:if="${telegram_name != null}"> - <div>Telegram: <b th:text="${telegram_name}">telegram_name</b> — - <input type="hidden" name="page" value="telegram-del"/> - <input type="submit" value=" Disable "/> - </div> - </form> - <p th:if="${telegram_name == null}"> - To connect Telegram account: send any text message to <a href="https://telegram.me/Juick_bot">@Juick_bot</a> - </p> - </fieldset> - <form action="/settings" method="POST" enctype="multipart/form-data"> - <fieldset> - <legend style="background: url(//static.juick.com/settings/xmpp.png) no-repeat; padding-left: 58px; line-height: 48px;"> - XMPP accounts - </legend> - <p>Your accounts:</p> - <p> - <th:block th:each="jid:${jids}"> - <label><input type="radio" name="delete" th:value="|xmpp;${jid}}" th:text="${jid}">username@jabber.ru</label><br/> - </th:block> - <th:block th:each="auth:${auths}"> - <label><input type="radio" name="delete" - th:value="|xmpp-unauth;${auth.getAccount()}|" th:text="${auth.getAccount()}">account</label> - — <a href="#" - onclick="alert(\'To confirm, please send "AUTH {{ auth.getAuthCode() }}" (without quotes) from this account to "juick@juick.com".\'); return false;">Confirm</a><br/> - </th:block> - </p> - <p th:if="#{not lists.isEmpty(jids)}"><input type="hidden" name="page" value="jid-del"/><input type="submit" value=" Delete "/></p> - <p>To add new jabber account: send any text message to <a href="xmpp:juick@juick.com?message;body=login">juick@juick.com</a> - </p> - </fieldset> - </form> - <fieldset> - <legend style="background: url(//static.juick.com/settings/email.png) no-repeat; padding-left: 58px; line-height: 48px;"> - E-mail - </legend> - <form action="/settings" method="POST" enctype="multipart/form-data"> - <p>Add account:<br/> - <input type="text" name="account"/> - <input type="hidden" name="page" value="email-add"/> - <input type="submit" value=" Add "/> - </p> - </form> - <form action="/settings" method="POST" enctype="multipart/form-data"> - <p>Your accounts:</p> - <p> - <th:block th:each="email:${emails}"> - <label><input type="radio" name="account" th:value="${email}" th:text="${email}">email@domain.tls</label><br/> - </th:block> - <p th:if="#{lists.isEmpty(emails)}"> - -</p> - <th:block th:if="#{not lists.isEmpty(emails)}"> - </p> - <p><input type="hidden" name="page" value="email-del"/><input type="submit" value=" Delete "/></p> - </th:block> - </form> - <form action="/settings" method="POST" enctype="multipart/form-data" th:if="#{not lists.isEmpty(emails)}"> - <p>You can receive all your subscriptions by email:<br/> - Sent to <select name="account"> - <option value="">Disabled</option> - <option th:each="email:${emails}" th:value="${email}" th:text="${email}" - th:selected="${eopts.getEmail()== email}"> - </option> - </select> every day at <select name="time"> - <th:block th:each="hour:${hours}"> - <option th:value="${hour}" th:selected="${eopts.getSubscriptionHour() == hour}" - th:text="|${hour}:00 GMT|"> - </option> - </th:block> - </select> - <input type="hidden" name="page" value="email-subscr"/> - <input type="submit" value="OK"/></p> - </form> - <p> </p> - <p>You can post to Juick via e-mail. Send your <span style="text-decoration: underline">plain text</span> - messages to special secret e-mail. You can attach one photo or video file.</p> - <p>Secret email: <strong th:if="${ehash != null}" th:text="${ehash}">SecretEmail@juick.com</strong><th:block th:if="${ehash == null}">-</th:block></p> - <form action="/settings" method="post"> - <p><input type="hidden" name="page" value="email"/><input type="submit" value=" Generate new "/></p> - </form> - </fieldset> - <fieldset> - <legend style="background: url(//static.juick.com/settings/facebook.png) no-repeat; padding-left: 58px; line-height: 48px;"> - Facebook - </legend> - <form action="/settings" method="post" th:if="${fbstatus.isConnected() && fbstatus.isCrosspostEnabled()}"> - <div> - Facebook: <b>Enabled</b> — - <input type="hidden" name="page" value="facebook-disable"/> - <input type="submit" value=" Disable "/> - </div> - </form> - <form action="/settings" method="post" th:if="${fbstatus.isConnected() && !fbstatus.isCrosspostEnabled()}"> - <div> - Facebook: <b>Disabled</b> — - <input type="hidden" name="page" value="facebook-enable"/> - <input type="submit" value=" Enable "/> - </div> - </form> - <p th:if="${!fbstatus.isConnected()}">Cross-posting to Facebook: - <a href="/_fblogin"> - <img src="//static.juick.com/facebook-connect.png" alt="Connect to Facebook"/> - </a> - </p> - </fieldset> - <fieldset> - <legend style="background: url(//static.juick.com/settings/twitter.png) no-repeat; padding-left: 58px; line-height: 48px;"> - Twitter</legend> - <form action="/settings" method="post" th:if="${twitter_name != null}"> - <div>Twitter: <b th:text="${twitter_name}">@twitterName</b> — - <input type="hidden" name="page" value="twitter-del"/> - <input type="submit" value=" Disable "/> - </div> - </form> - <p th:if="${twitter_name == null}">Cross-posting to Twitter: <a href="/_twitter"><img src="//static.juick.com/twitter-connect.png" - alt="Connect to Twitter"/></a></p> - </fieldset> - - </article> -</section> -<aside id="column"> - <p layout:fragment="column" th:replace="views/partial/settings_tabs">Settings navigation</p> -</aside> - -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_password.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_password.html deleted file mode 100644 index c76363e5..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_password.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:text="${title}">Settings title</title> -</head> - -<body> -<section id="content"> - <article layout:fragment="content"> - <fieldset> - <legend>Changing your password</legend> - <form action="/settings" method="post"> - <input type="hidden" name="page" value="password"/> - <p>Change password: <input type="password" name="password" size="8"/> <input type="submit" - value=" Update "/><br/> - <i>(max. length - 16 symbols)</i></p> - </form> - </fieldset> - </article> -</section> -<aside id="column"> - <p layout:fragment="column" th:replace="views/partial/settings_tabs">Settings navigation</p> -</aside> - -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_result.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_result.html deleted file mode 100644 index 20cb097d..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_result.html +++ /dev/null @@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:text="${title}">Settings title</title> -</head> - -<body> -<section id="content"> - <p layout:fragment="content" th:utext="${result}">Settings update status</p> -</section> -<aside id="column"> - <p layout:fragment="column" th:replace="views/partial/settings_tabs">Settings navigation</p> -</aside> - -</body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/thread.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/thread.html deleted file mode 100644 index ac7da17f..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/thread.html +++ /dev/null @@ -1,17 +0,0 @@ -<!DOCTYPE html> -<html xmlns:th="http://www.thymeleaf.org" - xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" - layout:decorate="~{layout/mainLayout}"> -<head> - <title th:if="${#authorization.expression('isAuthenticated()')}" th:text="${title}">Page title</title> -</head> - -<body> -<section id="content" th:data-mid="${mid}" style="margin-left: 0; width: 100%"> - <th:block layout:fragment="content"> - <th:block th:replace="views/partial/thread_message"/> - </th:block> -</section> -</body> -</html> - diff --git a/juick-spring-www/src/main/webapp/WEB-INF/web.xml b/juick-spring-www/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index a57cceb9..00000000 --- a/juick-spring-www/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<web-app xmlns="http://java.sun.com/xml/ns/javaee" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" - version="3.0"> - -</web-app>
\ No newline at end of file diff --git a/juick-spring-www/src/main/webapp/favicon.ico b/juick-spring-www/src/main/webapp/favicon.ico Binary files differdeleted file mode 100644 index bc7161e2..00000000 --- a/juick-spring-www/src/main/webapp/favicon.ico +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/favicon.png b/juick-spring-www/src/main/webapp/favicon.png Binary files differdeleted file mode 100644 index bc7161e2..00000000 --- a/juick-spring-www/src/main/webapp/favicon.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/logo.png b/juick-spring-www/src/main/webapp/logo.png Binary files differdeleted file mode 100644 index 933f6099..00000000 --- a/juick-spring-www/src/main/webapp/logo.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/dialog-close.png b/juick-spring-www/src/main/webapp/static/dialog-close.png Binary files differdeleted file mode 100644 index 9c4275cc..00000000 --- a/juick-spring-www/src/main/webapp/static/dialog-close.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/facebook.png b/juick-spring-www/src/main/webapp/static/facebook.png Binary files differdeleted file mode 100644 index 5d111590..00000000 --- a/juick-spring-www/src/main/webapp/static/facebook.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/favicon.png b/juick-spring-www/src/main/webapp/static/favicon.png Binary files differdeleted file mode 100644 index bc7161e2..00000000 --- a/juick-spring-www/src/main/webapp/static/favicon.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/icon-fb.png b/juick-spring-www/src/main/webapp/static/icon-fb.png Binary files differdeleted file mode 100644 index 5d111590..00000000 --- a/juick-spring-www/src/main/webapp/static/icon-fb.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/icon-gplus.png b/juick-spring-www/src/main/webapp/static/icon-gplus.png Binary files differdeleted file mode 100644 index d83d2520..00000000 --- a/juick-spring-www/src/main/webapp/static/icon-gplus.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/icon-lj.png b/juick-spring-www/src/main/webapp/static/icon-lj.png Binary files differdeleted file mode 100644 index 9cde1e02..00000000 --- a/juick-spring-www/src/main/webapp/static/icon-lj.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/icon-twitter.png b/juick-spring-www/src/main/webapp/static/icon-twitter.png Binary files differdeleted file mode 100644 index 259078f7..00000000 --- a/juick-spring-www/src/main/webapp/static/icon-twitter.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/icon-vk.png b/juick-spring-www/src/main/webapp/static/icon-vk.png Binary files differdeleted file mode 100644 index 80b6920b..00000000 --- a/juick-spring-www/src/main/webapp/static/icon-vk.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/logo.png b/juick-spring-www/src/main/webapp/static/logo.png Binary files differdeleted file mode 100644 index 4e0f6d56..00000000 --- a/juick-spring-www/src/main/webapp/static/logo.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/logo@2x.png b/juick-spring-www/src/main/webapp/static/logo@2x.png Binary files differdeleted file mode 100644 index 6febeaf9..00000000 --- a/juick-spring-www/src/main/webapp/static/logo@2x.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/menu.png b/juick-spring-www/src/main/webapp/static/menu.png Binary files differdeleted file mode 100644 index 4cac2563..00000000 --- a/juick-spring-www/src/main/webapp/static/menu.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/photo-attachment-active.png b/juick-spring-www/src/main/webapp/static/photo-attachment-active.png Binary files differdeleted file mode 100644 index ecbf10e8..00000000 --- a/juick-spring-www/src/main/webapp/static/photo-attachment-active.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/photo-attachment.png b/juick-spring-www/src/main/webapp/static/photo-attachment.png Binary files differdeleted file mode 100644 index 07d48517..00000000 --- a/juick-spring-www/src/main/webapp/static/photo-attachment.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/scripts.js b/juick-spring-www/src/main/webapp/static/scripts.js deleted file mode 100644 index d368cacd..00000000 --- a/juick-spring-www/src/main/webapp/static/scripts.js +++ /dev/null @@ -1,753 +0,0 @@ -var autosize = require('autosize'); -require('whatwg-fetch'); -require('element-closest'); -require('classlist.js'); -if (!('remove' in Element.prototype)) { // Firefox <23 - Element.prototype.remove = function() { - if (this.parentNode) { - this.parentNode.removeChild(this); - } - }; -} - -NodeList.prototype.forEach = Array.prototype.forEach; -HTMLCollection.prototype.forEach = Array.prototype.forEach; - -var ws, - pageTitle; - -function initWS() { - var content = document.getElementById('content'); - if (!content) { return } - var pageMID = content.getAttribute('data-mid'); - if (!pageMID) { return } - - var url = (window.location.protocol === 'https:' ? 'wss' : 'ws') + ':' - + (typeof juickDebug !== 'undefined' ? - '//ws.juick.com/_replies' : ('//ws.juick.com/' + pageMID)), - hash = document.getElementById('body').getAttribute('data-hash'); - - if (hash) { - url += '?hash=' + hash; - } - - ws = new WebSocket(url); - ws.onopen = function () { - console.log('online'); - if (!document.querySelector('#wsthread')) { - var d = document.createElement('div'); - d.id = 'wsthread'; - d.addEventListener('click', nextReply); - document.querySelector('body').appendChild(d); - pageTitle = document.title; - } - }; - ws.onclose = function () { - console.log('offline'); - ws = false; - setTimeout(function () { - initWS(); - }, 2000); - }; - ws.onmessage = function (msg) { - if (msg.data == ' ') { - ws.send(' '); - } else { - try { - var jsonMsg = JSON.parse(msg.data); - console.log('data: ' + msg.data); - wsIncomingReply(jsonMsg); - } catch (err) { - console.log(err); - } - } - }; - setInterval(wsSendKeepAlive, 90000); -} - -function wsSendKeepAlive() { - if (ws) { - ws.send(' '); - } -} - -function wsShutdown() { - if (ws) { - ws.onclose = function () { }; - ws.close(); - } -} - -function isTreeMode() { - // relies on UserThread.printReplies implementation TODO keep this in cookie or something - return document.querySelector('.title2-right > a').href.match(/\?view=(\w+)/)[1] == 'list'; -} - -function wsIncomingReply(msg) { - var li = document.createElement('li'); - li.setAttribute('class', 'msg reply-new'); - li.setAttribute('id', msg.rid); - li.addEventListener('click', newReply); - li.addEventListener('mouseover', newReply); - var msgAvatar = document.createElement('div'); - msgAvatar.setAttribute('class', 'msg-avatar'); - var msgAvatarLink = document.createElement('a'); - msgAvatarLink.setAttribute('href', '/' + msg.user.uname + '/'); - var msgAvatarImg = document.createElement('img'); - msgAvatarImg.setAttribute('src', '//i.juick.com/a/' + msg.user.uid + '.png'); - msgAvatarLink.appendChild(msgAvatarImg); - msgAvatar.appendChild(msgAvatarLink); - - var msgCont = document.createElement('div'); - msgCont.setAttribute('class', 'msg-cont'); - var msgMenu = document.createElement('div'); - msgMenu.setAttribute('class', 'msg-menu'); - msgCont.appendChild(msgMenu); - var msgMenuLink = document.createElement('a'); - msgMenuLink.setAttribute('href', '#'); - msgMenuLink.addEventListener('click', function (e) { - showMessageLinksDialog(msg.mid, msg.rid); - e.preventDefault(); - }); - msgMenu.appendChild(msgMenuLink); - var msgHeader = document.createElement('div'); - msgHeader.setAttribute('class', 'msg-header'); - var msgHeaderLink = document.createElement('a'); - msgHeaderLink.setAttribute('href', '/' + msg.user.uname + '/'); - msgHeaderLink.textContent = '@' + msg.user.uname + ':'; - msgHeader.appendChild(msgHeaderLink); - var msgTimestamp = document.createElement('div'); - msgTimestamp.setAttribute('class', 'msg-ts'); - var msgTimestampLink = document.createElement('a'); - msgTimestampLink.setAttribute('href', '/' + msg.mid + '#' + msg.rid); - msgTimestampLink.setAttribute('title', msg.timestamp + ' GMT'); - msgTimestampLink.textContent = msg.timestamp; - msgTimestamp.appendChild(msgTimestampLink); - var msgTxt = document.createElement('div'); - msgTxt.setAttribute('class', 'msg-txt'); - var msgLinks = document.createElement('div'); - msgLinks.setAttribute('class', 'msg-links'); - var msgNum = '/' + msg.rid; - if (msg.replyto > 0) { - msgNum += ' в ответ на <a href="#' + msg.replyto + '">/' + msg.replyto + '</a>'; - } - msgLinks.innerHTML = msgNum + ' · '; - var msgLinksLink = document.createElement('a'); - msgLinksLink.setAttribute('href', '#'); - msgLinksLink.textContent = 'Ответить'; - msgLinksLink.addEventListener('click', function (e) { - showCommentForm(msg.mid, msg.rid); - e.preventDefault(); - }); - msgLinks.appendChild(msgLinksLink); - var msgComment = document.createElement('div'); - msgComment.setAttribute('class', 'msg-comment'); - msgComment.style.display = 'none'; - msgHeader.appendChild(msgAvatar); - msgHeader.appendChild(msgMenu); - msgHeader.appendChild(msgTimestamp); - msgCont.appendChild(msgHeader); - msgCont.appendChild(msgTxt); - msgCont.appendChild(msgLinks); - msgCont.appendChild(msgComment); - li.appendChild(msgCont); - - li.querySelector('.msg-txt').textContent = msg.body; - - if (isTreeMode() && (msg.replyto > 0)) { - var p = document.getElementById(msg.replyto); - var m = parseInt(p.style.marginLeft) + 20; - while (p.nextElementSibling && (parseInt(p.nextElementSibling.style.marginLeft) >= m)) p = p.nextElementSibling; - li.style.marginLeft = m + 'px'; - p.parentNode.insertBefore(li, p.nextSibling); - } else { - document.getElementById('replies').appendChild(li); - } - - updateRepliesCounter(); -} - -function newReply(e) { - var li = e.target; - li.classList.remove('reply-new'); - li.removeEventListener('click', e); - li.removeEventListener('mouseover', e); - updateRepliesCounter(); -} - -function nextReply() { - var li = document.querySelector('#replies>li.reply-new'); - if (li) { - li.classList.remove('reply-new'); - li.removeEventListener('click', this); - li.childNodes[0].scrollIntoView(); - updateRepliesCounter(); - } -} - -function updateRepliesCounter() { - var replies = document.querySelectorAll('#replies>li.reply-new').length; - var wsthread = document.getElementById('wsthread'); - if (replies) { - wsthread.textContent = replies; - wsthread.style.display = 'block'; - document.title = '[' + replies + '] ' + pageTitle; - } else { - wsthread.style.display = 'none'; - document.title = pageTitle; - } -} - -/******************************************************************************/ -/******************************************************************************/ -/******************************************************************************/ - -function postformListener(formEl, ev) { - var form = formEl.closest('form'); - if (ev.ctrlKey && (ev.keyCode == 10 || ev.keyCode == 13)) { - if (!form.onsubmit || form.onsubmit()) { - form.submit(); - } - } -} - -function unfoldPostForm() { - if (window.location.pathname === '/' && window.location.hash === '#post') { - document.querySelector('#newmessage>div').style.display = 'block'; - var ta = document.querySelector('#newmessage textarea'); - ta.style.minHeight = '70px'; - ta.focus(); - } -} - -function newMessage() { - if (document.querySelector('#newmessage textarea').value.length == 0) { - openDialog('<p class="dialogtxt">Пожалуйста, введите текст сообщения</p>'); - return false; - } - return true; -} - -function showMoreReplies(el, id) { - var foldedReplies = el.closest('li').querySelector('.msg-comments'); - if (!foldedReplies) { return } - foldedReplies.style.display = 'none'; - - var replies = document.querySelectorAll('#replies>li'), - flagshow = 0, - i = 0; - for (; i < replies.length; i += 1) { - if (flagshow == 1) { - if (replies[i].style.display == 'none') { - replies[i].style.display = 'block'; - } else { - break; - } - } - if (replies[i].id == id) { - flagshow = 1; - } - } - return false; -} - -function replyForm(mid, rid) { - var form = document.createElement('form'); - form.setAttribute('action', '/comment'); - form.setAttribute('method', 'POST'); - form.setAttribute('enctype', 'multipart/form-data'); - var input = document.createElement('input'); - input.setAttribute('type', 'hidden'); - input.setAttribute('name', 'mid'); - input.setAttribute('value', mid); - form.appendChild(input); - if (rid) { - var inputRid = document.createElement('input'); - inputRid.setAttribute('type', 'hidden'); - inputRid.setAttribute('name', 'rid'); - inputRid.setAttribute('value', rid); - form.appendChild(inputRid); - } - return form; -} - -function taWrapper() { - var txtarea = document.createElement('textarea'); - txtarea.setAttribute('name', 'body'); - txtarea.setAttribute('rows', 1); - txtarea.setAttribute('class', 'reply narrow'); - txtarea.setAttribute('placeholder', 'Написать комментарий...'); - var txtKeypress = function (e) { - postformListener(e.target, e); - }; - txtarea.addEventListener('keypress', txtKeypress); - var wrapper = document.createElement('div'); - wrapper.setAttribute('class', 'ta-wrapper'); - wrapper.appendChild(txtarea); - var att = document.createElement('div'); - att.setAttribute('class', 'attach-photo'); - att.addEventListener('click', function () { - attachCommentPhoto(this); - }); - wrapper.appendChild(att); - return wrapper; -} - -function showCommentForm(mid, rid) { - var reply = document.getElementById(rid); - if (reply && !reply.querySelector('textarea')) { - var c = reply.querySelector('div.msg-cont > .msg-comment'), - newNode = c.cloneNode(true), - form = replyForm(mid, rid); - form.appendChild(newNode); - newNode.appendChild(taWrapper()); - var subm = document.createElement('input'); - subm.setAttribute('type', 'submit'); - subm.setAttribute('value', 'OK'); - newNode.appendChild(subm); - c.parentNode.insertBefore(form, c); - c.remove(); - } - - var commentBlock = reply.querySelector('div.msg-cont > form > div.msg-comment'); - commentBlock.style.display = 'block'; - var commentText = commentBlock.querySelector('textarea'); - if (commentText) { - autosize(commentText); - commentText.focus(); - } -} - -function showCommentFooter(e, mid, rid) { - var a = e.closest('article'); - if (!a.querySelector('footer.comm')) { - var form = replyForm(mid, rid), - footer = document.createElement('footer'); - footer.setAttribute('class', 'comm'); - footer.appendChild(taWrapper()); - var subm = document.createElement('input'); - subm.setAttribute('type', 'submit'); - subm.setAttribute('value', 'OK'); - footer.appendChild(subm); - form.appendChild(footer); - a.appendChild(form); - autosize(a.querySelector('textarea')); - } - a.querySelector('textarea').focus(); -} - -function attachInput() { - var inp = document.createElement('input'); - inp.setAttribute('type', 'file'); - inp.setAttribute('name', 'attach'); - inp.setAttribute('accept', 'image/jpeg,image/png'); - inp.style.visibility = 'hidden'; - return inp; -} - -function attachCommentPhoto(div) { - if (div.children.length === 0) { - var inp = attachInput(); - inp.addEventListener('change', function () { - inp.parentNode.classList.add('attach-photo-active'); - }); - inp.click(); - div.appendChild(inp); - } else { - div.innerHTML = null; - div.classList.add('attach-photo'); - } -} - -function attachMessagePhoto(div) { - var f = div.closest('form'), - finput = f.querySelector('input[type="file"]'); - if (!finput) { - var inp = attachInput(); - inp.style.float = 'left'; - inp.style.width = 0; - inp.style.height = 0; - inp.addEventListener('change', function () { - div.textContent = 'загрузить (✓)'; - }); - f.appendChild(inp); - inp.click(); - } else { - finput.remove(); - div.textContent = 'загрузить'; - } -} - -function unfoldReply() { - var anchor = window.location.hash.substring(1); - if ((0 + anchor) > 0) { - var el = document.getElementById(anchor); - if (!el) { return } - while (el.style.display === 'none') { - el = el.previousElementSibling; - } - showMoreReplies(el, el.getAttribute('id')); - window.location.replace(window.location.hash); - } -} - -function showMessageLinksDialog(mid, rid) { - var hlink = window.location.protocol + '//juick.com/' + mid, - mlink = '#' + mid; - if (rid > 0) { - hlink += '#' + rid; - mlink += '/' + rid; - } - var hlinkenc = encodeURIComponent(hlink), - html = '<div class="dialogshare">Ссылка на сообщение:' - + '<div onclick="this.selectText()" class="dialogl">' + hlink + '</div>' - + 'Номер сообщения:' - + '<div onclick="this.selectText()" class="dialogl">' + mlink + '</div>' - + 'Поделиться:<ul>' - + '<li><a href="https://www.facebook.com/sharer/sharer.php?u=' + hlinkenc + '" onclick="return openSocialWindow(this)"></a></li>' - + '<li><a href="https://twitter.com/intent/tweet?url=' + hlinkenc + '" onclick="return openSocialWindow(this)" style="background-position: -32px 0;"></a></li>' - + '<li><a href="https://vk.com/share.php?url=' + hlinkenc + '" onclick="return openSocialWindow(this)" style="background-position: -64px 0;"></a></li>' - + '<li><a href="https://plus.google.com/share?url=' + hlinkenc + '" onclick="return openSocialWindow(this)" style="background-position: -96px 0;"></a></li>' - + '</ul></div>'; - - openDialog(html); -} - -function showPhotoDialog(fname) { - var width = window.innerWidth, - height = window.innerHeight * 0.9; - if (width < 640) { - return true; - } else if (width < 1280) { - openDialog('<a href="//i.juick.com/photos-1024/' + fname + '"><img src="//i.juick.com/photos-512/' + fname + '"/></a>'); - document.querySelector('#dialogw img').style.maxHeight = height + 'px'; - return false; - } else { - openDialog('<a href="//i.juick.com/p/' + fname + '"><img src="//i.juick.com/photos-1024/' + fname + '"/></a>'); - document.querySelector('#dialogw img').style.maxHeight = height + 'px'; - return false; - } -} - -function openDialog(html) { - var dhtml = '<table id="dialogt"><tr><td><div id="dialogb"></div><div id="dialogw"><div id="dialogc"></div>' + html + '</div></td></tr></table>'; - document.querySelector('body').insertAdjacentHTML('afterbegin', dhtml); - document.querySelector('#dialogb').addEventListener('click', closeDialog); - document.querySelector('#dialogc').addEventListener('click', closeDialog); -} - -function closeDialog() { - document.querySelector('#dialogb').remove(); - document.querySelector('#dialogt').remove(); -} - -function openSocialWindow(a) { - var w = window.open(a.href, 'juickshare', 'width=640,height=400'); - if (window.focus) w.focus(); - return false; -} - -function checkUsername() { - var uname = document.querySelector('#username').textContent, - style = document.querySelector('#username').style; - fetch('//api.juick.com/users?uname=' + uname) - .then(function () { - style.background = '#FFCCCC'; - }) - .catch(function () { - style.background = '#CCFFCC'; - }); -} - -/******************************************************************************/ - -function openDialogLogin() { - var html = '<div class="dialoglogin"><p>Пожалуйста, представьтесь:' - + '<a href="/_fblogin" id="signfb">Facebook</a> ' - + '<a href="/_vklogin" id="signvk">ВКонтакте</a></p>' - + '<p>Уже зарегистрированы?</p>' - + '<form action="/login" method="POST">' - + '<input class="signinput" type="text" name="username" placeholder="Имя пользователя"/><br/>' - + '<input class="signinput" type="password" name="password" placeholder="Пароль"/><br/>' - + '<input class="signsubmit" type="submit" value="OK"/>' - + '</form></div>'; - openDialog(html); - return false; -} - -/******************************************************************************/ - -function resultMessage(str) { - var result = document.createElement('p'); - result.textContent = str; - return result; -} - -function likeMessage(e, mid) { - if (confirm('Are you sure?')) { - fetch('//juick.com/like?mid=' + mid, { - method: 'POST', - credentials: 'same-origin' - }) - .then(function (response) { - if (response.ok) { - e.closest('article').appendChild(resultMessage('OK!')); - } - }) - .catch(function () { - e.closest('article').appendChild(resultMessage('Ошибка')); - }); - } - return false; -} - -/******************************************************************************/ - -function setPopular(e, mid, popular) { - fetch('//api.juick.com/messages/set_popular?mid=' + mid - + '&popular=' + popular - + '&hash=' + document.getElementById('body').getAttribute('data-hash'), { - credentials: 'same-origin' - }) - .then(function () { - e.closest('article').append(resultMessage('OK!')); - }); - return false; -} - -function setPrivacy(e, mid) { - fetch('//api.juick.com/messages/set_privacy?mid=' + mid - + '&hash=' + document.getElementById('body').getAttribute('data-hash'), { - credentials: 'same-origin' - }) - .then(function () { - e.closest('article').append(resultMessage('OK!')); - }); - return false; -} -/******************************************************************************/ - -Element.prototype.selectText = function () { - var d = document; - if (d.body.createTextRange) { - var range = d.body.createTextRange(); - range.moveToElementText(this); - range.select(); - } else if (window.getSelection) { - var selection = window.getSelection(); - var rangeSel = d.createRange(); - rangeSel.selectNodeContents(this); - selection.removeAllRanges(); - selection.addRange(rangeSel); - } -}; - -function ready(fn) { - if (document.readyState != 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } -} - -ready(function () { - autosize(document.querySelectorAll('textarea')); - - var insertButtons = function (e) { - var textarea = e.target; - textarea.classList.add('narrow'); - var att = document.createElement('div'); - att.classList.add('attach-photo'); - att.addEventListener('click', function(e) { - attachCommentPhoto(e.target); - }); - textarea.parentNode.insertBefore(att, textarea.nextSibling); - textarea.parentNode.insertAdjacentHTML('afterend', '<input type="submit" value="OK"/>'); - textarea.removeEventListener('click', insertButtons); - e.preventDefault(); - }; - document.querySelectorAll('textarea.reply').forEach(function(e) { - e.addEventListener('click', insertButtons); - e.addEventListener('keypress', function(e) { - postformListener(e.target, e); - }); - }); - - var insertPMButtons = function (e) { - e.target.classList.add('narrowpm'); - e.target.parentNode.insertAdjacentHTML('afterend', '<input type="submit" value="OK"/>'); - e.target.removeEventListener('click', insertPMButtons); - e.preventDefault(); - }; - document.querySelectorAll('textarea.replypm').forEach(function(e) { - e.addEventListener('click', insertPMButtons); - }); - - var content = document.getElementById('content'); - if (content) { - var pageMID = content.getAttribute('data-mid'); - if (pageMID > 0) { - document.querySelectorAll('.msg-comments').forEach(function(e) { - e.addEventListener('click', function (e) { - var rid = e.target.closest('li').id; - showMoreReplies(e.target, rid); - e.preventDefault(); - }); - }); - document.querySelectorAll('.a-thread-comment').forEach(function(e) { - e.addEventListener('click', function (e) { - var rid = e.target.closest('li').id; - showCommentForm(pageMID, rid); - e.preventDefault(); - }); - }); - } - } - - document.querySelectorAll('.msg-menu a').forEach(function(el) { - el.addEventListener('click', function(e) { - showMessageLinksDialog( - e.target.closest('section').getAttribute('data-mid'), - parseInt(e.target.closest('li').id)); // rid - e.preventDefault(); - }); - }); - document.querySelectorAll('.l .a-comment').forEach(function(e) { - e.addEventListener('click', function (e) { - showCommentFooter( - e.target, - e.target.closest('article').getAttribute('data-mid')); - e.preventDefault(); - }); - }); - document.querySelectorAll('.l .a-privacy').forEach(function(e) { - e.addEventListener('click', function (e) { - setPrivacy( - e.target, - e.target.closest('article').getAttribute('data-mid')); - e.preventDefault(); - }); - }); - document.querySelectorAll('.l .a-popular-plus').forEach(function(e) { - e.addEventListener('click', function (e) { - setPopular( - e.target, - e.target.closest('article').getAttribute('data-mid'), - 2); - e.preventDefault(); - }); - }); - document.querySelectorAll('.l .a-popular-minus').forEach(function(e) { - e.addEventListener('click', function (e) { - setPopular( - e.target, - e.target.closest('article').getAttribute('data-mid'), - -1); - e.preventDefault(); - }); - }); - document.querySelectorAll('.l .a-popular-delete').forEach(function(e) { - e.addEventListener('click', function (e) { - setPopular( - e.target, - e.target.closest('article').getAttribute('data-mid'), - -2); - e.preventDefault(); - }); - }); - document.querySelectorAll('.ir a').forEach(function(e) { - e.addEventListener('click', function (e) { - var fname = e.target.closest('[data-fname]').getAttribute('data-fname'); - if (!showPhotoDialog(fname)) { - e.preventDefault(); - } - }); - }); - document.querySelectorAll('.social a').forEach(function(e) { - e.addEventListener('click', function (e) { - openSocialWindow(e.target); - e.preventDefault(); - }); - }); - var username = document.getElementById('username'); - if (username) { - username.addEventListener('blur', function () { - checkUsername(); - }); - } - - document.querySelectorAll('.l .a-like').forEach(function(e) { - e.addEventListener('click', function (e) { - likeMessage( - e.target, - e.target.closest('article').getAttribute('data-mid')); - e.preventDefault(); - }); - }); - document.querySelectorAll('.a-login').forEach(function(el) { - el.addEventListener('click', function(e) { - openDialogLogin(); - e.preventDefault(); - }); - }); - document.querySelectorAll('.attach-photo').forEach(function(el) { - el.addEventListener('click', function(e) { - attachCommentPhoto(e.target); - }); - }); - var unfoldall = document.getElementById('unfoldall'); - if (unfoldall) { - unfoldall.addEventListener('click', function(e) { - document.querySelectorAll('#replies>li').forEach(function(e) { - e.style.display = 'block'; - }); - document.querySelectorAll('#replies .msg-comments').forEach(function(e) { - e.style.display = 'none'; - }); - e.preventDefault(); - }); - } - var newMessageBlock = document.getElementById('newmessage'); - if (newMessageBlock) { - var form = newMessageBlock.parentNode; - form.addEventListener('submit', newMessage); - newMessageBlock.querySelector('textarea').addEventListener('click', function(e) { - var parent = e.target.parentNode; - parent.querySelector('div').style.display = 'block'; - e.target.style.minHeight = '70px'; - e.target.addEventListener('keypress', function(e) { - postformListener(e.target, e); - }); - }); - newMessageBlock.querySelector('a').addEventListener('click', function(e) { - attachMessagePhoto(e.target); - }); - } - document.querySelectorAll('article').forEach(function(article) { - if (Array.prototype.some.call( - article.querySelectorAll('.u a'), - function (a) { - return a.textContent === 'NSFW'; - } - )) { - var img = article.querySelector('.ir img'); - if (img) { - img.style.opacity = 0.05; - img.addEventListener('mouseover', function(e) { - e.target.style.opacity = 1; - }); - img.addEventListener('mouseout', function(e) { - e.target.style.opacity = 0.05; - }); - } - } - }); - - unfoldPostForm(); - unfoldReply(); - initWS(); - window.addEventListener('hashchange', unfoldPostForm); - window.addEventListener('hashchange', unfoldReply); - - window.addEventListener('pagehide', wsShutdown); -}); diff --git a/juick-spring-www/src/main/webapp/static/sharesocial.png b/juick-spring-www/src/main/webapp/static/sharesocial.png Binary files differdeleted file mode 100644 index 1031b343..00000000 --- a/juick-spring-www/src/main/webapp/static/sharesocial.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/style.css b/juick-spring-www/src/main/webapp/static/style.css deleted file mode 100644 index 46af7b81..00000000 --- a/juick-spring-www/src/main/webapp/static/style.css +++ /dev/null @@ -1,874 +0,0 @@ -html,body,div,h1,h2,ul,li,p,form,input,textarea,pre { - margin: 0; - padding: 0; -} -html,input,textarea { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Droid Sans", "Helvetica Neue", sans-serif; - font-size: 12pt; - -webkit-font-smoothing: subpixel-antialiased; -} -html { - background: #EEEEE5; - color: #222; -} -body { - margin: 0 auto; - width: 1000px; -} -h1,h2 { - font-weight: normal; -} -ul { - list-style-type: none; -} -a { - color: #069; - text-decoration: none; -} -img,hr { - border: none; -} -hr { - background: #CCC; - height: 1px; - margin: 10px 0; -} -pre { - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; -} -span.u { - text-decoration: underline; -} -#content { - float: right; - margin: 25px 0 0 0; - width: 728px; -} -#topwrapper { - clear: both; - position: relative; -} -body>header { - width: 1000px; -} -body>header a { - border-bottom: 1px dotted #666; - color: #222; - font-size: 13pt; -} -#logo { - float: left; - height: 36px; - margin: 7px 25px 0 20px; - width: 110px; -} -#logo a { - background: url("logo.png") no-repeat; - border: 0; - display: block; - height: 36px; - overflow: hidden; - text-indent: 100%; - white-space: nowrap; - width: 110px; -} -@media screen and (-webkit-min-device-pixel-ratio: 2),(min-resolution: 192dpi) { - #logo a { - background: url("logo@2x.png") no-repeat; - background-size: cover; - } -} -nav#global { - float: left; -} -nav#global li { - display: inline-block; - margin: 14px 12px 0 0; -} -#search { - float: right; - margin: 12px 20px 12px 0; -} -#search input { - background: #FFF; - border: 1px solid #DDDDD5; - padding: 4px; -} -#headdiv { - background: #DDDDD5; - border-bottom: 1px solid #D5D5D0; - border-top: 1px solid #D5D5D0; - clear: both; - margin: 0 0 5px 0; - padding: 0 20px; - position: relative; -} -#headdiv li { - display: inline-block; - margin: 12px 12px 12px 0; -} -nav#actions { - position: absolute; - right: 8px; - top: 0; -} -body>header nav li:after { - color: #AAA; - content: "/"; - display: inline-block; - margin-left: 12px; -} -body>header nav li:last-child:after { - display: none; -} -body>header p { - color: #222; - font-size: 13pt; - margin: 12px 0; - text-align: center; -} -#content>p, #content>h1, #content>h2 { - margin: 1em 0; -} -#newmessage { - background: #E5E5E0; - margin-bottom: 20px; - padding: 15px; -} -#newmessage textarea { - border: 1px solid #CCC; - height: 14pt; - margin: 0 0 5px 0; - min-height: 14pt; - padding: 4px; - resize: vertical; - width: 688px; -} -#newmessage input { - border: 1px solid #CCC; - margin: 5px 0; - padding: 2px 4px; -} -#newmessage>div { - display: none; -} -#newmessage .img { - width: 500px; -} -#newmessage .tags { - width: 500px; -} -#newmessage .subm { - background: #EEEEE5; - width: 150px; -} -article { - background: #fff; - line-height: 140%; - margin-bottom: 20px; - padding: 20px; -} -article aside { - float: left; - height: 48px; - margin-right: 10px; - width: 48px; -} -article aside img { - height: 48px; - width: 48px; -} -article time { - border-bottom: 1px dotted #999; - color: #999; - font-size: 10pt; -} -article p { - clear: left; - margin: 5px 0 15px 0; -} -article p.i { - text-align: center; -} -article p.ir { - float: right; - margin-bottom: 10px; - margin-left: 10px; -} -article p.ir a { - cursor: -moz-zoom-in; - cursor: -webkit-zoom-in; -} -article p.ir img { - max-height: 200px; - max-width: 200px; -} -article .irbr { - clear: right; -} -article>nav.l { - display: inline-block; - font-size: 10pt; -} -article>nav.l a { - border-bottom: 1px dotted #AAA; - color: #888; - margin-right: 15px; -} -article>nav.s { - display: inline-block; - float: right; - text-align: right; -} -article>nav.s a { - color: #222; - font-weight: bold; - vertical-align: middle; -} -article a.likes { - padding-left: 20px; -} -article a.replies { - margin-left: 18px; -} -article footer.comm { - margin: 13px 0 0 0; -} -article textarea { - border: 0; - height: 12pt; - min-height: 12pt; - padding: 2px; - resize: vertical; - vertical-align: top; - width: 530px; -} -article input { - background: #EEE; - border: 1px solid #CCC; - color: #999; - margin-left: 6px; - min-width: 50px; - vertical-align: top; -} -article .tags { - margin-top: 3px; -} -.msg-tags { - margin-top: 5px; -} -article .tags>a, .msg-tags>a { - border: 1px dotted #ccc; - color: #888; - display: inline-block; - font-size: 10pt; - margin-bottom: 5px; - margin-right: 5px; - padding: 0 10px; -} -#geomap { - height: 300px; - margin-top: 1em; - overflow: hidden; - width: 700px; -} -.msg { - margin: 10px 0 20px 0; -} -.ads { - background: #FFF; - margin: 8px 0 16px 58px; - padding: 13px 10px 5px 10px; -} -.msgthread { - margin-bottom: 0; -} -.msg-avatar { - float: left; - height: 48px; - margin-right: 10px; - width: 48px; -} -.msg-avatar img { - height: 48px; - vertical-align: top; - width: 48px; -} -.msg-cont { - background: #FFF; - line-height: 140%; - margin-bottom: 20px; - padding: 20px; - width: 640px; -} -.msg-menu { - float: right; - height: 16px; - margin-left: 10px; - margin-top: 2.4px; - width: 16px; -} -.msg-menu>a { - background: url("menu.png") no-repeat; - display: block; - height: 16px; - vertical-align: top; - width: 16px; -} -.msg-ts, article header.t { - float: right; - font-size: small; - vertical-align: top; -} -.msg-ts, .msg-ts>a { - color: #999; -} -.msg-place { - font-size: small; -} -.msg-place>a { - color: #999; -} -.msg-txt { - clear: both; - margin: 0 0 12px; - padding-top: 10px; -} -.msg-media { - text-align: center; -} -.msg-links { - color: #999; - font-size: small; - margin: 5px 0 0 0; -} -.msg-comments { - color: #AAA; - font-size: small; - margin-top: 10px; - overflow: hidden; - text-indent: 10px; -} -.ta-wrapper { - border: 1px solid #DDD; - display: inline-block; -} -.msg-comment textarea { - border: 0; - height: 12pt; - min-height: 12pt; - padding: 2px; - resize: vertical; - vertical-align: top; - width: 634px; -} -.msg-comment .narrow { - width: 554px; -} -.msg-comment .narrowpm { - width: 580px; -} -.attach-photo { - background: url("photo-attachment.png") no-repeat 3px 4px; - cursor: pointer; - display: inline-block; - height: 13px; - overflow: hidden; - padding: 2px 4px; - width: 16px; -} -.attach-photo-active { - background: url("photo-attachment-active.png") no-repeat 3px 4px; - cursor: pointer; - display: inline-block; - height: 13px; - overflow: hidden; - padding: 2px 4px; - width: 16px; -} -.msg-comment input { - background: #EEE; - border: 1px solid #CCC; - color: #999; - margin-left: 6px; - vertical-align: top; - width: 50px; -} -.msg-recomms { - color: #AAA; - font-size: small; - margin-top: 10px; - overflow: hidden; - text-indent: 10px; -} -.reply-new .msg-cont { - border-right: 5px solid #0C0; -} -q:before, q:after { - content: ""; -} -q { - border-left: 1px dashed #CCC; - color: #666; - display: block; - margin: 10px 0 10px 10px; - padding-left: 10px; -} -#mtoolbar { - background: #E5E5DD; - border-top: 1px solid #CCC; - width: 680px; -} -#mtoolbar ul, #mtoolbar a { - padding: 5px; -} -#mtoolbar li { - display: inline; -} -#mtoolbar div { - background: url("toolbar-icons.png") no-repeat; - display: inline-block; - height: 16px; - margin: 5px; - vertical-align: middle; - width: 16px; -} -#replies .msg-txt, #private-messages .msg-txt { - margin: 0; -} -.msg-comment { - margin-top: 10px; -} -.newmessage { - border: 1px solid #DDD; - padding: 2px; - resize: vertical; - width: 695px; -} -.users { - margin: 10px 0; - width: 100%; -} -.users td { - overflow: hidden; - padding: 6px 0; - width: 33%; -} -.users img { - height: 32px; - margin-right: 6px; - vertical-align: middle; - width: 32px; -} -.title2 { - background: #DDDDD0; - margin: 20px 0; - padding: 10px 20px; -} -.title2-right { - float: right; - line-height: 24px; -} -#content .title2 h2 { - font-size: x-large; - margin: 0; -} -.page { - background: #E5E5DD; - padding: 5px; - text-align: center; -} -.signup-h1>img { - margin-right: 10px; - vertical-align: middle; -} -.signup-h1 { - font-size: x-large; - margin: 20px 0 10px 0; -} -.signup-h2 { - font-size: large; - margin: 10px 0 5px 0; -} -.signup-hr { - margin: 20px 0; -} -.newpm { - margin: 20px 60px 30px 60px; -} -.newpm textarea { - resize: vertical; - width: 100%; -} -.newpm-send input { - width: 100px; -} -#column { - float: left; - margin-left: 10px; - overflow: hidden; - padding-top: 10px; - width: 240px; -} -#column ul, #column p, #column hr { - margin: 10px 0; -} -#column li { - margin: 6px 0; -} -#column .margtop { - margin-top: 15px; -} -#column p { - font-size: 10pt; - line-height: 140%; -} -#column .tags { - text-align: justify; -} -#column .inp { - background: #F5F5E9; - border: 1px solid #CCC; - border-radius: 3px; - padding: 3px; - width: 222px; -} -#ctitle { - font-size: 14pt; -} -#ctitle img { - margin-right: 5px; - vertical-align: middle; -} -#ctoolbar { - background: #E5E5DD; - line-height: 0; - margin: 10px 0; - padding: 5px; -} -#ctoolbar li { - display: inline; -} -#ctoolbar a { - padding: 5px 10px; -} -#ctoolbar div { - background: url("toolbar-icons.png") no-repeat; - display: inline-block; - height: 16px; - margin: 5px 0; - vertical-align: middle; - width: 16px; -} -#ustats li { - font-size: 10pt; - margin: 3px 0; -} -#column table.iread { - width: 100%; -} -#column table.iread td { - text-align: center; -} -#column table.iread img { - height: 48px; - width: 48px; -} -#dialogb { - background: #222; - height: 100%; - left: 0; - opacity: 0.6; - position: fixed; - top: 0; - width: 100%; - z-index: 10; -} -#dialogt { - height: 100%; - left: 0; - position: fixed; - top: 0; - width: 100%; - z-index: 10; -} -#dialogt td { - text-align: center; - vertical-align: middle; -} -#dialogw { - display: inline-block; - position: relative; - text-align: left; - z-index: 11; -} -#dialogc { - background: url("dialog-close.png"); - cursor: pointer; - height: 30px; - position: absolute; - right: -15px; - top: -15px; - width: 30px; - z-index: 12; -} -.dialoglogin { - background: #EEEEE5; - padding: 25px; - width: 300px; -} -#signfb,#signvk { - display: block; - height: 32px; - line-height: 32px; - margin: 10px 0; - overflow: hidden; - text-decoration: none; - text-indent: 37px; - width: 100%; -} -#signfb { - background: url("facebook.png") no-repeat #3A569C; - color: #FFF; -} -#signvk { - background: url("vk.png") no-repeat #6d8fb3; - color: #FFF; - margin-bottom: 30px; -} -.dialoglogin form { - margin-top: 7px; -} -.signinput,.signsubmit { - border: 1px solid #CCC; - margin: 3px 0; - padding: 3px; -} -.signinput { - width: 292px; -} -.signsubmit { - width: 70px; -} -.dialogshare { - background: #EEEEE5; - border: 1px solid #999; - min-width: 300px; - overflow: auto; - padding: 20px; -} -.dialogl { - background: #F5F5E9; - border: 1px solid #DDD; - margin: 3px 0 20px; - padding: 5px; -} -.dialogshare li { - float: left; - margin: 5px 10px 0 0; -} -.dialogshare a { - background-image: url("sharesocial.png"); - display: block; - height: 32px; - width: 32px; -} -.dialogtxt { - background: #EEEEE5; - padding: 20px; -} -#wsthread { - background: #CCC; - bottom: 20px; - cursor: pointer; - display: none; - padding: 5px 10px; - position: fixed; - right: 20px; -} -#footer { - clear: both; - color: #999; - font-size: 10pt; - margin: 0 auto 20px 0; - padding: 10px 0; - width: 1004px; -} -#footer-social { - float: left; -} -#footer-social a { - border: 0; - display: inline-block; - height: 32px; - margin: 0 15px 0 0; - overflow: hidden; - text-indent: 100%; - white-space: nowrap; - width: 32px; -} -#footer-left { - margin-left: 286px; - margin-right: 350px; -} -#footer-right { - float: right; -} -.sharenew { - color: #FFF; - display: inline-block; - line-height: 32px; - min-height: 32px; - min-width: 200px; - padding: 0 12px 0 37px; -} -.ico32-twi { - background: #55acee url("icon-twitter.png") no-repeat; -} -.ico32-vk { - background: #6d8fb3 url("icon-vk.png") no-repeat; -} -.ico32-fb { - background: #3b579d url("icon-fb.png") no-repeat; -} -.ico32-lj { - background: #888888 url("icon-lj.png") no-repeat; -} -.ico32-gp { - background: #dc4a38 url("icon-gplus.png") no-repeat; -} -.icon { - margin-top: -2px; - vertical-align: middle; -} -.icon--ei-comment { - margin-top: -3px; -} -fieldset { - border: 1px dotted #ccc; - margin-top: 25px; -} -@media screen and (max-width: 850px) { - body { - text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - } - body,body>header,#topwrapper,#content,#footer,#mtoolbar { - float: none; - margin: 0 auto; - min-width: 310px; - width: auto; - } - body>header { - margin-bottom: 15px; - } - body>header a { - font-size: 12pt; - } - #logo { - display: none; - } - nav#global { - margin-left: 10px; - } - nav#global li { - margin-right: 10px; - } - #search { - display: inline-block; - float: none; - margin: 10px 10px; - } - #headdiv { - padding: 0 10px; - } - #headdiv li { - margin-right: 10px; - } - nav#actions { - position: relative; - right: auto; - } - #newmessage .img, #newmessage .tags { - width: 100%; - } - #column { - float: none; - margin: 0 10px; - padding-top: 0; - width: auto; - - } - article { - margin: 8px; - overflow: auto; - } - article p { - margin: 10px 0 8px 0; - } - article>nav.l { - display: block; - float: left; - line-height: 15pt; - width: 80%; - } - article>nav.s { - display: block; - } - article textarea { - width: 205px; - } - article footer { - float: left; - } - #content textarea { - width: 100%; - } - .msg,.msg-cont { - min-width: 280px; - width: auto; - } - .msg-cont,.ads { - margin: 8px; - } - .msg-comment textarea { - width: 100%; - } - .msg-media { - overflow: auto; - } - .title2 h2 { - font-size: large; - } - #footer { - margin: 0 10px; - } - #footer div { - float: none; - margin: 10px 0; - } -} -@media screen and (max-width: 480px) { - .msg-ts { - float: none; - } - .msg-tags { - margin-top: 10px; - } - .msg-txt { - padding-top: 5px; - } - .title2 { - font-size: 11pt; - } - #content .title2 h2 { - font-size: 11pt; - } - .title2-right { - line-height: initial; - } -} diff --git a/juick-spring-www/src/main/webapp/static/tagscloud.png b/juick-spring-www/src/main/webapp/static/tagscloud.png Binary files differdeleted file mode 100644 index 3e1bf169..00000000 --- a/juick-spring-www/src/main/webapp/static/tagscloud.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/toolbar-icons.png b/juick-spring-www/src/main/webapp/static/toolbar-icons.png Binary files differdeleted file mode 100644 index cd4efd45..00000000 --- a/juick-spring-www/src/main/webapp/static/toolbar-icons.png +++ /dev/null diff --git a/juick-spring-www/src/main/webapp/static/vk.png b/juick-spring-www/src/main/webapp/static/vk.png Binary files differdeleted file mode 100644 index 80b6920b..00000000 --- a/juick-spring-www/src/main/webapp/static/vk.png +++ /dev/null diff --git a/juick-spring-www/src/test/java/com/juick/www/NotFoundPageTest.java b/juick-spring-www/src/test/java/com/juick/www/NotFoundPageTest.java deleted file mode 100644 index c01194f4..00000000 --- a/juick-spring-www/src/test/java/com/juick/www/NotFoundPageTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.juick.www; - -import com.juick.configuration.DataConfiguration; -import com.juick.www.configuration.WebSecurityConfig; -import com.juick.www.configuration.WwwServletConfiguration; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.ContextHierarchy; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import javax.inject.Inject; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; - -/** - * Created by aalexeev on 11/24/16. - */ -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextHierarchy({ - @ContextConfiguration(classes = { - com.juick.www.configuration.WebAppConfiguration.class, - WebSecurityConfig.class, - DataConfiguration.class}), - @ContextConfiguration(classes = {WwwServletConfiguration.class}), -}) -public class NotFoundPageTest { - @Inject - private WebApplicationContext wac; - - private MockMvc mockMvc; - - @Before - public void setup() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac) - .apply(SecurityMockMvcConfigurers.springSecurity()).build(); - } - - @Test - public void pageNotFoundTest() throws Exception { - mockMvc.perform(get("/-11")) - .andExpect(status().is4xxClientError()) - .andExpect(view().name("views/error")); - - mockMvc.perform(get("/-1")) - .andExpect(status().is4xxClientError()) - .andExpect(view().name("views/error")); - } -} diff --git a/juick-spring-www/src/test/java/com/juick/www/ThymeleafTestsJunitRunner.java b/juick-spring-www/src/test/java/com/juick/www/ThymeleafTestsJunitRunner.java deleted file mode 100644 index 4fd1f1f5..00000000 --- a/juick-spring-www/src/test/java/com/juick/www/ThymeleafTestsJunitRunner.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.juick.www; - -import nz.net.ultraq.thymeleaf.LayoutDialect; -import org.junit.Assert; -import org.junit.Test; -import org.thymeleaf.dialect.IDialect; -import org.thymeleaf.extras.springsecurity4.dialect.SpringSecurityDialect; -import org.thymeleaf.spring4.dialect.SpringStandardDialect; -import org.thymeleaf.testing.templateengine.context.web.SpringWebProcessingContextBuilder; -import org.thymeleaf.testing.templateengine.engine.TestExecutor; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by aalexeev on 11/24/16. - */ -public class ThymeleafTestsJunitRunner { - - @Test - public void runThymeleafTest() { - final List<IDialect> dialects = new ArrayList<>(); - dialects.add(new SpringStandardDialect()); - dialects.add(new LayoutDialect()); - dialects.add(new SpringSecurityDialect()); - - final SpringWebProcessingContextBuilder springPCBuilder = new SpringWebProcessingContextBuilder(); - - springPCBuilder.setApplicationContextConfigLocation(null); - - final TestExecutor executor = new TestExecutor(); - executor.setProcessingContextBuilder(springPCBuilder); - executor.setDialects(dialects); - - executor.execute("classpath:tests"); - - Assert.assertTrue(executor.isAllOK()); - executor.reset(); - } -} diff --git a/juick-spring-www/src/test/resources/tests/simple.thtest b/juick-spring-www/src/test/resources/tests/simple.thtest deleted file mode 100644 index 1505a382..00000000 --- a/juick-spring-www/src/test/resources/tests/simple.thtest +++ /dev/null @@ -1,25 +0,0 @@ -%TEMPLATE_MODE HTML -# ------------ separator comment ----------- -%CONTEXT -onevar = 'Goodbye,' -# ------------------------------------------ -%MESSAGES -one.msg = Crisis -# ------------------------------------------ -%INPUT -<!DOCTYPE html> -<html> - <body> - <span th:text="${onevar}">Hello,</span> - <span th:text="#{one.msg}">World!</span> - </body> -</html> -# ------------------------------------------ -%OUTPUT -<!DOCTYPE html> -<html> - <body> - <span>Goodbye,</span> - <span>Crisis</span> - </body> -</html>
\ No newline at end of file diff --git a/juick-spring-www/webpack.config.js b/juick-spring-www/webpack.config.js deleted file mode 100644 index acefc658..00000000 --- a/juick-spring-www/webpack.config.js +++ /dev/null @@ -1,37 +0,0 @@ -var webpack = require("webpack") -var globby = require("globby") -var ExtractTextPlugin = require("extract-text-webpack-plugin") -module.exports = { - devtool: 'source-map', - entry: { - "scripts" : globby.sync([ - __dirname + "/src/main/webapp/static/*.*", - require.resolve('evil-icons/assets/evil-icons.css'), - require.resolve('evil-icons/assets/evil-icons.js') - ]) - }, - output: { - path: __dirname + "/src/main/webapp", - filename: "[name].js" - }, - module: { - preLoaders: [ - { test: /\.jsx?$/, loader: 'eslint', exclude: /node_modules/ }, - { test: /\.css$/, loader: 'csslint?failOnWarning=false', exclude: /node_modules/ } - ], - loaders: [ - { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") }, - { test: /\.png$/, loader: "url-loader?limit=10000000000" }, - { test: /\.svg$/, loader: "url-loader?limit=10000000000" } - ] - }, - plugins: [ - new ExtractTextPlugin("style.css", { - allChunks: true - }) - ], - eslint: { - failOnWarning: false, - failOnError: true - }, -}
\ No newline at end of file |