commit 49b584f635c6539832d0105756b2729d4ee7f80d Author: saif Date: Thu Dec 12 12:41:22 2024 +0500 first commit diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..324ca94 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9e4f55e --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..42e3abe --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml new file mode 100644 index 0000000..d5c17ba --- /dev/null +++ b/.idea/watcherTasks.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/libs/com/zebra/zebra-sdk/2.14/zebra-sdk-2.14.jar b/libs/com/zebra/zebra-sdk/2.14/zebra-sdk-2.14.jar new file mode 100644 index 0000000..13cf948 Binary files /dev/null and b/libs/com/zebra/zebra-sdk/2.14/zebra-sdk-2.14.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4fdeda2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,376 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + com.utopiaindustries + cut-to-pack + jar + 1.0-SNAPSHOT + cut-to-pack + http://maven.apache.org + Management System for Utopia Industries + + + 1.8 + + + + + in-project + In project repo + file:///${project.basedir}/libs + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.thymeleaf.extras + thymeleaf-extras-java8time + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity5 + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-mail + 2.4.1 + + + org.springframework + spring-tx + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + + + org.webjars + webjars-locator-core + + + org.webjars + sockjs-client + 1.0.2 + + + org.webjars + stomp-websocket + 2.3.3 + + + ch.qos.logback + logback-examples + 1.0.0 + + + org.aspectj + aspectjrt + 1.9.9.1 + + + org.aspectj + aspectjtools + 1.9.9.1 + + + + org.json + json + 20090211 + + + com.google.code.gson + gson + 2.7 + + + + com.jcraft + jsch + 0.1.55 + + + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + runtime + + + com.jayway.jsonpath + json-path + test + + + com.zaxxer + HikariCP + 3.4.5 + + + commons-io + commons-io + 2.8.0 + + + commons-fileupload + commons-fileupload + 1.4 + + + commons-codec + commons-codec + 1.15 + + + + + com.fasterxml.jackson.core + jackson-core + 2.11.1 + + + com.fasterxml.jackson.core + jackson-databind + 2.11.1 + + + + javax.mail + javax.mail-api + 1.6.1 + + + com.amazonaws + aws-java-sdk-ses + 1.11.847 + + + software.amazon.awssdk + workmail + 2.27.2 + + + com.amazonaws + aws-java-sdk + 1.12.490 + + + com.amazonaws + aws-java-sdk-workmail + 1.12.490 + + + com.amazonaws + aws-java-sdk-core + 1.12.490 + + + com.fasterxml.jackson.core + jackson-core + + + + + + com.itextpdf + itextpdf + 5.5.9 + + + com.itextpdf + itext7-core + 7.1.10 + pom + + + com.itextpdf + kernel + 7.1.10 + + + com.itextpdf + io + 7.1.10 + + + com.itextpdf + layout + 7.1.10 + + + com.itextpdf + html2pdf + 2.1.7 + + + com.itextpdf + barcodes + 7.1.10 + + + com.itextpdf + sign + 7.1.10 + + + com.itextpdf + forms + 7.1.10 + + + + com.zebra + zebra-sdk + 2.14 + + + dev.samstevens.totp + totp-spring-boot-starter + 1.7.1 + + + org.jboss.aerogear + aerogear-otp-java + 1.0.0 + + + org.javatuples + javatuples + 1.2 + + + com.opencsv + opencsv + 5.1 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + org.jsoup + jsoup + 1.13.1 + + + net.sf.jtidy + jtidy + r938 + compile + + + com.google.zxing + core + 3.4.1 + + + com.google.zxing + javase + 3.4.1 + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + jakarta.xml.bind + jakarta.xml.bind-api + + + com.ibm.icu + icu4j + 69.1 + + + com.cronutils + cron-utils + 9.1.2 + + + com.amazonaws + aws-java-sdk-ec2 + 1.12.524 + + + com.amazonaws + aws-java-sdk-rds + 1.12.524 + + + junit + junit + 3.8.1 + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + -Xms1024m + -Xmx8g + + + + + diff --git a/src/main/java/com/utopiaindustries/CutToPackApplication.java b/src/main/java/com/utopiaindustries/CutToPackApplication.java new file mode 100644 index 0000000..f0fd282 --- /dev/null +++ b/src/main/java/com/utopiaindustries/CutToPackApplication.java @@ -0,0 +1,22 @@ +package com.utopiaindustries; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + + + +@SpringBootApplication +public class CutToPackApplication implements CommandLineRunner { + + + public static void main( String[] args ) { + SpringApplication.run( CutToPackApplication.class, args ); + } + + @Override + public void run(String... args) throws Exception { + + } + +} diff --git a/src/main/java/com/utopiaindustries/config/DataSourceConfiguration.java b/src/main/java/com/utopiaindustries/config/DataSourceConfiguration.java new file mode 100644 index 0000000..3b7fa28 --- /dev/null +++ b/src/main/java/com/utopiaindustries/config/DataSourceConfiguration.java @@ -0,0 +1,78 @@ +package com.utopiaindustries.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.sql.DataSource; + +@Configuration +@EnableTransactionManagement +public class DataSourceConfiguration { + + + @Bean(name = "dataSourceUind") + @ConfigurationProperties(prefix = "spring.uinddatasource") + public DataSource uindDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean(name = "jdbcTemplateUind") + public JdbcTemplate uindJdbcTemplate(@Qualifier("dataSourceUind") DataSource ds ) { + return new JdbcTemplate( ds ); + } + + @Bean(name = "namedParameterJdbcTemplateUind") + public NamedParameterJdbcTemplate uindNamedParameterJdbcTemplate(@Qualifier( "dataSourceUind" ) DataSource ds ) { + return new NamedParameterJdbcTemplate( ds ); + } + + /* COSMOS */ + + @Bean(name = "dataSourceCosmos") + @ConfigurationProperties(prefix = "spring.cosmosdatasource") + public DataSource cosmosDataSource() { + return DataSourceBuilder.create().build(); + } + + + @Bean(name = "jdbcTemplateCosmos") + public JdbcTemplate cosmosJdbcTemplate( @Qualifier( "dataSourceCosmos" ) DataSource ds ) { + return new JdbcTemplate( ds ); + } + + @Bean(name = "namedParameterJdbcTemplateCosmos") + public NamedParameterJdbcTemplate cosmosNamedParameterJdbcTemplate( @Qualifier( "dataSourceCosmos" ) DataSource ds ) { + return new NamedParameterJdbcTemplate( ds ); + } + + /* LOCAL */ + + @Primary + @Bean(name = "dataSourceLocal") + @ConfigurationProperties(prefix = "spring.localdatasource") + public DataSource localDataSource() { + return DataSourceBuilder.create().build(); + } + + + @Primary + @Bean(name = "jdbcTemplateLocal") + public JdbcTemplate localJdbcTemplate( @Qualifier( "dataSourceLocal" ) DataSource ds ) { + return new JdbcTemplate( ds ); + } + + @Primary + @Bean(name = "namedParameterJdbcTemplateLocal") + public NamedParameterJdbcTemplate localNamedParameterJdbcTemplate( @Qualifier( "dataSourceLocal" ) DataSource ds ) { + return new NamedParameterJdbcTemplate( ds ); + } + + +} diff --git a/src/main/java/com/utopiaindustries/config/SecurityConfiguration.java b/src/main/java/com/utopiaindustries/config/SecurityConfiguration.java new file mode 100644 index 0000000..47ecd70 --- /dev/null +++ b/src/main/java/com/utopiaindustries/config/SecurityConfiguration.java @@ -0,0 +1,73 @@ +package com.utopiaindustries.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.BeanIds; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.provisioning.JdbcUserDetailsManager; + +import javax.sql.DataSource; + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity( prePostEnabled = true ) +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Autowired + private DataSource dataSource; + + @Override + public void configure(WebSecurity webSecurity) throws Exception { + webSecurity.ignoring() + .antMatchers("/css/**") + .antMatchers("/js/**") + .antMatchers("/img/**") + .antMatchers("/employee-photo/**") + .antMatchers("/error") + .antMatchers("/forgot-password/**") + .antMatchers( "/hrms/job-applications/new" ) + .antMatchers( "/candidate-photo/**" ) + .antMatchers( "/hrms/employee-directory/**" ) + .antMatchers( "/actuator/scheduledtasks" ); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf().disable() + .authorizeRequests() + .antMatchers("/login", "/rest/**") + .permitAll() + .antMatchers("/**") + .hasAnyRole("USER", "ADMIN") + .and() + .formLogin() + .loginPage("/login") + .and() + .logout() + .invalidateHttpSession(true) + .deleteCookies("JSESSIONID"); + } + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public JdbcUserDetailsManager jdbcUserDetailsManager() { + return new JdbcUserDetailsManager(dataSource); + } + + @Bean( name = BeanIds.AUTHENTICATION_MANAGER ) + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/config/WebConfiguration.java b/src/main/java/com/utopiaindustries/config/WebConfiguration.java new file mode 100644 index 0000000..6cdd26c --- /dev/null +++ b/src/main/java/com/utopiaindustries/config/WebConfiguration.java @@ -0,0 +1,53 @@ +package com.utopiaindustries.config; + +import com.utopiaindustries.dialect.CTPDialect; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.thymeleaf.extras.java8time.dialect.Java8TimeDialect; +import org.thymeleaf.extras.springsecurity5.dialect.SpringSecurityDialect; +import org.thymeleaf.spring5.SpringTemplateEngine; +import org.thymeleaf.spring5.view.ThymeleafViewResolver; +import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; + +@Configuration +public class WebConfiguration implements WebMvcConfigurer { + + @Bean + public ClassLoaderTemplateResolver templateResolver() { + ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); + templateResolver.setPrefix( "templates/" ); + templateResolver.setCacheable( false ); + templateResolver.setSuffix( ".html" ); + templateResolver.setTemplateMode( "HTML" ); + templateResolver.setCharacterEncoding( "UTF-8" ); + return templateResolver; + } + + @Bean + public SpringTemplateEngine templateEngine() { + SpringTemplateEngine templateEngine = new SpringTemplateEngine(); + templateEngine.setEnableSpringELCompiler( true ); + templateEngine.setTemplateResolver( templateResolver() ); + templateEngine.addDialect( new SpringSecurityDialect() ); + templateEngine.addDialect( new Java8TimeDialect() ); + templateEngine.addDialect( new CTPDialect() ); + return templateEngine; + } + + @Bean + public ViewResolver viewResolver() { + ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); + viewResolver.setTemplateEngine( templateEngine() ); + viewResolver.setCharacterEncoding( "UTF-8" ); + return viewResolver; + } + + @Bean + public RestTemplate restTemplate(){ + return new RestTemplate(); + } + +} diff --git a/src/main/java/com/utopiaindustries/controller/AuthLoginController.java b/src/main/java/com/utopiaindustries/controller/AuthLoginController.java new file mode 100644 index 0000000..6890800 --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/AuthLoginController.java @@ -0,0 +1,14 @@ +package com.utopiaindustries.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class AuthLoginController { + + @GetMapping("/login") + public String showLoginPage( Model model ){ + return "auth/login"; + } +} diff --git a/src/main/java/com/utopiaindustries/controller/CuttingController.java b/src/main/java/com/utopiaindustries/controller/CuttingController.java new file mode 100644 index 0000000..646e3d7 --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/CuttingController.java @@ -0,0 +1,154 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.dao.ctp.BundleWrapper; +import com.utopiaindustries.service.*; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import java.util.Arrays; + +@Controller +@RequestMapping( "/cutting" ) +public class CuttingController { + + private final InventoryAccountService inventoryAccountService; + private final JobCardService jobCardService; + private final InventoryService inventoryService; + private final LocationService locationService; + private final BundleService bundleService; + private final BarcodeService barcodeService; + + public CuttingController(InventoryAccountService inventoryAccountService, JobCardService jobCardService, InventoryService inventoryService, LocationService locationService, BundleService bundleService, BarcodeService barcodeService) { + this.inventoryAccountService = inventoryAccountService; + this.jobCardService = jobCardService; + this.inventoryService = inventoryService; + this.locationService = locationService; + this.bundleService = bundleService; + this.barcodeService = barcodeService; + } + + @GetMapping + public String homePage( Model model ){ + return "redirect:/cutting/receive-inventory"; + } + + @GetMapping( "/receive-inventory" ) + public String receiveInventoryForm( Model model ){ + // 1 for cutting accounts + model.addAttribute("accounts" , inventoryAccountService.findInventoryAccounts( 1L ) ); + model.addAttribute("cutPieceTypes", jobCardService.getAllPieceTypes() ); + return "/cutting/receive-inventory"; + } + + /* + * get cutting inventory accounts + * */ + @GetMapping( "/inventory-accounts" ) + public String getInventoryAccounts( @RequestParam( value = "id", required = false ) String id, + @RequestParam( value = "title", required = false) String title, + @RequestParam( value = "active", required = false ) String active, + @RequestParam( value = "created-by", required = false ) String createdBy, + @RequestParam( value = "start-date", required = false ) String startDate, + @RequestParam( value = "end-date", required = false ) String endDate, + @RequestParam( value = "site-id", required = false ) String siteId, + @RequestParam( value = "count", required = false ) Long count, + Model model ){ + model.addAttribute("accounts", inventoryAccountService.getInventoryAccounts( id, title, active, createdBy, startDate, endDate, siteId, count , "PROCESS", "1", false) ); + model.addAttribute("locations", locationService.findAll() ); + return "/cutting/inventory-accounts"; + } + + @PostMapping( "/receive-inventory" ) + public String receiveInventoryToCuttingAccount( Model model, + RedirectAttributes redirectAttributes, + @RequestParam( "job-card-id" ) long jobCardId, + @RequestParam( "account-id" ) long accountId ){ + try { + inventoryService.receiveJobCardInventory( jobCardId, accountId ); + redirectAttributes.addFlashAttribute("success", "Inventory Success Received" ); + } catch ( Exception ex ){ + redirectAttributes.addFlashAttribute("error", ex.getMessage() ); + } + return "redirect:/cutting/receive-inventory"; + } + + + @GetMapping( "/inventory-transactions" ) + public String getInventoryTransactionsByAccount( @RequestParam( value = "account-id", required = true) long accountId, + Model model ){ + model.addAttribute("transactions", inventoryService.findTransactionByAccountId( accountId )); + return "/cutting/inventory-transactions"; + } + + @GetMapping( "/inventory-summary" ) + public String getInventorySummaryByAccount( @RequestParam( value = "account-id", required = true) long accountId, Model model ){ + model.addAttribute("summaries", inventoryService.findItemSummaryByAccountId( accountId )); + return "/cutting/inventory-summary"; + } + + @GetMapping( "/generate-master-barcode" ) + public String showMasterBundleForm( Model model ){ + model.addAttribute("wrapper", new BundleWrapper() ); + return "/cutting/generate-master-barcode"; + } + + @PostMapping( "/generate-master-barcode" ) + public String generateMasterBarcode( @ModelAttribute BundleWrapper wrapper, + RedirectAttributes redirectAttributes, + Model model ){ + try { + long id = bundleService.createMasterBundle( wrapper ); + redirectAttributes.addFlashAttribute("success", "Successfully Created Master Bundle : " + id ); + } catch ( Exception e ){ + redirectAttributes.addFlashAttribute("error", e.getMessage() ); + } + return "redirect:/cutting/generate-master-barcode"; + } + + @GetMapping( "/bundles" ) + public String showBundles( @RequestParam( value = "id", required = false ) String id, + @RequestParam( value = "sku", required = false) String sku, + @RequestParam( value = "jc-id", required = false) String jobCardId, + @RequestParam( value = "master-id" , required = false ) String masterId, + @RequestParam( value = "type", required = false) String type, + @RequestParam( value = "status", required = false) String status, + @RequestParam( value = "start-date", required = false) String startDate, + @RequestParam( value = "end-date", required = false) String endDate, + @RequestParam( value = "count", required = false ) Long count, + Model model ){ + model.addAttribute("bundles", bundleService.getBundles( id, sku, jobCardId, masterId, type, status, startDate, endDate ,count ) ); + model.addAttribute("types", jobCardService.getAllPieceTypes() ); + return "/cutting/bundles"; + } + + + @GetMapping( "/master-bundles") + public String showMasterBundles( @RequestParam(value = "id" , required = false) String id, + @RequestParam(value = "jc-id", required = false ) String jobCardId, + @RequestParam(value = "start-date", required = false) String startDate, + @RequestParam(value = "end-date", required = false) String endDate, + @RequestParam(value = "count", required = false) Long count, + Model model ){ + model.addAttribute("masterBundles", bundleService.getMasterBundles( id, jobCardId, startDate, endDate, count ) ); + return "/cutting/master-bundles"; + } + + @GetMapping( "/get-child-bundles" ) + public String showBundlesFromMaster( @RequestParam( "master-id" ) long masterId , + Model model ){ + model.addAttribute("bundles", bundleService.findBundlesByMasterId( masterId )); + return "/cutting/child-bundles"; + } + + + @PostMapping( "/generate-barcodes" ) + public ResponseEntity generateBarcode(@RequestParam( name = "ids", required = true ) Long[] ids, + @RequestParam( name = "artifactType", required = true ) String artifactType ) throws Exception { + + return barcodeService.generateBarcodes( Arrays.asList( ids ), artifactType ); + } +} diff --git a/src/main/java/com/utopiaindustries/controller/FinishingController.java b/src/main/java/com/utopiaindustries/controller/FinishingController.java new file mode 100644 index 0000000..f8fa0e9 --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/FinishingController.java @@ -0,0 +1,95 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.dao.ctp.FinishedItemDAO; +import com.utopiaindustries.model.ctp.FinishedItem; +import com.utopiaindustries.model.ctp.FinishedItemWrapper; +import com.utopiaindustries.service.BundleService; +import com.utopiaindustries.service.InventoryAccountService; +import com.utopiaindustries.service.InventoryService; +import com.utopiaindustries.service.LocationService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import java.util.List; + +@Controller +@RequestMapping( "/finishing" ) +public class FinishingController { + + private final FinishedItemDAO finishedItemDAO; + private final BundleService bundleService; + private final InventoryAccountService inventoryAccountService; + private final LocationService locationService; + private final InventoryService inventoryService; + + public FinishingController(FinishedItemDAO finishedItemDAO, BundleService bundleService, InventoryAccountService inventoryAccountService, LocationService locationService, InventoryService inventoryService) { + this.finishedItemDAO = finishedItemDAO; + this.bundleService = bundleService; + this.inventoryAccountService = inventoryAccountService; + this.locationService = locationService; + this.inventoryService = inventoryService; + } + + @GetMapping + public String showHome(Model model ){ + return "redirect:/finishing/finished-items"; + } + + @GetMapping( "/finished-items" ) + public String showFinishedItems( @RequestParam(value = "id", required = false ) String id, + @RequestParam(value = "item-id", required = false ) String itemId, + @RequestParam( value = "sku", required = false ) String sku, + @RequestParam( value = "start-date", required = false) String startDate, + @RequestParam( value = "end-date", required = false ) String endDate, + @RequestParam( value = "job-card-id", required = false ) String jobCardId, + @RequestParam( value = "count", required = false ) Long count, + Model model ){ + List itemList = bundleService.getFinishedItem( id, itemId, sku, startDate, endDate, jobCardId ,count ); + model.addAttribute("items", itemList ) ; + return "finishing/finished-item-list"; + } + + + /* + * get finishing inventory accounts + * */ + @GetMapping( "/inventory-accounts" ) + public String getInventoryAccounts( @RequestParam( value = "id", required = false ) String id, + @RequestParam( value = "title", required = false) String title, + @RequestParam( value = "active", required = false ) String active, + @RequestParam( value = "created-by", required = false ) String createdBy, + @RequestParam( value = "start-date", required = false ) String startDate, + @RequestParam( value = "end-date", required = false ) String endDate, + @RequestParam( value = "site-id", required = false ) String siteId, + @RequestParam( value = "count", required = false ) Long count, + Model model ) { + // 5 for Finishing + model.addAttribute("accounts", inventoryAccountService.getInventoryAccounts( id, title, active, createdBy, startDate, endDate, siteId, count, "PROCESS", "5" , false )); + model.addAttribute("locations", locationService.findAll() ); + return "/finishing/inventory-accounts"; + } + + @GetMapping( "segregate-inventory" ) + public String segregateFinishedItems( Model model ){ + model.addAttribute("accounts", inventoryAccountService.findInventoryAccountsForFinishedItems() ); + model.addAttribute("wrapper", new FinishedItemWrapper() ); + return "/finishing/segregate-inventory"; + } + + + @PostMapping( "segregate-inventory" ) + public String segregateFinishItemsInventory( @ModelAttribute FinishedItemWrapper wrapper, + RedirectAttributes redirectAttributes, + Model model ){ + try { + inventoryService.segregateFinishedItems( wrapper ); + redirectAttributes.addFlashAttribute("success", "Items Successfully saved !" ); + } catch ( Exception e ){ + redirectAttributes.addFlashAttribute("error", e.getMessage() ); + } + return "redirect:/finishing/finished-items"; + } + +} diff --git a/src/main/java/com/utopiaindustries/controller/HomeController.java b/src/main/java/com/utopiaindustries/controller/HomeController.java new file mode 100644 index 0000000..6bbfd28 --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/HomeController.java @@ -0,0 +1,17 @@ +package com.utopiaindustries.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HomeController { + + /** + * show home + */ + @GetMapping + public String showHome( Model model ) { + return "home"; + } +} diff --git a/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java b/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java new file mode 100644 index 0000000..cf06080 --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java @@ -0,0 +1,66 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.model.ctp.InventoryAccount; +import com.utopiaindustries.service.InventoryAccountService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +@Controller +@RequestMapping( "/inventory-accounts" ) +public class InventoryAccountController { + + private final InventoryAccountService inventoryAccountService; + + public InventoryAccountController(InventoryAccountService inventoryAccountService) { + this.inventoryAccountService = inventoryAccountService; + } + + @GetMapping + public String showInventoryAccounts( Model model ){ + model.addAttribute( "accounts", inventoryAccountService.findInventoryAccounts() ); + return "inventory-account-list"; + } + + + @GetMapping( "/new" ) + public String showNewForm( Model model ){ + model.addAttribute( "account", inventoryAccountService.createNewAccount() ); + model.addAttribute("processes", inventoryAccountService.getAllProcess() ); + return "inventory-account-add"; + } + + @GetMapping( "/edit/{id}" ) + public String showEditForm( @PathVariable long id, + Model model ){ + model.addAttribute("account", inventoryAccountService.find(id) ); + model.addAttribute("processes", inventoryAccountService.getAllProcess() ); + return "inventory-account-edit"; + } + + @PostMapping( "/edit" ) + public String saveNewForm( @ModelAttribute InventoryAccount inventoryAccount, + RedirectAttributes redirectAttributes ){ + try { + inventoryAccountService.saveAccount( inventoryAccount ); + redirectAttributes.addFlashAttribute("success", "Inventory Account Successfully Added" ); + } catch ( Exception e ){ + redirectAttributes.addFlashAttribute("error", e.getMessage() ); + } + return "redirect:/inventory-accounts"; + } + + @PostMapping( "/edit/{id}" ) + public String saveNewForm( @ModelAttribute InventoryAccount inventoryAccount, + @PathVariable long id, + RedirectAttributes redirectAttributes ){ + try { + inventoryAccountService.saveAccount( inventoryAccount ); + redirectAttributes.addFlashAttribute("success", "Inventory Account Successfully Added" ); + } catch ( Exception e ){ + redirectAttributes.addFlashAttribute("error", e.getMessage() ); + } + return "redirect:/inventory-accounts"; + } +} diff --git a/src/main/java/com/utopiaindustries/controller/InventoryArtifactController.java b/src/main/java/com/utopiaindustries/controller/InventoryArtifactController.java new file mode 100644 index 0000000..b2cd71d --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/InventoryArtifactController.java @@ -0,0 +1,41 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.service.InventoryArtifactService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping( "/inventory-artifacts" ) +public class InventoryArtifactController { + + + private final InventoryArtifactService inventoryArtifactService; + + public InventoryArtifactController(InventoryArtifactService inventoryArtifactService) { + this.inventoryArtifactService = inventoryArtifactService; + } + + @GetMapping( "/bundle/{id}" ) + public String getBundleViewId( @PathVariable( "id") long id, + Model model ){ + model.addAttribute("bundle", inventoryArtifactService.findBundleById( id) ); + return "bundle-view"; + } + +// @GetMapping( "/master-bundle/{id}" ) +// public String getMasterBundleById( @PathVariable( "id") long id, +// Model model ){ +// model.addAttribute("masterBundle", inventoryArtifactService.findMasterBundleById( id ) ); +// return "master-bundle-view"; +// } + + @GetMapping( "/finished-item/{id}" ) + public String getFinishItemById( @PathVariable( "id" ) long id, + Model model ){ + model.addAttribute("finishedItem", inventoryArtifactService.findFinishedItemById( id ) ); + return "finished-item-view"; + } +} diff --git a/src/main/java/com/utopiaindustries/controller/JobCardController.java b/src/main/java/com/utopiaindustries/controller/JobCardController.java new file mode 100644 index 0000000..9de7e2b --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/JobCardController.java @@ -0,0 +1,117 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.model.ctp.JobCard; +import com.utopiaindustries.service.JobCardService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +@Controller +@RequestMapping( "/job-cards" ) +public class JobCardController { + + private final JobCardService jobCardService; + + public JobCardController(JobCardService jobCardService){ + this.jobCardService = jobCardService; + } + + /** + * get all job cards + * */ + @GetMapping + public String showJobCardList( Model model ){ + model.addAttribute("cards", jobCardService.getCards() ); + return "job-card-list"; + } + + @GetMapping( "/new" ) + public String showJobCardForm( Model model ){ + model.addAttribute("jobCard", jobCardService.createNewJobCard() ); + model.addAttribute("cutPieceTypes", jobCardService.getAllPieceTypes() ); + return "job-card-add"; + } + + @GetMapping( value = "/edit/{id}" ) + public String showJobCardEditForm( @PathVariable("id") long id, + Model model ){ + model.addAttribute("jobCard", jobCardService.findCardRecursively( id ) ); + model.addAttribute("cutPieceTypes", jobCardService.getAllPieceTypes() ); + return "job-card-edit"; + } + + /* + * draft + * */ + @PostMapping( value ="/edit" , params = "user=draft" ) + public String saveJobCard( @ModelAttribute JobCard jobCard, + RedirectAttributes redirectAttributes, + Model model ){ + + try { + jobCard.setStatus( JobCard.Status.DRAFT.name() ); + jobCard.setInventoryStatus( JobCard.InventoryStatus.NOT_RECEIVED_YET.name() ); + jobCardService.save( jobCard ); + redirectAttributes.addFlashAttribute("success", "Successfully saved!" ); + } catch ( Exception ex ){ + redirectAttributes.addFlashAttribute("error", ex.getMessage() ); + } + return "redirect:/job-cards"; + } + + /* + * draft after save + * */ + @PostMapping( value ="/edit/{id}" , params = "user=draft" ) + public String saveJobCardEdit( @ModelAttribute JobCard jobCard, + @PathVariable long id, + RedirectAttributes redirectAttributes, + Model model ){ + + try { + jobCard.setStatus( JobCard.Status.DRAFT.name() ); + jobCard.setInventoryStatus( JobCard.InventoryStatus.NOT_RECEIVED_YET.name() ); + jobCardService.save( jobCard ); + redirectAttributes.addFlashAttribute("success", "Successfully saved!" ); + } catch ( Exception ex ){ + redirectAttributes.addFlashAttribute("error", ex.getMessage() ); + } + return "redirect:/job-cards"; + } + + @PostMapping( value ="/edit" , params = "user=post" ) + public String postJobCard( @ModelAttribute JobCard jobCard, + RedirectAttributes redirectAttributes, + Model model ){ + + try { + jobCard.setStatus(JobCard.Status.POSTED.name() ); + jobCardService.save( jobCard ); + redirectAttributes.addFlashAttribute("success", "Successfully saved!" ); + } catch ( Exception ex ){ + redirectAttributes.addFlashAttribute("error", ex.getMessage() ); + } + return "redirect:/job-cards"; + } + + + /* + * post after draft + * */ + @PostMapping( value ="/edit/{id}" , params = "user=post" ) + public String postJobCardEdit( @ModelAttribute JobCard jobCard, + @PathVariable long id, + RedirectAttributes redirectAttributes, + Model model ){ + + try { + jobCard.setStatus(JobCard.Status.POSTED.name() ); + jobCardService.save( jobCard ); + redirectAttributes.addFlashAttribute("success", "Successfully saved!" ); + } catch ( Exception ex ){ + redirectAttributes.addFlashAttribute("error", ex.getMessage() ); + } + return "redirect:/job-cards"; + } +} diff --git a/src/main/java/com/utopiaindustries/controller/PackagingController.java b/src/main/java/com/utopiaindustries/controller/PackagingController.java new file mode 100644 index 0000000..ca7e5be --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/PackagingController.java @@ -0,0 +1,46 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.service.InventoryAccountService; +import com.utopiaindustries.service.LocationService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +@RequestMapping("/packaging" ) +public class PackagingController { + + + private final InventoryAccountService inventoryAccountService; + private final LocationService locationService; + + public PackagingController(InventoryAccountService inventoryAccountService, LocationService locationService) { + this.inventoryAccountService = inventoryAccountService; + this.locationService = locationService; + } + + + @GetMapping + public String showHome( Model model ){ + return "redirect:/packaging/inventory-accounts"; + } + + @GetMapping( "/inventory-accounts" ) + public String showInventoryAccounts(@RequestParam( value = "id", required = false ) String id, + @RequestParam( value = "title", required = false) String title, + @RequestParam( value = "active", required = false ) String active, + @RequestParam( value = "created-by", required = false ) String createdBy, + @RequestParam( value = "start-date", required = false ) String startDate, + @RequestParam( value = "end-date", required = false ) String endDate, + @RequestParam( value = "site-id", required = false ) String siteId, + @RequestParam( value = "count", required = false ) Long count, + Model model ){ + model.addAttribute("accounts", inventoryAccountService.getInventoryAccounts( id, title, active, createdBy, startDate, endDate, siteId, count , null, null,true ) ); + model.addAttribute("locations", locationService.findAll() ); + return "/packaging/inventory-accounts"; + + } + +} diff --git a/src/main/java/com/utopiaindustries/controller/ProcessController.java b/src/main/java/com/utopiaindustries/controller/ProcessController.java new file mode 100644 index 0000000..21388dc --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/ProcessController.java @@ -0,0 +1,45 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.service.ProcessService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +@Controller +@RequestMapping( "/processes" ) +public class ProcessController { + + private final ProcessService processService; + + public ProcessController(ProcessService processService) { + this.processService = processService; + } + + @GetMapping + public String showProcesses( Model model ){ + model.addAttribute("processes", processService.findAllProcesses() ); + return "process-list"; + } + + @GetMapping("/edit" ) + public String editProcesses(Model model ){ + model.addAttribute("processWrapper", processService.getAllProcessWrapper() ); + return "_process-fragment"; + } + + @PostMapping( "/edit" ) + public String saveProcesses(@ModelAttribute ProcessListWrapper processWrapper, + RedirectAttributes redirectAttributes ){ + try { + processService.saveAll( processWrapper ); + redirectAttributes.addFlashAttribute("success", "Process saved"); + } catch ( Exception e ){ + redirectAttributes.addFlashAttribute("error", e.getMessage() ); + } + return "redirect:/processes"; + } +} diff --git a/src/main/java/com/utopiaindustries/controller/ProcessListWrapper.java b/src/main/java/com/utopiaindustries/controller/ProcessListWrapper.java new file mode 100644 index 0000000..64b8911 --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/ProcessListWrapper.java @@ -0,0 +1,25 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.model.ctp.Process; + +import java.util.List; + +public class ProcessListWrapper { + + public List processes; + + public List getProcesses() { + return processes; + } + + public void setProcesses(List processes) { + this.processes = processes; + } + + @Override + public String toString() { + return "ProcessListWrapper{" + + "processes=" + processes + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/controller/QualityControlController.java b/src/main/java/com/utopiaindustries/controller/QualityControlController.java new file mode 100644 index 0000000..0201c3b --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/QualityControlController.java @@ -0,0 +1,89 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.model.ctp.FinishedItem; +import com.utopiaindustries.model.ctp.StitchedItemWrapper; +import com.utopiaindustries.service.BundleService; +import com.utopiaindustries.service.InventoryAccountService; +import com.utopiaindustries.service.InventoryService; +import com.utopiaindustries.service.LocationService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import java.util.List; + +@Controller +@RequestMapping( "/quality-control" ) +public class QualityControlController { + + private final InventoryAccountService inventoryAccountService; + private final BundleService bundleService; + private final LocationService locationService; + private final InventoryService inventoryService; + + public QualityControlController(InventoryAccountService inventoryAccountService, BundleService bundleService, LocationService locationService, InventoryService inventoryService) { + this.inventoryAccountService = inventoryAccountService; + this.bundleService = bundleService; + this.locationService = locationService; + this.inventoryService = inventoryService; + } + + @GetMapping + public String homePage( Model model ){ + return "redirect:/quality-control/qc-finished-items"; + } + + /* + * get stitching inventory accounts + * */ + @GetMapping( "/inventory-accounts" ) + public String getInventoryAccounts( @RequestParam( value = "id", required = false ) String id, + @RequestParam( value = "title", required = false) String title, + @RequestParam( value = "active", required = false ) String active, + @RequestParam( value = "created-by", required = false ) String createdBy, + @RequestParam( value = "start-date", required = false ) String startDate, + @RequestParam( value = "end-date", required = false ) String endDate, + @RequestParam( value = "site-id", required = false ) String siteId, + @RequestParam( value = "count", required = false ) Long count, + Model model ) { + // 24 for Packaging + model.addAttribute("accounts", inventoryAccountService.getInventoryAccounts(id, title, active, createdBy, startDate, endDate, siteId, count, "PROCESS", "4", false)); + model.addAttribute("locations", locationService.findAll() ); + return "/quality-control/inventory-accounts"; + } + + @GetMapping( "/qc-finished-items" ) + public String getFinishedItems( @RequestParam(value = "id", required = false ) String id, + @RequestParam(value = "item-id", required = false ) String itemId, + @RequestParam( value = "sku", required = false ) String sku, + @RequestParam( value = "start-date", required = false) String startDate, + @RequestParam( value = "end-date", required = false ) String endDate, + @RequestParam( value = "job-card-id", required = false ) String jobCardId, + @RequestParam( value = "count", required = false ) Long count, + Model model ){ + List itemList = bundleService.getFinishedItem( id, itemId, sku, startDate, endDate, jobCardId ,count ); + model.addAttribute("items", itemList ) ; + return "/quality-control/qc-items-list"; + } + + @GetMapping( "/qc-finished-item" ) + public String getAddFinishedItemForQCForm( Model model ){ + // 4 for packaging + model.addAttribute("accounts", inventoryAccountService.findInventoryAccounts(5L) ); + model.addAttribute("wrapper", new StitchedItemWrapper() ); + return "/quality-control/qc-items-form"; + } + + @PostMapping( "/qc-finished-item" ) + public String postFinishedItemsAfterQc( @ModelAttribute StitchedItemWrapper wrapper, + RedirectAttributes redirectAttributes ){ + try { + inventoryService.createFinishedItemsAgainstStitchedItems( wrapper ); + redirectAttributes.addFlashAttribute("success", " Finished Items Are Generated Against Stitched Items" ); + }catch ( Exception ex ){ + redirectAttributes.addFlashAttribute("error", ex.getMessage() ); + } + return "redirect:/quality-control/qc-finished-items"; + } +} diff --git a/src/main/java/com/utopiaindustries/controller/StitchingController.java b/src/main/java/com/utopiaindustries/controller/StitchingController.java new file mode 100644 index 0000000..3989b39 --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/StitchingController.java @@ -0,0 +1,124 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.model.ctp.JobCard; +import com.utopiaindustries.model.ctp.StitchingOfflineItem; +import com.utopiaindustries.service.*; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import java.util.Arrays; +import java.util.List; + +@Controller +@RequestMapping( "/stitching" ) +public class StitchingController { + + private final InventoryAccountService inventoryAccountService; + private final JobCardService jobCardService; + private final InventoryService inventoryService; + private final BundleService bundleService; + private final BarcodeService barcodeService; + private final LocationService locationService; + + public StitchingController(InventoryAccountService inventoryAccountService, JobCardService jobCardService, InventoryService inventoryService, BundleService bundleService, BarcodeService barcodeService, LocationService locationService) { + this.inventoryAccountService = inventoryAccountService; + this.jobCardService = jobCardService; + this.inventoryService = inventoryService; + this.bundleService = bundleService; + this.barcodeService = barcodeService; + this.locationService = locationService; + } + + @GetMapping + public String homePage( Model model ){ + return "redirect:/stitching/receive-inventory"; + } + + @GetMapping( "/receive-inventory" ) + public String receiveInventoryForm( Model model ){ + // 2 for stitching + model.addAttribute("accounts" , inventoryAccountService.findInventoryAccounts( 2L ) ); + model.addAttribute("cutPieceTypes", jobCardService.getAllPieceTypes() ); + return "/stitching/receive-inventory"; + } + + @PostMapping( "/receive-inventory" ) + public String receiveInventoryToCuttingAccount( RedirectAttributes redirectAttributes, + @RequestParam( "master-id" ) long masterId, + @RequestParam( "account-id" ) long accountId ){ + try { + inventoryService.receiveInventoryFromMasterBarcode( masterId, accountId ); + redirectAttributes.addFlashAttribute("success", "Inventory Success Received" ); + } catch ( Exception ex ){ + redirectAttributes.addFlashAttribute("error", ex.getMessage() ); + } + return "redirect:/stitching/receive-inventory"; + } + + /* + * get stitching inventory accounts + * */ + @GetMapping( "/inventory-accounts" ) + public String getInventoryAccounts( @RequestParam( value = "id", required = false ) String id, + @RequestParam( value = "title", required = false) String title, + @RequestParam( value = "active", required = false ) String active, + @RequestParam( value = "created-by", required = false ) String createdBy, + @RequestParam( value = "start-date", required = false ) String startDate, + @RequestParam( value = "end-date", required = false ) String endDate, + @RequestParam( value = "site-id", required = false ) String siteId, + @RequestParam( value = "count", required = false ) Long count, + Model model ) { + // 2 for stitching + model.addAttribute("accounts", inventoryAccountService.getInventoryAccounts(id, title, active, createdBy, startDate, endDate, siteId, count, "PROCESS", "2", false)); + model.addAttribute("locations", locationService.findAll() ); + return "/stitching/inventory-accounts"; + } + + /* + * get finished items + * */ + @GetMapping( "/stitching-offline-items" ) + public String getStitchingOfflineItems( @RequestParam(value = "id", required = false ) String id, + @RequestParam(value = "item-id", required = false ) String itemId, + @RequestParam( value = "sku", required = false ) String sku, + @RequestParam( value = "start-date", required = false) String startDate, + @RequestParam( value = "end-date", required = false ) String endDate, + @RequestParam( value = "job-card-id", required = false ) String jobCardId, + @RequestParam( value = "count", required = false ) Long count, + Model model ){ + List itemList = bundleService.getStitchedOfflineItems( id, itemId, sku, startDate, endDate, jobCardId ,count ); + model.addAttribute("items", itemList ) ; + return "/stitching/stitched-offline-items"; + } + + @GetMapping( "/create-stitching-items") + public String createFinishItems( Model model ){ + model.addAttribute("accounts" , inventoryAccountService.findInventoryAccounts( 2L ) ); + model.addAttribute("jobCard", jobCardService.createNewJobCard() ); + return "/stitching/stitching-item-form"; + } + + @PostMapping( "/create-stitching-items" ) + public String createStitchedOfflineItems( @ModelAttribute JobCard jobCard, + RedirectAttributes redirectAttributes, + Model model ){ + try { + inventoryService.createStitchingOfflineItemsFromJobCard( jobCard ); + redirectAttributes.addFlashAttribute("success", "Finished Item Created Successfully"); + } catch ( Exception exception ){ + redirectAttributes.addFlashAttribute( "error", exception.getMessage() ); + } + return "redirect:/stitching/stitching-offline-items"; + } + + @PostMapping( "/generate-barcodes" ) + public ResponseEntity generateBarcode(@RequestParam( name = "ids" ) Long[] ids, + @RequestParam( name = "artifactType" ) String artifactType ) throws Exception { + + return barcodeService.generateBarcodes( Arrays.asList( ids ), artifactType ); + } +} diff --git a/src/main/java/com/utopiaindustries/controller/UserController.java b/src/main/java/com/utopiaindustries/controller/UserController.java new file mode 100644 index 0000000..d0e888f --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/UserController.java @@ -0,0 +1,73 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.model.Roles; +import com.utopiaindustries.model.ctp.User; +import com.utopiaindustries.service.InventoryAccountService; +import com.utopiaindustries.service.UserService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +@Controller +@RequestMapping( "/users" ) +public class UserController { + + private final UserService userService; + private final InventoryAccountService inventoryAccountService; + + public UserController(UserService userService, InventoryAccountService inventoryAccountService) { + this.userService = userService; + this.inventoryAccountService = inventoryAccountService; + } + + @GetMapping + public String getAllUsers( Model model ){ + model.addAttribute( "users", userService.findAllUsers() ); + return "users"; + } + + + @GetMapping( "/new" ) + public String addUserForm( Model model ){ + model.addAttribute("user", userService.createEmptyUser() ); + model.addAttribute("accounts", inventoryAccountService.findInventoryAccounts() ); + model.addAttribute("roles", Roles.values() ); + return "_user-fragment"; + } + + @GetMapping( "/edit/{username}" ) + public String addUserForm(Model model, @PathVariable String username ){ + model.addAttribute("user", userService.getUser( username ) ); + model.addAttribute("accounts", inventoryAccountService.findInventoryAccounts() ); + model.addAttribute("roles", Roles.values() ); + return "_user-fragment"; + } + + @PostMapping( "/edit" ) + public String saveUser( Model model, + @ModelAttribute User user , + RedirectAttributes redirectAttributes ){ + try { + userService.saveUser( user ); + redirectAttributes.addFlashAttribute("success", "User Successfully Saved!" ); + } catch ( Exception e ){ + redirectAttributes.addFlashAttribute("error", e.getMessage() ); + } + return "redirect:/users"; + } + + @PostMapping( "/edit/{username}" ) + public String saveUser( @PathVariable String username, + @ModelAttribute User user, + RedirectAttributes redirectAttributes ){ + try { + userService.saveUser( user ); + redirectAttributes.addFlashAttribute("success", "User Successfully Edited!" ); + } catch ( Exception e ){ + redirectAttributes.addFlashAttribute("error", e.getMessage() ); + } + return "redirect:/users"; + } + +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/AuthorityDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/AuthorityDAO.java new file mode 100644 index 0000000..4e81d97 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/AuthorityDAO.java @@ -0,0 +1,92 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.Authority; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class AuthorityDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.authorities"; + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY username DESC", TABLE_NAME ); + private final String SELECT_BY_USERNAME_QUERY = String.format( "SELECT * FROM %s WHERE username = :username ORDER BY username DESC", TABLE_NAME ); + private final String SELECT_BY_AUTHORITY_QUERY = String.format( "SELECT * FROM %s WHERE authority = :authority ORDER BY username DESC", TABLE_NAME ); + private final String INSERT_QUERY =String.format("INSERT INTO %s (username,authority) VALUES (:username,:authority)",TABLE_NAME); + private final String DELETE_QUERY=String.format("DELETE FROM %s WHERE username = :username",TABLE_NAME); + private final String SELECT_BY_USERNAMES = String.format("SELECT * FROM %s WHERE username IN (:usernames)" , TABLE_NAME ); + + public AuthorityDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + + /* + * prepare query params + * */ + private MapSqlParameterSource prepareInsertQueryParams( Authority authority ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("username", authority.getUsername() ); + params.addValue("authority", authority.getAuthority() ); + return params; + } + + + /** + * find all + */ + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new AuthorityRowMapper() ); + } + + /** + * find by username + */ + public List findByUsername( String username ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "username", username ); + return namedParameterJdbcTemplate.query( SELECT_BY_USERNAME_QUERY, params, new AuthorityRowMapper() ); + } + + /** + * find by authority + */ + public List findByAuthority( String authority) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "authority", authority ); + return namedParameterJdbcTemplate.query( SELECT_BY_AUTHORITY_QUERY, params, new AuthorityRowMapper() ); + } + /* + * find by username + * */ + public List findByUsernames(List usernames ) { + if( usernames == null || usernames.isEmpty() ) { + return new ArrayList<>(); + } + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "usernames", usernames ); + return namedParameterJdbcTemplate.query( SELECT_BY_USERNAMES, params, new AuthorityRowMapper() ); + } + + public boolean deleteByUsername( String username ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "username", username ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params) > 0; + } + + // save all + public int[] saveAll( List authorities ) { + List batchArgs = new ArrayList<>(); + for ( Authority authority: authorities ) { + MapSqlParameterSource params = prepareInsertQueryParams( authority ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[authorities.size()]) ); + } + +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/AuthorityRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/AuthorityRowMapper.java new file mode 100644 index 0000000..d03e4fb --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/AuthorityRowMapper.java @@ -0,0 +1,16 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.Authority; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class AuthorityRowMapper implements RowMapper { + public Authority mapRow(ResultSet rs, int rowNum ) throws SQLException { + Authority userAuthority = new Authority(); + userAuthority.setUsername( rs.getString( "username" ) ); + userAuthority.setAuthority( rs.getString( "authority" ) ); + return userAuthority; + } +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/BundleDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/BundleDAO.java new file mode 100644 index 0000000..c543a67 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/BundleDAO.java @@ -0,0 +1,141 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.Bundle; +import com.utopiaindustries.util.KeyHolderFunctions; +import com.utopiaindustries.util.StringUtils; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class BundleDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.bundle"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, item_id, sku, wrap_quantity, barcode, type, created_by, created_at, job_card_id, master_bundle_id) VALUES (:id, :item_id, :sku, :wrap_quantity, :barcode, :type, :created_by, :created_at, :job_card_id, :master_bundle_id) ON DUPLICATE KEY UPDATE item_id = VALUES(item_id), sku = VALUES(sku), wrap_quantity = VALUES(wrap_quantity), barcode = VALUES(barcode), type = VALUES(type), created_by = VALUES(created_by), created_at = VALUES(created_at), job_card_id = VALUES(job_card_id), master_bundle_id = VALUES(master_bundle_id)", TABLE_NAME ); + private final String SELECT_BY_TERM_QUERY = String.format( "SELECT * FROM %s WHERE (id = :id OR sku LIKE :sku OR type LIKE :type OR barcode LIKE :barcode) AND master_bundle_id =0", TABLE_NAME ); + private final String SELECT_BY_LIMIT = String.format( "SELECT * FROM %s ORDER BY id DESC LIMIT :limit", TABLE_NAME ); + private final String SELECT_BY_MASTER_ID = String.format( "SELECT * FROM %s WHERE master_bundle_id = :master_bundle_id ORDER BY id DESC", TABLE_NAME ); + private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); + private final String SELECT_BY_ITEM_ID_AND_JOB_CARD = String.format( "SELECT * FROM %s WHERE item_id = :item_id AND job_card_id = :job_card_id", TABLE_NAME ); + private final String SELECT_BY_ITEM_IDS_AND_JOB_CARD = String.format( "SELECT * FROM %s WHERE item_id IN (:item_ids) AND job_card_id = :job_card_id", TABLE_NAME ); + + + public BundleDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( Bundle bundle ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", bundle.getId() ) + .addValue( "item_id", bundle.getItemId() ) + .addValue( "sku", bundle.getSku() ) + .addValue( "wrap_quantity", bundle.getWrapQuantity() ) + .addValue( "barcode", bundle.getBarcode() ) + .addValue( "type", bundle.getType() ) + .addValue( "created_by", bundle.getCreatedBy() ) + .addValue( "created_at", bundle.getCreatedAt() ) + .addValue( "job_card_id", bundle.getJobCardId() ) + .addValue( "master_bundle_id", bundle.getMasterBundleId() ); + return params; + } + + // find + public Bundle find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new BundleRowMapper() ) + .stream() + .findFirst() + .orElse( new Bundle() ); + + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new BundleRowMapper() ); + } + + // save + public long save( Bundle bundle ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( bundle ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( bundle.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List bundles ) { + List batchArgs = new ArrayList<>(); + for ( Bundle bundle: bundles ) { + MapSqlParameterSource params = prepareInsertQueryParams( bundle ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[bundles.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } + + public List findByTerm( String term ){ + if( StringUtils.isNullOrEmpty( term ) ) return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id",term ); + params.addValue( "sku","%" + term + "%" ); + params.addValue( "type","%" + term + "%" ); + params.addValue("barcode", "%" + term + "%" ); + return namedParameterJdbcTemplate.query( SELECT_BY_TERM_QUERY, params , new BundleRowMapper() ); + } + + public List findByQuery( String query ){ + return namedParameterJdbcTemplate.query( query, new BundleRowMapper() ); + } + + public List findByLimit( Long count ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "limit",count ); + return namedParameterJdbcTemplate.query( SELECT_BY_LIMIT , params, new BundleRowMapper() ); + } + + public List findByMasterId( long masterId ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("master_bundle_id", masterId ); + return namedParameterJdbcTemplate.query( SELECT_BY_MASTER_ID, params, new BundleRowMapper() ); + } + + public List findByIds( List ids ){ + if( ids == null || ids.isEmpty() ) return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids", ids ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS , params, new BundleRowMapper() ); + } + + public List findByItemIdAndCardId( long itemId, long cardId ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("item_id", itemId ); + params.addValue("job_card_id", cardId ); + return namedParameterJdbcTemplate.query( SELECT_BY_ITEM_ID_AND_JOB_CARD, params, new BundleRowMapper() ); + } + + public List findByItemIdsAndCardId( List itemIds, long cardId ){ + if( itemIds == null || itemIds.isEmpty() ) return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("item_ids", itemIds ); + params.addValue("job_card_id", cardId ); + return namedParameterJdbcTemplate.query( SELECT_BY_ITEM_IDS_AND_JOB_CARD, params, new BundleRowMapper() ); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/BundleRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/BundleRowMapper.java new file mode 100644 index 0000000..bdeb042 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/BundleRowMapper.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.Bundle; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class BundleRowMapper implements RowMapper { + public Bundle mapRow( ResultSet rs, int rowNum ) throws SQLException { + Bundle bundle = new Bundle(); + bundle.setId( rs.getLong( "id" ) ); + bundle.setItemId( rs.getLong( "item_id" ) ); + bundle.setSku( rs.getString( "sku" ) ); + bundle.setWrapQuantity( rs.getBigDecimal( "wrap_quantity" ) ); + bundle.setBarcode( rs.getString( "barcode" ) ); + bundle.setType( rs.getString( "type" ) ); + bundle.setCreatedBy( rs.getString( "created_by" ) ); + if ( rs.getTimestamp( "created_at" ) != null ) { + bundle.setCreatedAt( rs.getTimestamp( "created_at" ).toLocalDateTime() ); + } + bundle.setJobCardId( rs.getLong( "job_card_id" ) ); + bundle.setMasterBundleId( rs.getLong( "master_bundle_id" ) ); + return bundle; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/BundleWrapper.java b/src/main/java/com/utopiaindustries/dao/ctp/BundleWrapper.java new file mode 100644 index 0000000..f955da3 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/BundleWrapper.java @@ -0,0 +1,31 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.Bundle; + +import java.util.ArrayList; +import java.util.List; + +public class BundleWrapper { + + private List bundles; + + public BundleWrapper(){ + this.bundles = new ArrayList<>(); + } + + + public List getBundles() { + return bundles; + } + + public void setBundles(List bundles) { + this.bundles = bundles; + } + + @Override + public String toString() { + return "BundleWrapper{" + + "bundles=" + bundles + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/CutPieceDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/CutPieceDAO.java new file mode 100644 index 0000000..a3d3257 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/CutPieceDAO.java @@ -0,0 +1,94 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.CutPiece; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class CutPieceDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.cut_piece"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_BY_ITEM_IDS = String.format( "SELECT * FROM %s WHERE job_card_item_id IN (:item_ids)", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, job_card_item_id, type, quantity) VALUES (:id, :job_card_item_id, :type, :quantity) ON DUPLICATE KEY UPDATE job_card_item_id = VALUES(job_card_item_id), type = VALUES(type), quantity = VALUES(quantity)", TABLE_NAME ); + private final String DELETE_BY_ITEM_ID = String.format( "DELETE FROM %s WHERE job_card_item_id = :job_card_item_id", TABLE_NAME ); + + public CutPieceDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( CutPiece cutPiece ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", cutPiece.getId() ) + .addValue( "job_card_item_id", cutPiece.getJobCardItemId() ) + .addValue( "type", cutPiece.getType() ) + .addValue( "quantity", cutPiece.getQuantity() ); + return params; + } + + // find + public CutPiece find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new CutPieceRowMapper() ) + .stream() + .findFirst() + .orElse( new CutPiece() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new CutPieceRowMapper() ); + } + + // save + public long save( CutPiece cutPiece ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( cutPiece ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( cutPiece.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List cutPieces ) { + List batchArgs = new ArrayList<>(); + for ( CutPiece cutPiece: cutPieces ) { + MapSqlParameterSource params = prepareInsertQueryParams( cutPiece ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[cutPieces.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } + + public List findByJobCardItemIds( List itemIds ){ + if( itemIds == null || itemIds.isEmpty() ) + return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("item_ids", itemIds ); + return namedParameterJdbcTemplate.query(SELECT_BY_ITEM_IDS, params, new CutPieceRowMapper() ); + } + + public boolean deleteByItemId( long jobCardItemId ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("job_card_item_id", jobCardItemId ); + return namedParameterJdbcTemplate.update( DELETE_BY_ITEM_ID , params ) > 0; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/CutPieceRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/CutPieceRowMapper.java new file mode 100644 index 0000000..099e0cb --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/CutPieceRowMapper.java @@ -0,0 +1,18 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.CutPiece; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CutPieceRowMapper implements RowMapper{ + public CutPiece mapRow( ResultSet rs, int rowNum ) throws SQLException { + CutPiece cutPiece = new CutPiece(); + cutPiece.setId( rs.getLong( "id" ) ); + cutPiece.setJobCardItemId( rs.getLong( "job_card_item_id" ) ); + cutPiece.setType( rs.getString( "type" ) ); + cutPiece.setQuantity( rs.getBigDecimal( "quantity" ) ); + return cutPiece; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/CutPieceTypeDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/CutPieceTypeDAO.java new file mode 100644 index 0000000..96b61e9 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/CutPieceTypeDAO.java @@ -0,0 +1,76 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.CutPieceType; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class CutPieceTypeDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.cut_piece_type"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, title) VALUES (:id, :title) ON DUPLICATE KEY UPDATE title = VALUES(title)", TABLE_NAME ); + + public CutPieceTypeDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( CutPieceType cutPieceType ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", cutPieceType.getId() ) + .addValue( "title", cutPieceType.getTitle() ); + return params; + } + + // find + public CutPieceType find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new CutPieceTypeRowMapper() ) + .stream() + .findFirst() + .orElse( new CutPieceType() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new CutPieceTypeRowMapper() ); + } + + // save + public long save( CutPieceType cutPieceType ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( cutPieceType ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( cutPieceType.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List cutPieceTypes ) { + List batchArgs = new ArrayList<>(); + for ( CutPieceType cutPieceType: cutPieceTypes ) { + MapSqlParameterSource params = prepareInsertQueryParams( cutPieceType ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[cutPieceTypes.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/CutPieceTypeRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/CutPieceTypeRowMapper.java new file mode 100644 index 0000000..1e4e087 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/CutPieceTypeRowMapper.java @@ -0,0 +1,16 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.CutPieceType; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CutPieceTypeRowMapper implements RowMapper { + public CutPieceType mapRow( ResultSet rs, int rowNum ) throws SQLException { + CutPieceType cutPieceType = new CutPieceType(); + cutPieceType.setId( rs.getLong( "id" ) ); + cutPieceType.setTitle( rs.getString( "title" ) ); + return cutPieceType; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java new file mode 100644 index 0000000..3d3f44c --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java @@ -0,0 +1,132 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.FinishedItem; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class FinishedItemDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.finished_item"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, item_id, sku, barcode, created_at, created_by, job_card_id, is_qa, stitched_item_id, is_segregated, qa_status) VALUES (:id, :item_id, :sku, :barcode, :created_at, :created_by, :job_card_id, :is_qa, :stitched_item_id, :is_segregated, :qa_status) ON DUPLICATE KEY UPDATE item_id = VALUES(item_id), sku = VALUES(sku), barcode = VALUES(barcode), created_at = VALUES(created_at), created_by = VALUES(created_by), job_card_id = VALUES(job_card_id), is_qa = VALUES(is_qa), stitched_item_id = VALUES(stitched_item_id), is_segregated = VALUES(is_segregated), qa_status = VALUES(qa_status)", TABLE_NAME ); + private final String SELECT_BY_LIMIT = String.format("SELECT * FROM %s ORDER BY id DESC LIMIT :limit", TABLE_NAME ); + private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); + private final String SELECT_BY_TERM = String.format( "SELECT * FROM %s WHERE barcode LIKE :term AND is_segregated = :is_segregated ORDER BY ID DESC", TABLE_NAME ); + private final String SELECT_BY_STITCHED_ITEM_ID = String.format( "SELECT * FROM %s WHERE stitched_item_id = :stitched_item_id", TABLE_NAME ); + private final String SELECT_BY_STITCHED_ITEM_IDS = String.format( "SELECT * FROM %s WHERE stitched_item_id IN (:stitched_item_ids)", TABLE_NAME ); + + public FinishedItemDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( FinishedItem finishedItem ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", finishedItem.getId() ) + .addValue( "item_id", finishedItem.getItemId() ) + .addValue( "sku", finishedItem.getSku() ) + .addValue( "barcode", finishedItem.getBarcode() ) + .addValue( "created_at", finishedItem.getCreatedAt() ) + .addValue( "created_by", finishedItem.getCreatedBy() ) + .addValue("job_card_id", finishedItem.getJobCardId() ) + .addValue("is_qa", finishedItem.getIsQa() ) + .addValue("stitched_item_id", finishedItem.getStitchedItemId() ) + .addValue("is_segregated", finishedItem.getIsSegregated() ) + .addValue("qa_status", finishedItem.getQaStatus() ); + return params; + } + + // find + public FinishedItem find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new FinishedItemRowMapper() ) + .stream() + .findFirst() + .orElse( new FinishedItem() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new FinishedItemRowMapper() ); + } + + // save + public long save( FinishedItem finishedItem ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( finishedItem ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( finishedItem.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List finishedItems ) { + List batchArgs = new ArrayList<>(); + for ( FinishedItem finishedItem: finishedItems ) { + MapSqlParameterSource params = prepareInsertQueryParams( finishedItem ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[finishedItems.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } + + public List findByLimit(Long count ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "limit",count ); + return namedParameterJdbcTemplate.query( SELECT_BY_LIMIT , params, new FinishedItemRowMapper() ); + } + + public List findByQuery(String query ){ + return namedParameterJdbcTemplate.query( query, new FinishedItemRowMapper() ); + } + + public List findByIds(List ids ){ + if( ids == null || ids.isEmpty() ) return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids", ids ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS , params, new FinishedItemRowMapper() ); + } + + public List findByTerm( String term , boolean isSegregated ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("term", "%" + term + "%" ); + params.addValue("is_segregated", isSegregated ); + return namedParameterJdbcTemplate.query( SELECT_BY_TERM , params, new FinishedItemRowMapper() ); + } + + + public FinishedItem findByStitchedItem( long stitchedItemId ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("stitched_item_id", stitchedItemId ); + return namedParameterJdbcTemplate.query( SELECT_BY_STITCHED_ITEM_ID , params, new FinishedItemRowMapper() ) + .stream() + .findFirst() + .orElse( null ); + + } + + public List findByStitchedItemIds( List stitchedItemIds ){ + if( stitchedItemIds == null || stitchedItemIds.isEmpty() ) return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("stitched_item_ids", stitchedItemIds ); + return namedParameterJdbcTemplate.query( SELECT_BY_STITCHED_ITEM_IDS, params, new FinishedItemRowMapper() ); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemRowMapper.java new file mode 100644 index 0000000..7520147 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemRowMapper.java @@ -0,0 +1,27 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.FinishedItem; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class FinishedItemRowMapper implements RowMapper { + public FinishedItem mapRow( ResultSet rs, int rowNum ) throws SQLException { + FinishedItem finishedItem = new FinishedItem(); + finishedItem.setId( rs.getLong( "id" ) ); + finishedItem.setItemId( rs.getLong( "item_id" ) ); + finishedItem.setSku( rs.getString( "sku" ) ); + finishedItem.setBarcode( rs.getString( "barcode" ) ); + if ( rs.getTimestamp( "created_at" ) != null ) { + finishedItem.setCreatedAt( rs.getTimestamp( "created_at" ).toLocalDateTime() ); + } + finishedItem.setCreatedBy( rs.getString( "created_by" ) ); + finishedItem.setJobCardId( rs.getLong("job_card_id") ); + finishedItem.setIsQa( rs.getBoolean("is_qa")); + finishedItem.setStitchedItemId( rs.getLong("stitched_item_id" ) ); + finishedItem.setIsSegregated( rs.getBoolean( "is_segregated") ); + finishedItem.setQaStatus( rs.getString("qa_status" ) ); + return finishedItem; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java new file mode 100644 index 0000000..8bc03a4 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java @@ -0,0 +1,139 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.InventoryAccount; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class InventoryAccountDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.inventory_account"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, title, parent_entity_type, parent_entity_id, active, created_by, created_at, location_site_id, notes, is_packaging) VALUES (:id, :title, :parent_entity_type, :parent_entity_id, :active, :created_by, :created_at, :location_site_id, :notes, :is_packaging) ON DUPLICATE KEY UPDATE title = VALUES(title), parent_entity_type = VALUES(parent_entity_type), parent_entity_id = VALUES(parent_entity_id), active = VALUES(active), created_by = VALUES(created_by), created_at = VALUES(created_at), location_site_id = VALUES(location_site_id), notes = VALUES(notes), is_packaging = VALUES(is_packaging)", TABLE_NAME ); + private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); + private final String SELECT_BY_IDS_AND_PARENT_ID = String.format( "SELECT * FROM %s WHERE id IN (:ids) AND parent_entity_id = :parent_entity_id", TABLE_NAME ); + private final String SELECT_BY_IDS_AND_PARENT_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids) AND parent_entity_id IN (:parent_entity_ids)", TABLE_NAME ); + private final String SELECT_BY_IDS_AND_PARENT_ENTITY_TYPE_AND_PARENT_ID_AND_COUNT = String.format( "SELECT * FROM %s WHERE id IN (:ids) AND parent_entity_id = :parent_entity_id AND parent_entity_type = :parent_entity_type LIMIT :limit", TABLE_NAME ); + private final String SELECT_BY_IDS_PACKAGING_AND_COUNT = String.format( "SELECT * FROM %s WHERE id IN (:ids) AND is_packaging = :is_packaging LIMIT :limit", TABLE_NAME ); + + public InventoryAccountDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( InventoryAccount inventoryAccount ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", inventoryAccount.getId() ) + .addValue( "title", inventoryAccount.getTitle() ) + .addValue( "parent_entity_type", inventoryAccount.getParentEntityType() ) + .addValue( "parent_entity_id", inventoryAccount.getParentEntityId() ) + .addValue( "active", inventoryAccount.getActive() ) + .addValue( "created_by", inventoryAccount.getCreatedBy() ) + .addValue( "created_at", inventoryAccount.getCreatedAt() ) + .addValue( "location_site_id", inventoryAccount.getLocationSiteId() ) + .addValue( "notes", inventoryAccount.getNotes() ) + .addValue("is_packaging", inventoryAccount.getIsPackaging() ); + return params; + } + + // find + public InventoryAccount find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new InventoryAccountRowMapper() ) + .stream() + .findFirst() + .orElse( new InventoryAccount() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new InventoryAccountRowMapper() ); + } + + // save + public long save( InventoryAccount inventoryAccount ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( inventoryAccount ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( inventoryAccount.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List inventoryAccounts ) { + List batchArgs = new ArrayList<>(); + for ( InventoryAccount inventoryAccount: inventoryAccounts ) { + MapSqlParameterSource params = prepareInsertQueryParams( inventoryAccount ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[inventoryAccounts.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } + + public List findByIds( List accountIds ){ + if( accountIds == null || accountIds.isEmpty() ){ + return new ArrayList<>(); + } + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "ids", accountIds ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS, params, new InventoryAccountRowMapper() ); + } + + public List findByIdsAndProcessId( List accountIds, Long processId ){ + if( accountIds == null || accountIds.isEmpty() ){ + return new ArrayList<>(); + } + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "ids", accountIds ); + params.addValue( "parent_entity_id", processId ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS_AND_PARENT_ID, params, new InventoryAccountRowMapper() ); + } + + public List findByIdsAndProcessIds( List accountIds, List processIds ){ + if( accountIds == null || accountIds.isEmpty() || processIds == null || processIds.isEmpty() ){ + return new ArrayList<>(); + } + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "ids", accountIds ); + params.addValue( "parent_entity_ids", processIds ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS_AND_PARENT_IDS, params, new InventoryAccountRowMapper() ); + } + + public List findByIdsAndParentTypeAndIdAndLimit( List accountIds, Long count , String parentEntityType, String parentEntityId ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids" , accountIds ); + params.addValue("limit", count ); + params.addValue("parent_entity_type", parentEntityType ); + params.addValue("parent_entity_id", parentEntityId ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS_AND_PARENT_ENTITY_TYPE_AND_PARENT_ID_AND_COUNT, params, new InventoryAccountRowMapper() ); + } + + public List findByIdsAndPackagingAndIdAndLimit( List accountIds, Long count, boolean isPackaging ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids" , accountIds ); + params.addValue("is_packaging", isPackaging ); + params.addValue("limit", count ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS_PACKAGING_AND_COUNT, params, new InventoryAccountRowMapper() ); + } + + public List findByQuery( String query ){ + return namedParameterJdbcTemplate.query( query, new InventoryAccountRowMapper() ); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java new file mode 100644 index 0000000..1442d83 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.InventoryAccount; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InventoryAccountRowMapper implements RowMapper { + public InventoryAccount mapRow( ResultSet rs, int rowNum ) throws SQLException { + InventoryAccount inventoryAccount = new InventoryAccount(); + inventoryAccount.setId( rs.getLong( "id" ) ); + inventoryAccount.setTitle( rs.getString( "title" ) ); + inventoryAccount.setParentEntityType( rs.getString( "parent_entity_type" ) ); + inventoryAccount.setParentEntityId( rs.getLong( "parent_entity_id" ) ); + inventoryAccount.setActive( rs.getBoolean( "active" ) ); + inventoryAccount.setCreatedBy( rs.getString( "created_by" ) ); + if ( rs.getTimestamp( "created_at" ) != null ) { + inventoryAccount.setCreatedAt( rs.getTimestamp( "created_at" ).toLocalDateTime() ); + } + inventoryAccount.setLocationSiteId( rs.getInt( "location_site_id" ) ); + inventoryAccount.setNotes( rs.getString( "notes" ) ); + inventoryAccount.setIsPackaging( rs.getBoolean("is_packaging" ) ); + return inventoryAccount; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionDAO.java new file mode 100644 index 0000000..b659485 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionDAO.java @@ -0,0 +1,86 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.InventoryTransaction; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class InventoryTransactionDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.inventory_transaction"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, transaction_datetime, generated_by, notes) VALUES (:id, :transaction_datetime, :generated_by, :notes) ON DUPLICATE KEY UPDATE transaction_datetime = VALUES(transaction_datetime), generated_by = VALUES(generated_by), notes = VALUES(notes)", TABLE_NAME ); + private final String SELECT_BY_IDS = String.format("SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); + + public InventoryTransactionDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( InventoryTransaction inventoryTransaction ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", inventoryTransaction.getId() ) + .addValue( "transaction_datetime", inventoryTransaction.getTransactionDateTime() ) + .addValue( "generated_by", inventoryTransaction.getGeneratedBy() ) + .addValue( "notes", inventoryTransaction.getNotes() ); + return params; + } + + // find + public InventoryTransaction find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new InventoryTransactionRowMapper() ) + .stream() + .findFirst() + .orElse( new InventoryTransaction() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new InventoryTransactionRowMapper() ); + } + + // save + public long save( InventoryTransaction inventoryTransaction ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( inventoryTransaction ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( inventoryTransaction.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List inventoryTransactions ) { + List batchArgs = new ArrayList<>(); + for ( InventoryTransaction inventoryTransaction: inventoryTransactions ) { + MapSqlParameterSource params = prepareInsertQueryParams( inventoryTransaction ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[inventoryTransactions.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } + + public List findByIds( List ids ){ + if( ids == null || ids.isEmpty() ) return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids", ids ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS, params, new InventoryTransactionRowMapper() ); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionLegDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionLegDAO.java new file mode 100644 index 0000000..ac4191f --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionLegDAO.java @@ -0,0 +1,156 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.InventorySummary; +import com.utopiaindustries.model.ctp.InventoryTransactionLeg; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class InventoryTransactionLegDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.inventory_transaction_leg"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, transaction_id, item_id, sku, type, quantity, account_id, balance, transaction_leg_datetime, parent_document_type, parent_document_id, parent_document_piece_type) VALUES (:id, :transaction_id, :item_id, :sku, :type, :quantity, :account_id, :balance, :transaction_leg_datetime, :parent_document_type, :parent_document_id, :parent_document_piece_type) ON DUPLICATE KEY UPDATE transaction_id = VALUES(transaction_id), item_id = VALUES(item_id), sku = VALUES(sku), type = VALUES(type), quantity = VALUES(quantity), account_id = VALUES(account_id), balance = VALUES(balance), transaction_leg_datetime = VALUES(transaction_leg_datetime), parent_document_type = VALUES(parent_document_type), parent_document_id = VALUES(parent_document_id), parent_document_piece_type = VALUES(parent_document_piece_type)", TABLE_NAME ); + private final String SELECT_LAST_ACCOUNT_ID_AND_ITEM_ID = String.format( "SELECT * FROM %s WHERE account_id = :account_id AND item_id = :item_id AND parent_document_type= :parent_document_type AND parent_document_piece_type = :parent_document_piece_type ORDER BY id DESC LIMIT 1", TABLE_NAME ); + private final String SELECT_BY_ACCOUNT_ID = String.format( "SELECT * FROM %s WHERE account_id = :account_id ORDER BY id DESC" , TABLE_NAME ); + private final String SELECT_SUMMARY_BY_ACCOUNT_ID = String.format( "SELECT item_id, sku, parent_document_type,parent_document_piece_type," + + " SUM(CASE WHEN type = 'IN' THEN quantity WHEN type = 'OUT' THEN -quantity ELSE 0 END) AS balance" + + " FROM %s" + + " WHERE account_id = :account_id" + + " GROUP BY item_id, parent_document_type, parent_document_piece_type", TABLE_NAME ); + + private final String SELECT_LAST_LEG_BY_TYPE_AND_PARENT_ID = String.format( "SELECT itl.* FROM %s itl" + + " JOIN (" + + " SELECT parent_document_id, parent_document_type, MAX(id) AS max_id" + + " FROM %s" + + " WHERE type = :type" + + " AND parent_document_id IN (:parent_ids)" + + " GROUP BY parent_document_id,parent_document_type )" + + " last_in_transaction" + + " ON itl.parent_document_id = last_in_transaction.parent_document_id" + + " AND itl.id = last_in_transaction.max_id" + + " AND itl.parent_document_type = last_in_transaction.parent_document_type" + + " WHERE itl.type = :type" + + " AND itl.parent_document_type = :parent_document_type" + , TABLE_NAME, TABLE_NAME ); + + public InventoryTransactionLegDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( InventoryTransactionLeg inventoryTransactionLeg ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", inventoryTransactionLeg.getId() ) + .addValue( "transaction_id", inventoryTransactionLeg.getTransactionId() ) + .addValue( "item_id", inventoryTransactionLeg.getItemId() ) + .addValue( "sku", inventoryTransactionLeg.getSku() ) + .addValue( "type", inventoryTransactionLeg.getType() ) + .addValue( "quantity", inventoryTransactionLeg.getQuantity() ) + .addValue( "account_id", inventoryTransactionLeg.getAccountId() ) + .addValue( "balance", inventoryTransactionLeg.getBalance() ) + .addValue( "transaction_leg_datetime", inventoryTransactionLeg.getTransactionLegDateTime() ) + .addValue( "parent_document_type", inventoryTransactionLeg.getParentDocumentType() ) + .addValue( "parent_document_id", inventoryTransactionLeg.getParentDocumentId() ) + .addValue("parent_document_piece_type", inventoryTransactionLeg.getParentDocumentPieceType() ); + return params; + } + + // find + public InventoryTransactionLeg find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new InventoryTransactionLegRowMapper() ) + .stream() + .findFirst() + .orElse( new InventoryTransactionLeg() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new InventoryTransactionLegRowMapper() ); + } + + // save + public long save( InventoryTransactionLeg inventoryTransactionLeg ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( inventoryTransactionLeg ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( inventoryTransactionLeg.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List inventoryTransactionLegs ) { + List batchArgs = new ArrayList<>(); + for ( InventoryTransactionLeg inventoryTransactionLeg: inventoryTransactionLegs ) { + MapSqlParameterSource params = prepareInsertQueryParams( inventoryTransactionLeg ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[inventoryTransactionLegs.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } + + public InventoryTransactionLeg findLastByAccountIdAndItemIdAndParentType( long accountId, + long itemId, + String parentType, + String pieceType ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "account_id", accountId ); + params.addValue("item_id", itemId ); + params.addValue("parent_document_type", parentType ); + params.addValue("parent_document_piece_type", pieceType ); + return namedParameterJdbcTemplate.query( SELECT_LAST_ACCOUNT_ID_AND_ITEM_ID, params, new InventoryTransactionLegRowMapper() ) + .stream() + .findFirst() + .orElse( new InventoryTransactionLeg() ); + } + + public List findByAccountId( long accountId ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "account_id", accountId ); + return namedParameterJdbcTemplate.query( SELECT_BY_ACCOUNT_ID, params, new InventoryTransactionLegRowMapper() ); + } + + public List findSummaryByAccountId( long accountId ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("account_id", accountId ); + return namedParameterJdbcTemplate.query( SELECT_SUMMARY_BY_ACCOUNT_ID, params, (rs, i) -> { + InventorySummary summary = new InventorySummary(); + summary.setItemId( rs.getLong("item_id" ) ); + summary.setSku( rs.getString( "sku") ); + summary.setParentDocumentType( rs.getString("parent_document_type" ) ); + summary.setParentDocumentType( rs.getString("parent_document_type" ) ); + summary.setPieceType( rs.getString("parent_document_piece_type") ); + summary.setBalance( rs.getBigDecimal( "balance" )); + return summary; + }); + } + + public List findLastTransactionByParentIdAndParentType( String type , List parentIds , String parentType){ + if ( parentIds == null || parentIds.isEmpty() ){ + return new ArrayList<>(); + } + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("type", type ); + params.addValue("parent_ids", parentIds ); + params.addValue("parent_document_type", parentType ); + return namedParameterJdbcTemplate.query( SELECT_LAST_LEG_BY_TYPE_AND_PARENT_ID , params, new InventoryTransactionLegRowMapper() ); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionLegRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionLegRowMapper.java new file mode 100644 index 0000000..da599ea --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionLegRowMapper.java @@ -0,0 +1,28 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.InventoryTransactionLeg; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InventoryTransactionLegRowMapper implements RowMapper { + public InventoryTransactionLeg mapRow( ResultSet rs, int rowNum ) throws SQLException { + InventoryTransactionLeg inventoryTransactionLeg = new InventoryTransactionLeg(); + inventoryTransactionLeg.setId( rs.getLong( "id" ) ); + inventoryTransactionLeg.setTransactionId( rs.getLong( "transaction_id" ) ); + inventoryTransactionLeg.setItemId( rs.getLong( "item_id" ) ); + inventoryTransactionLeg.setSku( rs.getString( "sku" ) ); + inventoryTransactionLeg.setType( rs.getString( "type" ) ); + inventoryTransactionLeg.setQuantity( rs.getBigDecimal( "quantity" ) ); + inventoryTransactionLeg.setAccountId( rs.getInt( "account_id" ) ); + inventoryTransactionLeg.setBalance( rs.getBigDecimal( "balance" ) ); + if ( rs.getTimestamp( "transaction_leg_datetime" ) != null ) { + inventoryTransactionLeg.setTransactionLegDateTime( rs.getTimestamp( "transaction_leg_datetime" ).toLocalDateTime() ); + } + inventoryTransactionLeg.setParentDocumentType( rs.getString( "parent_document_type" ) ); + inventoryTransactionLeg.setParentDocumentId( rs.getLong( "parent_document_id" ) ); + inventoryTransactionLeg.setParentDocumentPieceType( rs.getString("parent_document_piece_type")); + return inventoryTransactionLeg; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionRowMapper.java new file mode 100644 index 0000000..ce566e9 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionRowMapper.java @@ -0,0 +1,20 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.InventoryTransaction; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InventoryTransactionRowMapper implements RowMapper { + public InventoryTransaction mapRow( ResultSet rs, int rowNum ) throws SQLException { + InventoryTransaction inventoryTransaction = new InventoryTransaction(); + inventoryTransaction.setId( rs.getLong( "id" ) ); + if ( rs.getTimestamp( "transaction_datetime" ) != null ) { + inventoryTransaction.setTransactionDateTime( rs.getTimestamp( "transaction_datetime" ).toLocalDateTime() ); + } + inventoryTransaction.setGeneratedBy( rs.getString( "generated_by" ) ); + inventoryTransaction.setNotes( rs.getString( "notes" ) ); + return inventoryTransaction; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java new file mode 100644 index 0000000..0b442d9 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java @@ -0,0 +1,101 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.JobCard; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class JobCardDAO { + + @Autowired + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.job_card"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, code, job_order_id, created_at, created_by, status, inventory_status, customer, lot_number, purchase_order_id, location_site_id, description) VALUES (:id, :code, :job_order_id, :created_at, :created_by, :status, :inventory_status, :customer, :lot_number, :purchase_order_id, :location_site_id, :description) ON DUPLICATE KEY UPDATE code = VALUES(code), job_order_id = VALUES(job_order_id), created_at = VALUES(created_at), created_by = VALUES(created_by), status = VALUES(status), inventory_status = VALUES(inventory_status), customer = VALUES(customer), lot_number = VALUES(lot_number), purchase_order_id = VALUES(purchase_order_id), location_site_id = VALUES(location_site_id), description = VALUES(description)", TABLE_NAME ); + private final String SELECT_BY_LIKE_CODE_AND_INV_STATUS_AND_STATUS = String.format( "SELECT * FROM %s WHERE code like :code AND status = :status AND inventory_status = :inventory_status", TABLE_NAME ); + private final String SELECT_BY_LIKE_CODE = String.format( "SELECT * FROM %s WHERE code like :code", TABLE_NAME ); + + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( JobCard jobCard ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", jobCard.getId() ) + .addValue("code", jobCard.getCode() ) + .addValue( "job_order_id", jobCard.getJobOrderId() ) + .addValue( "created_at", jobCard.getCreatedAt() ) + .addValue( "created_by", jobCard.getCreatedBy() ) + .addValue("status", jobCard.getStatus() ) + .addValue("inventory_status", jobCard.getInventoryStatus() ) + .addValue("customer", jobCard.getCustomer() ) + .addValue("lot_number", jobCard.getLotNumber() ) + .addValue("purchase_order_id", jobCard.getPurchaseOrderId() ) + .addValue("location_site_id", jobCard.getLocationSiteId() ) + .addValue("description", jobCard.getDescription() ); + return params; + } + + // find + public JobCard find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new JobCardRowMapper() ) + .stream() + .findFirst() + .orElse( new JobCard() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new JobCardRowMapper() ); + } + + // save + public long save( JobCard jobCard ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( jobCard ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( jobCard.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List jobCards ) { + List batchArgs = new ArrayList<>(); + for ( JobCard jobCard: jobCards ) { + MapSqlParameterSource params = prepareInsertQueryParams( jobCard ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[jobCards.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } + + public List findLikeCode( String code ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("code", "%" + code + "%"); + return namedParameterJdbcTemplate.query(SELECT_BY_LIKE_CODE, params, new JobCardRowMapper()); + } + + public List findLikeCode( String code , String inventoryStatus, String status ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "code", "%" + code + "%" ); + params.addValue("inventory_status", inventoryStatus ); + params.addValue("status", status ); + return namedParameterJdbcTemplate.query(SELECT_BY_LIKE_CODE_AND_INV_STATUS_AND_STATUS, params, new JobCardRowMapper() ); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java new file mode 100644 index 0000000..96c1c6c --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java @@ -0,0 +1,87 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.JobCardItem; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class JobCardItemDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.job_card_item"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_BY_CARD_ID = String.format( "SELECT * FROM %s WHERE job_card_id = :card_id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, job_card_id, item_id, sku, expected_production_quantity, total_production) VALUES (:id, :job_card_id, :item_id, :sku, :expected_production_quantity, :total_production) ON DUPLICATE KEY UPDATE job_card_id = VALUES(job_card_id), item_id = VALUES(item_id), sku = VALUES(sku), expected_production_quantity = VALUES(expected_production_quantity), total_production = VALUES(total_production)", TABLE_NAME ); + + public JobCardItemDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( JobCardItem jobCardItem ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", jobCardItem.getId() ) + .addValue( "job_card_id", jobCardItem.getJobCardId() ) + .addValue( "item_id", jobCardItem.getItemId() ) + .addValue( "sku", jobCardItem.getSku() ) + .addValue( "expected_production_quantity", jobCardItem.getExpectedProductionQuantity() ) + .addValue("total_production", jobCardItem.getTotalProduction() ); + return params; + } + + // find + public JobCardItem find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new JobCardItemRowMapper() ) + .stream() + .findFirst() + .orElse( new JobCardItem() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new JobCardItemRowMapper() ); + } + + // save + public long save( JobCardItem jobCardItem ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( jobCardItem ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( jobCardItem.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List jobCardItems ) { + List batchArgs = new ArrayList<>(); + for ( JobCardItem jobCardItem: jobCardItems ) { + MapSqlParameterSource params = prepareInsertQueryParams( jobCardItem ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[jobCardItems.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } + + public List findByCardId( long cardId ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "card_id", cardId ); + return namedParameterJdbcTemplate.query(SELECT_BY_CARD_ID, params, new JobCardItemRowMapper() ); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemRowMapper.java new file mode 100644 index 0000000..07ec236 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemRowMapper.java @@ -0,0 +1,20 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.JobCardItem; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class JobCardItemRowMapper implements RowMapper { + public JobCardItem mapRow( ResultSet rs, int rowNum ) throws SQLException { + JobCardItem jobCardItem = new JobCardItem(); + jobCardItem.setId( rs.getLong( "id" ) ); + jobCardItem.setJobCardId( rs.getLong( "job_card_id" ) ); + jobCardItem.setItemId( rs.getLong( "item_id" ) ); + jobCardItem.setSku( rs.getString( "sku" ) ); + jobCardItem.setExpectedProductionQuantity( rs.getBigDecimal( "expected_production_quantity" ) ); + jobCardItem.setTotalProduction( rs.getBigDecimal("total_production" ) ); + return jobCardItem; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/JobCardRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/JobCardRowMapper.java new file mode 100644 index 0000000..4e87069 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/JobCardRowMapper.java @@ -0,0 +1,28 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.JobCard; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class JobCardRowMapper implements RowMapper { + public JobCard mapRow( ResultSet rs, int rowNum ) throws SQLException { + JobCard jobCard = new JobCard(); + jobCard.setId( rs.getLong( "id" ) ); + jobCard.setCode( rs.getString("code" )); + jobCard.setJobOrderId( rs.getLong( "job_order_id" ) ); + if ( rs.getTimestamp( "created_at" ) != null ) { + jobCard.setCreatedAt( rs.getTimestamp( "created_at" ).toLocalDateTime() ); + } + jobCard.setCreatedBy( rs.getString( "created_by" ) ); + jobCard.setStatus( rs.getString("status" )); + jobCard.setInventoryStatus( rs.getString("inventory_status")); + jobCard.setCustomer( rs.getString("customer") ); + jobCard.setLotNumber( rs.getString("lot_number") ); + jobCard.setPurchaseOrderId( rs.getLong("purchase_order_id") ); + jobCard.setLocationSiteId( rs.getLong("location_site_id" ) ); + jobCard.setDescription( rs.getString("description" ) ); + return jobCard; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/MasterBundleDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/MasterBundleDAO.java new file mode 100644 index 0000000..d0dba4d --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/MasterBundleDAO.java @@ -0,0 +1,111 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.MasterBundle; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class MasterBundleDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.master_bundle"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, barcode,item_id, sku, created_by, created_at, job_card_id, is_received) VALUES (:id, :barcode, :item_id, :sku, :created_by, :created_at, :job_card_id, :is_received) ON DUPLICATE KEY UPDATE barcode = VALUES(barcode), item_id = VALUES(item_id), sku = VALUES(sku), created_by = VALUES(created_by), created_at = VALUES(created_at), job_card_id = VALUES(job_card_id), is_received = VALUES(is_received)", TABLE_NAME ); + private final String SELECT_BY_LIMIT = String.format( "SELECT * FROM %s ORDER BY id DESC LIMIT :limit", TABLE_NAME ); + private final String SELECT_BY_TERM_AND_RECEIVED = String.format( "SELECT * FROM %s WHERE is_received = :is_received AND ( id LIKE :id OR barcode LIKE :barcode ) ", TABLE_NAME ); + private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); + + + public MasterBundleDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( MasterBundle masterBundle ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", masterBundle.getId() ) + .addValue( "barcode", masterBundle.getBarcode() ) + .addValue( "item_id", masterBundle.getItemId() ) + .addValue( "sku", masterBundle.getSku() ) + .addValue( "created_by", masterBundle.getCreatedBy() ) + .addValue( "created_at", masterBundle.getCreatedAt() ) + .addValue( "job_card_id", masterBundle.getJobCardId() ) + .addValue("is_received", masterBundle.getIsReceived() ); + return params; + } + + // find + public MasterBundle find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new MasterBundleRowMapper() ) + .stream() + .findFirst() + .orElse( new MasterBundle() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new MasterBundleRowMapper() ); + } + + // save + public long save( MasterBundle masterBundle ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( masterBundle ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( masterBundle.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List masterBundles ) { + List batchArgs = new ArrayList<>(); + for ( MasterBundle masterBundle: masterBundles ) { + MapSqlParameterSource params = prepareInsertQueryParams( masterBundle ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[masterBundles.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } + + public List findByQuery(String query ){ + return namedParameterJdbcTemplate.query( query, new MasterBundleRowMapper() ); + } + + public List findByLimit( Long count ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "limit",count ); + return namedParameterJdbcTemplate.query( SELECT_BY_LIMIT , params, new MasterBundleRowMapper() ); + } + + public List findByTermAndNotReceived( String term , boolean received ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id" , term ); + params.addValue("barcode", "%" + term + "%" ); + params.addValue("is_received", received ); + return namedParameterJdbcTemplate.query(SELECT_BY_TERM_AND_RECEIVED, params, new MasterBundleRowMapper() ); + } + + public List findByIds( List ids ){ + if( ids == null || ids.isEmpty() ) return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids", ids ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS , params, new MasterBundleRowMapper() ); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/MasterBundleRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/MasterBundleRowMapper.java new file mode 100644 index 0000000..c28f4b0 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/MasterBundleRowMapper.java @@ -0,0 +1,24 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.MasterBundle; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class MasterBundleRowMapper implements RowMapper { + public MasterBundle mapRow( ResultSet rs, int rowNum ) throws SQLException { + MasterBundle masterBundle = new MasterBundle(); + masterBundle.setId( rs.getLong( "id" ) ); + masterBundle.setBarcode( rs.getString( "barcode" ) ); + masterBundle.setCreatedBy( rs.getString( "created_by" ) ); + masterBundle.setItemId( rs.getLong("item_id" )); + masterBundle.setSku( rs.getString("sku" ) ); + if ( rs.getTimestamp( "created_at" ) != null ) { + masterBundle.setCreatedAt( rs.getTimestamp( "created_at" ).toLocalDateTime() ); + } + masterBundle.setJobCardId( rs.getLong( "job_card_id" ) ); + masterBundle.setIsReceived( rs.getBoolean("is_received" )); + return masterBundle; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/ProcessDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/ProcessDAO.java new file mode 100644 index 0000000..4ef80f8 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/ProcessDAO.java @@ -0,0 +1,77 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.Process; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class ProcessDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.process"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id ASC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, title, notes) VALUES (:id, :title, :notes) ON DUPLICATE KEY UPDATE title = VALUES(title), notes = VALUES(notes)", TABLE_NAME ); + + public ProcessDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams( Process process ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", process.getId() ) + .addValue( "title", process.getTitle() ) + .addValue( "notes", process.getNotes() ); + return params; + } + + // find + public Process find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new ProcessRowMapper() ) + .stream() + .findFirst() + .orElse( new Process() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new ProcessRowMapper() ); + } + + // save + public long save( Process process ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( process ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( process.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List processs ) { + List batchArgs = new ArrayList<>(); + for ( Process process: processs ) { + MapSqlParameterSource params = prepareInsertQueryParams( process ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[processs.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/ProcessRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/ProcessRowMapper.java new file mode 100644 index 0000000..b3f2925 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/ProcessRowMapper.java @@ -0,0 +1,17 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.Process; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ProcessRowMapper implements RowMapper { + public Process mapRow( ResultSet rs, int rowNum ) throws SQLException { + Process process = new Process(); + process.setId( rs.getLong( "id" ) ); + process.setTitle( rs.getString( "title" ) ); + process.setNotes( rs.getString( "notes" ) ); + return process; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.java new file mode 100644 index 0000000..9f1da6a --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.java @@ -0,0 +1,118 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.StitchingOfflineItem; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class StitchingOfflineItemDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.stitching_offline_item"; + private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, item_id, sku, barcode, created_at, created_by, job_card_id, is_qa, qa_remarks, qa_status) VALUES (:id, :item_id, :sku, :barcode, :created_at, :created_by, :job_card_id, :is_qa, :qa_remarks, :qa_status) ON DUPLICATE KEY UPDATE item_id = VALUES(item_id), sku = VALUES(sku), barcode = VALUES(barcode), created_at = VALUES(created_at), created_by = VALUES(created_by), job_card_id = VALUES(job_card_id), is_qa = VALUES(is_qa), qa_remarks = VALUES(qa_remarks), qa_status = VALUES(qa_status)", TABLE_NAME ); + private final String SELECT_BY_LIMIT = String.format("SELECT * FROM %s ORDER BY id DESC LIMIT :limit", TABLE_NAME ); + private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); + private final String SELECT_BY_TERM = String.format( "SELECT * FROM %s WHERE barcode LIKE :term ORDER BY ID DESC", TABLE_NAME ); + private final String SELECT_BY_MASTER_ID = String.format( "SELECT * FROM %s WHERE job_card_id = :job_card_id", TABLE_NAME ); + + public StitchingOfflineItemDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams(StitchingOfflineItem stitchingOfflineItem ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", stitchingOfflineItem.getId() ) + .addValue( "item_id", stitchingOfflineItem.getItemId() ) + .addValue( "sku", stitchingOfflineItem.getSku() ) + .addValue( "barcode", stitchingOfflineItem.getBarcode() ) + .addValue( "created_at", stitchingOfflineItem.getCreatedAt() ) + .addValue( "created_by", stitchingOfflineItem.getCreatedBy() ) + .addValue("job_card_id", stitchingOfflineItem.getJobCardId() ) + .addValue("is_qa", stitchingOfflineItem.getIsQa() ) + .addValue("qa_remarks", stitchingOfflineItem.getQaRemarks() ) + .addValue("qa_status", stitchingOfflineItem.getQaStatus() ); + return params; + } + + // find + public StitchingOfflineItem find( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.query( SELECT_QUERY, params, new StitchingOfflineItemRowMapper() ) + .stream() + .findFirst() + .orElse( new StitchingOfflineItem() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new StitchingOfflineItemRowMapper() ); + } + + // save + public long save( StitchingOfflineItem finishedItem ) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams( finishedItem ); + namedParameterJdbcTemplate.update( INSERT_QUERY, params, keyHolder ); + return KeyHolderFunctions.getKey( finishedItem.getId(), keyHolder ); + } + + // save all + public int[] saveAll( List stitchingOfflineItems ) { + List batchArgs = new ArrayList<>(); + for ( StitchingOfflineItem stitchingOfflineItem: stitchingOfflineItems ) { + MapSqlParameterSource params = prepareInsertQueryParams( stitchingOfflineItem ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[stitchingOfflineItems.size()]) ); + } + + // delete + public boolean delete( long id ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "id", id ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params ) > 0; + } + + public List findByLimit(Long count ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "limit",count ); + return namedParameterJdbcTemplate.query( SELECT_BY_LIMIT , params, new StitchingOfflineItemRowMapper() ); + } + + public List findByQuery(String query ){ + return namedParameterJdbcTemplate.query( query, new StitchingOfflineItemRowMapper() ); + } + + public List findByIds(List ids ){ + if( ids == null || ids.isEmpty() ) return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids", ids ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS , params, new StitchingOfflineItemRowMapper() ); + } + + public List findByTerm( String term ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("term", "%" + term + "%" ); + // params.addValue("is_qa", isQa ); + return namedParameterJdbcTemplate.query( SELECT_BY_TERM , params, new StitchingOfflineItemRowMapper() ); + } + + public List findByMasterId( long masterId ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("job_card_id", masterId ); + return namedParameterJdbcTemplate.query( SELECT_BY_MASTER_ID , params, new StitchingOfflineItemRowMapper() ); + } +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemRowMapper.java new file mode 100644 index 0000000..adb9b90 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemRowMapper.java @@ -0,0 +1,28 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.StitchingOfflineItem; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class StitchingOfflineItemRowMapper implements RowMapper { + + @Override + public StitchingOfflineItem mapRow(ResultSet rs, int i) throws SQLException { + StitchingOfflineItem stitchingOfflineItem = new StitchingOfflineItem(); + stitchingOfflineItem.setId( rs.getLong( "id" ) ); + stitchingOfflineItem.setItemId( rs.getLong( "item_id" ) ); + stitchingOfflineItem.setSku( rs.getString( "sku" ) ); + stitchingOfflineItem.setBarcode( rs.getString( "barcode" ) ); + if ( rs.getTimestamp( "created_at" ) != null ) { + stitchingOfflineItem.setCreatedAt( rs.getTimestamp( "created_at" ).toLocalDateTime() ); + } + stitchingOfflineItem.setCreatedBy( rs.getString( "created_by" ) ); + stitchingOfflineItem.setJobCardId( rs.getLong("job_card_id") ); + stitchingOfflineItem.setIsQa( rs.getBoolean("is_qa")); + stitchingOfflineItem.setQaStatus( rs.getString("qa_status" ) ); + stitchingOfflineItem.setQaRemarks( rs.getString("qa_remarks") ); + return stitchingOfflineItem; + } +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/UserDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/UserDAO.java new file mode 100644 index 0000000..d5f7693 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/UserDAO.java @@ -0,0 +1,64 @@ +package com.utopiaindustries.dao.ctp; + + +import com.utopiaindustries.model.ctp.User; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class UserDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.users"; + private final String SELECT_BY_USERNAME = String.format( "SELECT * FROM %s WHERE username = :username", TABLE_NAME ); + private final String FIND_ALL_QUERY = String.format( "SELECT * FROM %s", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (username, password, enabled) VALUES (:username, :password, :enabled ) ON DUPLICATE KEY UPDATE username = :username, password = :password, enabled = :enabled", TABLE_NAME ); + + public UserDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams(User user ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "username", user.getUsername() ) + .addValue( "password", user.getPassword() ) + .addValue( "enabled", user.getEnabled() ); + return params; + } + + public User findByUsername(String username ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "username", username ); + return namedParameterJdbcTemplate.query( SELECT_BY_USERNAME, params, new UserRowMapper() ) + .stream() + .findAny() + .orElse( new User() ); + } + + public List findAll() { + return namedParameterJdbcTemplate.query( FIND_ALL_QUERY, new UserRowMapper() ); + } + + // save + public int save( User user ){ + MapSqlParameterSource params = prepareInsertQueryParams( user ); + return namedParameterJdbcTemplate.update( INSERT_QUERY, params ); + } + + + // save all + public int[] saveAll( List userss ) { + List batchArgs = new ArrayList<>(); + for ( User users: userss ) { + MapSqlParameterSource params = prepareInsertQueryParams( users ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[userss.size()]) ); + } +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/UserInventoryAccountDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/UserInventoryAccountDAO.java new file mode 100644 index 0000000..e5acd09 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/UserInventoryAccountDAO.java @@ -0,0 +1,94 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.UserInventoryAccount; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class UserInventoryAccountDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.user_inventory_account"; + private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY username DESC", TABLE_NAME ); + private final String SELECT_BY_USERNAME_QUERY = String.format( "SELECT * FROM %s WHERE username = :username ORDER BY username DESC", TABLE_NAME ); + private final String SELECT_BY_AUTHORITY_QUERY = String.format( "SELECT * FROM %s WHERE account_id = :account_id ORDER BY username DESC", TABLE_NAME ); + private final String INSERT_QUERY =String.format("INSERT INTO %s (username,account_id) VALUES (:username,:account_id)",TABLE_NAME); + private final String DELETE_QUERY=String.format("DELETE FROM %s WHERE username = :username",TABLE_NAME); + private final String SELECT_BY_USERNAMES = String.format("SELECT * FROM %s WHERE username IN (:usernames)" , TABLE_NAME ); + + public UserInventoryAccountDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + /* + * prepare query params + * */ + private MapSqlParameterSource prepareInsertQueryParams( UserInventoryAccount userInventoryAccount ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("username", userInventoryAccount.getUsername() ); + params.addValue("account_id", userInventoryAccount.getAccountId() ); + return params; + } + + + /** + * find all + */ + public List findAll() { + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new UserInventoryAccountRowMapper() ); + } + + /** + * find by username + */ + public List findByUsername( String username ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "username", username ); + return namedParameterJdbcTemplate.query( SELECT_BY_USERNAME_QUERY, params, new UserInventoryAccountRowMapper() ); + } + + /** + * find by authority + */ + public List findByAccountId( long accountId ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "account_id", accountId ); + return namedParameterJdbcTemplate.query( SELECT_BY_AUTHORITY_QUERY, params, new UserInventoryAccountRowMapper() ); + } + + /* + * find by username + * */ + public List findByUsernames( List usernames ) { + if( usernames == null || usernames.isEmpty() ) { + return new ArrayList<>(); + } + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "usernames", usernames ); + return namedParameterJdbcTemplate.query( SELECT_BY_USERNAMES, params, new UserInventoryAccountRowMapper() ); + } + + /* + * delete by username + * */ + public boolean deleteByUsername( String username ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "username", username ); + return namedParameterJdbcTemplate.update( DELETE_QUERY, params) > 0; + } + + // save all + public int[] saveAll( List userInventoryAccounts ) { + List batchArgs = new ArrayList<>(); + for ( UserInventoryAccount userInventoryAccount: userInventoryAccounts ) { + MapSqlParameterSource params = prepareInsertQueryParams( userInventoryAccount ); + batchArgs.add( params ); + } + return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[userInventoryAccounts.size()]) ); + } +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/UserInventoryAccountRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/UserInventoryAccountRowMapper.java new file mode 100644 index 0000000..d7e69e0 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/UserInventoryAccountRowMapper.java @@ -0,0 +1,18 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.UserInventoryAccount; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class UserInventoryAccountRowMapper implements RowMapper { + + @Override + public UserInventoryAccount mapRow(ResultSet resultSet, int i) throws SQLException { + UserInventoryAccount userInventoryAccount = new UserInventoryAccount(); + userInventoryAccount.setUsername( resultSet.getString("username") ); + userInventoryAccount.setAccountId( resultSet.getInt("account_id" ) ); + return userInventoryAccount; + } +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/UserRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/UserRowMapper.java new file mode 100644 index 0000000..8608bdb --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/UserRowMapper.java @@ -0,0 +1,19 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.User; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class UserRowMapper implements RowMapper { + + @Override + public User mapRow(ResultSet rs, int i ) throws SQLException { + User user = new User(); + user.setUsername( rs.getString( "username" ) ); + user.setPassword( rs.getString( "password" ) ); + user.setEnabled( rs.getBoolean( "enabled" ) ); + return user; + } +} diff --git a/src/main/java/com/utopiaindustries/dao/uind/ItemDAO.java b/src/main/java/com/utopiaindustries/dao/uind/ItemDAO.java new file mode 100644 index 0000000..35cd4a4 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/uind/ItemDAO.java @@ -0,0 +1,401 @@ +package com.utopiaindustries.dao.uind; + +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; +import com.utopiaindustries.model.uind.Item; + +import java.util.*; + + +@Repository +public class ItemDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "inventory.item"; + private final String SELECT_QUERY = String.format("SELECT * FROM %s WHERE id = :id", TABLE_NAME); + private final String SELECT_NOT_IN_IDS = String.format("SELECT * FROM %s WHERE id NOT IN (:ids)", TABLE_NAME); + private final String SELECT_BY_TYPE_QUERY = String.format("SELECT * FROM %s WHERE type_id IN (:type_id)", TABLE_NAME); + private final String SELECT_BY_SKU_TITLE_TYPE_QUERY_AND_IS_ACTIVE = String.format("SELECT * FROM %s WHERE (title LIKE :title OR sku LIKE :title) AND is_active = :is_active AND type_id IN (:type_ids)", TABLE_NAME); + private final String SELECT_BY_CATEGORY_QUERY = + String.format("SELECT * FROM %s WHERE category_id = :category_id OR subcategory_one_id = :category_id OR subcategory_two_id = :category_id", TABLE_NAME); + private final String SELECT_BY_POSITION_CATEGORIES_QUERY = + String.format("SELECT * FROM %s WHERE category_id IN (:position_category_ids) OR subcategory_one_id IN (:position_category_ids)", TABLE_NAME); + private final String SELECT_BY_POSITION_CATEGORIES_QUERY_TOP_N_ROWS = + String.format("SELECT * FROM %s WHERE category_id IN (:position_category_ids) OR subcategory_one_id IN (:position_category_ids) ORDER BY id DESC LIMIT :no_rows ", + TABLE_NAME); + private final String SELECT_BY_POSITION_CATEGORIES_AND_ITEM_REQUEST_ID_QUERY_TOP_N_ROWS = String.format( + "SELECT * FROM %s WHERE (category_id IN (:position_category_ids) OR subcategory_one_id IN (:position_category_ids)) AND item_request_id != 0 ORDER BY id DESC LIMIT :no_rows ", + TABLE_NAME); + private final String SELECT_BY_POSITION_CATEGORIES_AND_ITEM_IDS_QUERY = + String.format("SELECT * FROM %s WHERE category_id IN (:position_category_ids) OR subcategory_one_id IN (:position_category_ids) AND id IN (:ids) ORDER BY id DESC", + TABLE_NAME); + private final String SELECT_BY_CATEGORY_IDS = String.format("SELECT * FROM %s WHERE category_id IN (:category_ids)", TABLE_NAME); + private final String SELECT_BY_CATEGORY_DEPARTMENT_QUERY = String.format( + "SELECT * FROM %s WHERE department_id = :department_id AND (category_id = :category_id OR subcategory_one_id = :category_id OR subcategory_two_id = :category_id)", + TABLE_NAME); + private final String SELECT_BY_IDS = String.format("SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME); + private final String SELECT_BY_IDS_AND_ACTIVE = String.format("SELECT * FROM %s WHERE id IN (:ids) AND is_active = 1 ", TABLE_NAME); + private final String SELECT_LIKE_TITLE_AND_STATUS_QUERY = String.format("SELECT * FROM %s WHERE is_active = :is_active AND title LIKE :title ORDER BY title ASC", TABLE_NAME); + private final String SELECT_LIKE_TITLE_BY_DEPARTMENT_QUERY = + String.format("SELECT * FROM %s WHERE department_id = :department_id AND title LIKE :title ORDER BY title ASC", TABLE_NAME); + private final String SELECT_LIKE_TITLE = String.format("SELECT * FROM %s WHERE title LIKE :item_title", TABLE_NAME); + private final String SELECT_LIKE_TITLE_BY_POSITION_CATEGORIES_QUERY = String.format( + "SELECT * FROM %s WHERE title LIKE :title AND (category_id IN (:position_category_ids) OR subcategory_one_id IN (:position_category_ids)) ORDER BY title ASC", + TABLE_NAME); + private final String SELECT_LIKE_TITLE_SKU_BY_POSITION_CATEGORIES_AND_ACTIVE_QUERY = String.format( + "SELECT * FROM %s WHERE is_active = :is_active AND (title LIKE :title OR sku LIKE :title) AND (category_id IN (:position_category_ids) OR subcategory_one_id IN (:position_category_ids)) ORDER BY title ASC", + TABLE_NAME); + private final String SELECT_LIKE_TITLE_SKU_BY_POSITION_CATEGORIES_AND_ACTIVE_AND_TYPE_IDS_QUERY = String.format( + "SELECT * FROM %s WHERE is_active = :is_active AND (title LIKE :title OR sku LIKE :title) AND (category_id IN (:position_category_ids) OR subcategory_one_id IN (:position_category_ids)) AND type_id IN (:type_ids) ORDER BY title ASC LIMIT :limit", + TABLE_NAME); + private final String SELECT_EQUALS_SKU_QUERY = String.format("SELECT * FROM %s WHERE sku = :sku ORDER BY title ASC", TABLE_NAME); + private final String SELECT_EQUALS_IN_SKU_QUERY = String.format("SELECT * FROM %s WHERE sku IN (:skus) ORDER BY title ASC", TABLE_NAME); + private final String SELECT_ALL_QUERY = String.format("SELECT * FROM %s ORDER BY id DESC", TABLE_NAME); + private final String DELETE_QUERY = String.format("DELETE FROM %s WHERE id = :id", TABLE_NAME); + private final String INSERT_QUERY = String.format( + "INSERT INTO %s (id, title, short_title, description, spec1, spec2, spec3, spec4, spec5, brand, year, model, unit_id, company_id, function_id, department_id, section_id, type_id, category_id, subcategory_one_id, subcategory_two_id, code, item_request_id, minimum_level, dead_level, storage_location_site_id, storage_location_unit_id, storage_location_floor_id, storage_location_store_id, storage_location_shelf_id, date_added, requested_by_user, added_by_user, is_active, hs_code, image_url, approval_status, approved_by, approved_date, remarks, request_date_time, material_type, measurement, origin, is_sku_system_generated, sku, is_updated, last_audit_date, last_audit_updated_by) VALUES (:id, :title, :short_title, :description, :spec1, :spec2, :spec3, :spec4, :spec5, :brand, :year, :model, :unit_id, :company_id, :function_id, :department_id, :section_id, :type_id, :category_id, :subcategory_one_id, :subcategory_two_id, :code, :item_request_id, :minimum_level, :dead_level, :storage_location_site_id, :storage_location_unit_id, :storage_location_floor_id, :storage_location_store_id, :storage_location_shelf_id, :date_added, :requested_by_user, :added_by_user, :is_active, :hs_code, :image_url, :approval_status, :approved_by, :approved_date, :remarks, :request_date_time, :material_type, :measurement, :origin, :is_sku_system_generated, :sku, :is_updated, :last_audit_date, :last_audit_updated_by) ON DUPLICATE KEY UPDATE title = :title, short_title = :short_title, description = :description, spec1 = :spec1, spec2 = :spec2, spec3 = :spec3, spec4 = :spec4, spec5 = :spec5, brand = :brand, year = :year, model = :model, unit_id = :unit_id, company_id = :company_id, function_id = :function_id, department_id = :department_id, section_id = :section_id, type_id = :type_id, category_id = :category_id, subcategory_one_id = :subcategory_one_id, subcategory_two_id = :subcategory_two_id, code = :code, item_request_id = :item_request_id, minimum_level = :minimum_level, dead_level = :dead_level, storage_location_site_id = :storage_location_site_id, storage_location_unit_id = :storage_location_unit_id, storage_location_floor_id = :storage_location_floor_id, storage_location_store_id = :storage_location_store_id, storage_location_shelf_id = :storage_location_shelf_id, date_added = :date_added, requested_by_user = :requested_by_user, added_by_user = :added_by_user, is_active = :is_active, hs_code = :hs_code, image_url = :image_url, approval_status = :approval_status, approved_by = :approved_by, approved_date = :approved_date, remarks = :remarks, request_date_time = :request_date_time, material_type = :material_type, measurement = :measurement, origin = :origin, is_sku_system_generated = :is_sku_system_generated, sku = :sku, is_updated = :is_updated, last_audit_date = :last_audit_date, last_audit_updated_by = :last_audit_updated_by", TABLE_NAME); + + private final String SELECT_LIKE_TITLE_AND_SITE_ID_BY_POSITION_CATEGORIES_QUERY = String.format( + "SELECT * FROM %s WHERE title LIKE :title AND storage_location_site_id =:storage_location_site_id AND (category_id IN (:position_category_ids) OR subcategory_one_id IN (:position_category_ids)) ORDER BY title ASC", + TABLE_NAME); + + public ItemDAO(@Qualifier("namedParameterJdbcTemplateUind") NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams(Item item) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", item.getId()) + .addValue("title", item.getTitle()) + .addValue("short_title", item.getShortTitle()) + .addValue("description", item.getDescription()) + .addValue("spec1", item.getSpec1()) + .addValue("spec2", item.getSpec2()) + .addValue("spec3", item.getSpec3()) + .addValue("spec4", item.getSpec4()) + .addValue("spec5", item.getSpec5()) + .addValue("brand", item.getBrand()) + .addValue("year", item.getYear()) + .addValue("model", item.getModel()) + .addValue("unit_id", item.getUnitId()) + .addValue("company_id", item.getCompanyId()) + .addValue("function_id", item.getFunctionId()) + .addValue("department_id", item.getDepartmentId()) + .addValue("section_id", item.getSectionId()) + .addValue("type_id", item.getTypeId()) + .addValue("category_id", item.getCategoryId()) + .addValue("subcategory_one_id", item.getSubcategoryOneId()) + .addValue("subcategory_two_id", item.getSubcategoryTwoId()) + .addValue("code", item.getCode()) + .addValue("item_request_id", item.getItemRequestId()) + .addValue("minimum_level", item.getMinimumLevel()) + .addValue("dead_level", item.getDeadLevel()) + .addValue("storage_location_site_id", item.getStorageLocationSiteId()) + .addValue("storage_location_unit_id", item.getStorageLocationUnitId()) + .addValue("storage_location_floor_id", item.getStorageLocationFloorId()) + .addValue("storage_location_store_id", item.getStorageLocationStoreId()) + .addValue("storage_location_shelf_id", item.getStorageLocationShelfId()) + .addValue("date_added", item.getDateAdded()) + .addValue("requested_by_user", item.getRequestedByUser()) + .addValue("added_by_user", item.getAddedByUser()) + .addValue("is_active", item.getIsActive()) + .addValue("hs_code", item.getHsCode()) + .addValue("image_url", item.getImageUrl()) + .addValue("approval_status", item.getApprovalStatus()) + .addValue("approved_by", item.getApprovedBy()) + .addValue("approved_date", item.getApprovedDate()) + .addValue("remarks", item.getRemarks()) + .addValue("request_date_time", item.getRequestDateTime()) + .addValue("material_type", item.getMaterialType()) + .addValue("measurement", item.getMeasurement()) + .addValue("origin", item.getOrigin()) + .addValue("is_sku_system_generated", item.getIsSkuSystemGenerated()) + .addValue("is_updated", item.getIsUpdated()) + .addValue("sku", item.getSku()) + .addValue("last_audit_date", item.getLastAuditDate()) + .addValue("last_audit_updated_by", item.getLastAuditUpdateBy()); + return params; + } + + // find + public Item find(long id) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", id); + List items = namedParameterJdbcTemplate.query(SELECT_QUERY, params, new ItemRowMapper()); + if (items.size() > 0) { + return items.get(0); + } else { + return new Item(); + } + } + + // find not in + public List findNotIn(List ids) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids", ids); + return namedParameterJdbcTemplate.query(SELECT_NOT_IN_IDS, params, new ItemRowMapper()); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query(SELECT_ALL_QUERY, new ItemRowMapper()); + } + + // find by ids + public List findByIds(Collection ids) { + if (!ids.isEmpty()) { + Map params = Collections.singletonMap("ids", ids); + return namedParameterJdbcTemplate.query(SELECT_BY_IDS, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } + + // find by type + public List findByTypeId(long typeId) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("type_id", typeId); + return namedParameterJdbcTemplate.query(SELECT_BY_TYPE_QUERY, params, new ItemRowMapper()); + } + + // find by category + public List findByCategoryId(long categoryId) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("category_id", categoryId); + params.addValue("subcategory_one_id", categoryId); + params.addValue("subcategory_two_id", categoryId); + return namedParameterJdbcTemplate.query(SELECT_BY_CATEGORY_QUERY, params, new ItemRowMapper()); + } + + // find by category ids + public List findByCategoryIds(List categoryIds) { + if (!categoryIds.isEmpty()) { + Map params = Collections.singletonMap("category_ids", categoryIds); + return namedParameterJdbcTemplate.query(SELECT_BY_CATEGORY_IDS, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } + + // find by position category ids + public List findByByPositionCategories(List positionCategoryIds) { + if (positionCategoryIds != null && !positionCategoryIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("position_category_ids", positionCategoryIds); + return namedParameterJdbcTemplate.query(SELECT_BY_POSITION_CATEGORIES_QUERY, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } + + // find by position category ids with row limit + public List findByByPositionCategoriesRowLimit(List positionCategoryIds, long rowLimit) { + if (positionCategoryIds != null && !positionCategoryIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("position_category_ids", positionCategoryIds); + params.addValue("no_rows", rowLimit); + return namedParameterJdbcTemplate.query(SELECT_BY_POSITION_CATEGORIES_QUERY_TOP_N_ROWS, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } + + // find by position category ids and item request id with row limit + public List findByByPositionCategoriesAndItemRequestIdRowLimit(List positionCategoryIds, long rowLimit) { + if (positionCategoryIds != null && !positionCategoryIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("position_category_ids", positionCategoryIds); + params.addValue("no_rows", rowLimit); + return namedParameterJdbcTemplate.query(SELECT_BY_POSITION_CATEGORIES_AND_ITEM_REQUEST_ID_QUERY_TOP_N_ROWS, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } + + + // find by department + public List findByCategoryAndDepartmentId(long categoryId, long department) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("department_id", department); + params.addValue("category_id", categoryId); + params.addValue("subcategory_one_id", categoryId); + params.addValue("subcategory_two_id", categoryId); + return namedParameterJdbcTemplate.query(SELECT_BY_CATEGORY_DEPARTMENT_QUERY, params, new ItemRowMapper()); + } + + // find all like title (active only) + public List findLikeTitleAndStatus(String title, boolean active) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("title", "%" + title + "%"); + params.addValue("is_active", active); + return namedParameterJdbcTemplate.query(SELECT_LIKE_TITLE_AND_STATUS_QUERY, params, new ItemRowMapper()); + } + + // find all like title and department + public List findLikeTitleAndDepartmentId(String title, long departmentId) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("title", "%" + title + "%"); + params.addValue("department_id", departmentId); + return namedParameterJdbcTemplate.query(SELECT_LIKE_TITLE_BY_DEPARTMENT_QUERY, params, new ItemRowMapper()); + } + + public List findLikeTitle(String title) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("item_title", "%" + title + "%"); + return namedParameterJdbcTemplate.query(SELECT_LIKE_TITLE, params, new ItemRowMapper()); + } + + // find all like title and departmental categories + public List findLikeTitleByPositionAuthorizedCategories(String title, List positionCategoryIds) { + if (positionCategoryIds != null && !positionCategoryIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("title", "%" + title + "%"); + params.addValue("position_category_ids", positionCategoryIds); + return namedParameterJdbcTemplate.query(SELECT_LIKE_TITLE_BY_POSITION_CATEGORIES_QUERY, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } + + public List findLikeTitleByPositionAuthorizedCategories(String title, List positionCategoryIds, String isActive) { + if (positionCategoryIds != null && !positionCategoryIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("title", "%" + title + "%"); + params.addValue("sku", "%" + title + "%"); + params.addValue("position_category_ids", positionCategoryIds); + params.addValue("is_active", isActive); + return namedParameterJdbcTemplate.query(SELECT_LIKE_TITLE_SKU_BY_POSITION_CATEGORIES_AND_ACTIVE_QUERY, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } + + public List findLikeTitleByPositionAuthorizedCategoriesAndTypeIds(String title, List positionCategoryIds, String isActive, List itemTypeIds, Long limit) { + if (positionCategoryIds != null && !positionCategoryIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("title", "%" + title + "%"); + params.addValue("sku", "%" + title + "%"); + params.addValue("position_category_ids", positionCategoryIds); + params.addValue("is_active", isActive); + params.addValue("type_ids", itemTypeIds); + params.addValue("limit", limit); + return namedParameterJdbcTemplate.query(SELECT_LIKE_TITLE_SKU_BY_POSITION_CATEGORIES_AND_ACTIVE_AND_TYPE_IDS_QUERY, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } + + //find by type id and active + public List findBySkuOrTitleAndTypeIdAndActive(String title, List itemTypeIds, String isActive) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("title", "%" + title + "%"); + params.addValue("sku", "%" + title + "%"); + params.addValue("is_active", isActive); + params.addValue("type_ids", itemTypeIds); + return namedParameterJdbcTemplate.query(SELECT_BY_SKU_TITLE_TYPE_QUERY_AND_IS_ACTIVE, params, new ItemRowMapper()); + } + + // find by query + public List findByQuery(String customQuery) { + return namedParameterJdbcTemplate.query(customQuery, new ItemRowMapper()); + } + + // save + public long save(Item item) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams(item); + namedParameterJdbcTemplate.update(INSERT_QUERY, params, keyHolder); + return KeyHolderFunctions.getKey(item.getId(), keyHolder); + } + + // save all + public int[] saveAll(List items) { + List batchArgs = new ArrayList<>(); + for (Item item : items) { + MapSqlParameterSource params = prepareInsertQueryParams(item); + batchArgs.add(params); + } + return namedParameterJdbcTemplate.batchUpdate(INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[items.size()])); + } + + // delete + public boolean delete(long id) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", id); + return namedParameterJdbcTemplate.update(DELETE_QUERY, params) > 0; + } + + // find by position category ids with row limit and item ids + public List findByByPositionCategoriesAndItemIdsRowLimit(List positionCategoryIds, List itemIds) { + if (positionCategoryIds != null && !positionCategoryIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("position_category_ids", positionCategoryIds); + params.addValue("ids", itemIds); + return namedParameterJdbcTemplate.query(SELECT_BY_POSITION_CATEGORIES_AND_ITEM_IDS_QUERY, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } + + // find all equals title + public Item findEqualsSkuAndActiveOrNot(String sku, boolean active) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("sku", sku); + params.addValue("is_active", active); + List items = namedParameterJdbcTemplate.query(SELECT_EQUALS_SKU_QUERY, params, new ItemRowMapper()); + if (items.size() > 0) { + return items.get(0); + } else { + return null; + } + } + + // find all equals title + public List findEqualsINSkus(List skus, boolean active) { + if (skus.size() > 0) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("skus", skus); + params.addValue("is_active", active); + List items = namedParameterJdbcTemplate.query(SELECT_EQUALS_IN_SKU_QUERY, params, new ItemRowMapper()); + if (items.size() > 0) { + return items; + } else { + return new ArrayList<>(); + } + } else { + return new ArrayList<>(); + } + + } + + // find By Title and SiteId + public List findLikeTitleByPositionAuthorizedCategoriesAndSiteId(String title, List positionCategoryIds, Long siteId) { + if (positionCategoryIds != null && !positionCategoryIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("title", "%" + title + "%"); + params.addValue("position_category_ids", positionCategoryIds); + params.addValue("storage_location_site_id", siteId); + return namedParameterJdbcTemplate.query(SELECT_LIKE_TITLE_AND_SITE_ID_BY_POSITION_CATEGORIES_QUERY, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } + + // find only active Items + public List findItemsActiveOnly(Collection ids) { + if (!ids.isEmpty()) { + Map params = Collections.singletonMap("ids", ids); + return namedParameterJdbcTemplate.query(SELECT_BY_IDS_AND_ACTIVE, params, new ItemRowMapper()); + } else { + return new ArrayList<>(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/uind/ItemRowMapper.java b/src/main/java/com/utopiaindustries/dao/uind/ItemRowMapper.java new file mode 100644 index 0000000..6916ed8 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/uind/ItemRowMapper.java @@ -0,0 +1,81 @@ +package com.utopiaindustries.dao.uind; + +import com.utopiaindustries.model.uind.Item; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + + +public class ItemRowMapper implements RowMapper { + public Item mapRow( ResultSet rs, int rowNum ) throws SQLException { + + Item item = new Item(); + item.setId(rs.getLong("id")); + item.setTitle(rs.getString("title")); + item.setShortTitle(rs.getString("short_title")); + item.setDescription(rs.getString("description")); + item.setSpec1(rs.getString("spec1")); + item.setSpec2(rs.getString("spec2")); + item.setSpec3(rs.getString("spec3")); + item.setSpec4(rs.getString("spec4")); + item.setSpec5(rs.getString("spec5")); + item.setBrand(rs.getString("brand")); + item.setYear(rs.getString("year")); + item.setModel(rs.getString("model")); + item.setUnitId(rs.getLong("unit_id")); + item.setCompanyId(rs.getLong("company_id")); + item.setFunctionId(rs.getLong("function_id")); + item.setDepartmentId(rs.getLong("department_id")); + Long sectionId = rs.getLong("section_id"); + if (rs.wasNull()) { + sectionId = null; + } + item.setSectionId(sectionId); + item.setTypeId(rs.getLong("type_id")); + item.setCategoryId(rs.getLong("category_id")); + item.setSubcategoryOneId(rs.getLong("subcategory_one_id")); + item.setSubcategoryTwoId(rs.getLong("subcategory_two_id")); + item.setCode(rs.getString("code")); + item.setItemRequestId(rs.getLong("item_request_id")); + item.setMinimumLevel(rs.getLong("minimum_level")); + item.setDeadLevel(rs.getLong("dead_level")); + item.setStorageLocationSiteId(rs.getLong("storage_location_site_id")); + item.setStorageLocationUnitId(rs.getLong("storage_location_unit_id")); + item.setStorageLocationFloorId(rs.getLong("storage_location_floor_id")); + item.setStorageLocationStoreId(rs.getLong("storage_location_store_id")); + Long locationShelfId = rs.getLong("storage_location_shelf_id"); + if (rs.wasNull()) { + locationShelfId = null; + } + item.setStorageLocationShelfId(locationShelfId); + if (rs.getDate("date_added") != null) { + item.setDateAdded(rs.getDate("date_added").toLocalDate()); + } + item.setRequestedByUser(rs.getString("requested_by_user")); + item.setAddedByUser(rs.getString("added_by_user")); + item.setIsActive(rs.getBoolean("is_active")); + item.setHsCode(rs.getString("hs_code")); + item.setImageUrl(rs.getString("image_url")); + item.setApprovalStatus(rs.getString("approval_status")); + item.setApprovedBy(rs.getString("approved_by")); + if (rs.getTimestamp("approved_date") != null) { + item.setApprovedDate(rs.getTimestamp("approved_date").toLocalDateTime()); + } + item.setRemarks(rs.getString("remarks")); + if (rs.getTimestamp("request_date_time") != null) { + item.setRequestDateTime(rs.getTimestamp("request_date_time").toLocalDateTime()); + } + item.setMaterialType(rs.getString("material_type")); + item.setMeasurement(rs.getString("measurement")); + item.setOrigin(rs.getString("origin")); + item.setIsSkuSystemGenerated(rs.getBoolean("is_sku_system_generated")); + item.setIsUpdated(rs.getBoolean("is_updated")); + item.setSku(rs.getString("sku")); + if (rs.getTimestamp("last_audit_date") != null) { + item.setLastAuditDate(rs.getTimestamp("last_audit_date").toLocalDateTime()); + } + item.setLastAuditUpdateBy(rs.getString("last_audit_updated_by")); + return item; + } +} diff --git a/src/main/java/com/utopiaindustries/dao/uind/LocationSiteDAO.java b/src/main/java/com/utopiaindustries/dao/uind/LocationSiteDAO.java new file mode 100644 index 0000000..f498862 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/uind/LocationSiteDAO.java @@ -0,0 +1,99 @@ +package com.utopiaindustries.dao.uind; + +import com.utopiaindustries.util.KeyHolderFunctions; +import com.utopiaindustries.model.uind.LocationSite; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +@Repository +public class LocationSiteDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "inventory.location_site"; + private final String SELECT_QUERY = String.format("SELECT * FROM %s WHERE id = :id", TABLE_NAME); + private final String SELECT_ALL_QUERY = String.format("SELECT * FROM %s ORDER BY title ASC", TABLE_NAME); + private final String DELETE_QUERY = String.format("DELETE FROM %s WHERE id = :id", TABLE_NAME); + private final String INSERT_QUERY = String.format("INSERT INTO %s (id, title, short_title, address, has_colony) VALUES (:id, :title, :short_title, :address, :has_colony) ON DUPLICATE KEY UPDATE title = :title, short_title = :short_title, address = :address, has_colony = :has_colony", TABLE_NAME); + private final String SELECT_BY_IDS_QUERY = String.format("SELECT * FROM %s WHERE id IN ( :ids ) order by id asc", TABLE_NAME); + + public LocationSiteDAO(@Qualifier("namedParameterJdbcTemplateUind") NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams(LocationSite locationSite) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", locationSite.getId()) + .addValue("title", locationSite.getTitle()) + .addValue("short_title", locationSite.getShortTitle()) + .addValue("address", locationSite.getAddress()) + .addValue("has_colony", locationSite.getHasColony()); + return params; + } + + // find + public LocationSite find(long id) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", id); + return namedParameterJdbcTemplate.query(SELECT_QUERY, params, new LocationSiteRowMapper()) + .stream() + .findFirst() + .orElse( new LocationSite() ); + } + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query(SELECT_ALL_QUERY, new LocationSiteRowMapper()); + } + + // save + public long save(LocationSite locationSite) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams(locationSite); + namedParameterJdbcTemplate.update(INSERT_QUERY, params, keyHolder); + return KeyHolderFunctions.getKey(locationSite.getId(), keyHolder); + } + + // save all + public int[] saveAll(List locationSites) { + List batchArgs = new ArrayList<>(); + for (LocationSite locationSite : locationSites) { + MapSqlParameterSource params = prepareInsertQueryParams(locationSite); + batchArgs.add(params); + } + return namedParameterJdbcTemplate.batchUpdate(INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[locationSites.size()])); + } + + // delete + public boolean delete(long id) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", id); + return namedParameterJdbcTemplate.update(DELETE_QUERY, params) > 0; + } + + // find by ids + public List findByIds(Set ids) { + if (ids != null && !ids.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids", ids); + return namedParameterJdbcTemplate.query(SELECT_BY_IDS_QUERY, params, new LocationSiteRowMapper()); + } + return new ArrayList<>(); + } + + // find by ids + public List findByLongIds(List ids) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids", ids); + return namedParameterJdbcTemplate.query(SELECT_BY_IDS_QUERY, params, new LocationSiteRowMapper()); + } +} diff --git a/src/main/java/com/utopiaindustries/dao/uind/LocationSiteRowMapper.java b/src/main/java/com/utopiaindustries/dao/uind/LocationSiteRowMapper.java new file mode 100644 index 0000000..bd1016c --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/uind/LocationSiteRowMapper.java @@ -0,0 +1,19 @@ +package com.utopiaindustries.dao.uind; + +import com.utopiaindustries.model.uind.LocationSite; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class LocationSiteRowMapper implements RowMapper { + public LocationSite mapRow(ResultSet rs, int rowNum ) throws SQLException { + LocationSite locationSite = new LocationSite(); + locationSite.setId( rs.getLong( "id" ) ); + locationSite.setTitle( rs.getString( "title" ) ); + locationSite.setShortTitle( rs.getString( "short_title" ) ); + locationSite.setAddress( rs.getString( "address" ) ); + locationSite.setHasColony( rs.getBoolean("has_colony") ); + return locationSite; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/uind/PurchaseOrderDAO.java b/src/main/java/com/utopiaindustries/dao/uind/PurchaseOrderDAO.java new file mode 100644 index 0000000..be5978b --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/uind/PurchaseOrderDAO.java @@ -0,0 +1,411 @@ +package com.utopiaindustries.dao.uind; + +import com.utopiaindustries.model.uind.PurchaseOrder; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.*; + +@Repository +public class PurchaseOrderDAO { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "inventory.purchase_order"; + private final String SELECT_QUERY = String.format("SELECT * FROM %s WHERE id = :id", TABLE_NAME); + private final String SELECT_BY_IDS = String.format("SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME); + private final String SELECT_BY_SUPPLIER_QUERY = String.format("SELECT * FROM %s WHERE supplier_id = :supplier_id", TABLE_NAME); + private final String SELECT_WITH_MAIN_PAYMENT_TERM_IDS_AND_NOT_IN_ID_QUERY = String.format("SELECT * FROM %s WHERE id NOT IN (:ids) AND main_payment_term_id IN (:payment_term_ids) and management_status = :management_status AND user_status != :user_status", TABLE_NAME); + private final String SELECT_LATEST_PO_NON_DRAFTED = String.format("SELECT * FROM %s WHERE id IN (:ids) AND user_status != :user_status ORDER BY id DESC LIMIT 1", TABLE_NAME); + private final String SELECT_WITH_MAIN_PAYMENT_TERM_IDS_AND_NOT_IN_ID_QUERY_ADVANCE_PAYMENT = String.format("SELECT * FROM %s WHERE id NOT IN (:ids) AND main_payment_term_id IN (:payment_term_ids) and management_status = :management_status AND user_status != :user_status AND DATE(date_generated) >= :st_date AND DATE(date_generated) <= :ed_date", TABLE_NAME); + private final String SELECT_BY_SUPPLIER_AND_USER_STATUS_QUERY = String.format("SELECT * FROM %s WHERE supplier_id = :supplier_id AND user_status = :user_status", TABLE_NAME); + private final String SELECT_BY_IDS_AND_MANAGEMENT_STATUS = String.format("SELECT * FROM %s WHERE id IN (:ids) AND management_status = :management_status", TABLE_NAME); + private final String SELECT_WITH_UNBILLED_CHARGES_BY_IDS = String.format("SELECT * FROM %s WHERE id IN (:ids) AND are_charges_paid = false", TABLE_NAME); + private final String SELECT_BY_DEPARTMENT_QUERY = String.format("SELECT * FROM %s WHERE department_id = :department_id", TABLE_NAME); + private final String SELECT_BY_FUNCTION_QUERY = String.format("SELECT * FROM %s WHERE function_id = :function_id", TABLE_NAME); + private final String SELECT_LIKE_CODE_QUERY = String.format("SELECT * FROM %s WHERE code LIKE :code", TABLE_NAME); + private final String SELECT_LIKE_CODE_BY_MANAGEMENT_STATUS_QUERY = String.format("SELECT * FROM %s WHERE code LIKE :code AND management_status = :management_status", TABLE_NAME); + private final String SELECT_BY_USER_STATUS_QUERY = String.format("SELECT * FROM %s WHERE user_status = :user_status", TABLE_NAME); + private final String SELECT_BY_USER_STATUS_AND_COMPLETED_QUERY = String.format("SELECT * FROM %s WHERE user_status = :user_status AND completed = :completed", TABLE_NAME); + private final String SELECT_BY_MANAGEMENT_STATUS_QUERY = String.format("SELECT * FROM %s WHERE management_status = :management_status", TABLE_NAME); + private final String SELECT_BY_MANAGEMENT_STATUS_QUERY_TOP_N = String.format("SELECT * FROM %s WHERE management_status = :management_status ORDER BY id DESC LIMIT :no_rows", TABLE_NAME); + private final String SELECT_BY_INDENT_DIV_APPROVAL_QUERY_TOP_N = String.format("SELECT * FROM %s WHERE indenter_div_head_status = :indenter_div_head_status ORDER BY id DESC LIMIT :no_rows", TABLE_NAME); + private final String SELECT_BY_MANAGEMENT_STATUS_AND_DATE_QUERY = String.format("SELECT * FROM %s WHERE management_status = :management_status AND date_generated >= :date_generated", TABLE_NAME); + private final String SELECT_APPROVAL_REQUESTS_QUERY = String.format("SELECT * FROM %s WHERE management_status = 'REVIEWING' OR management_status = 'ONHOLD'", TABLE_NAME); + private final String SELECT_APPROVAL_REQUESTS_QUERY_TOP_N = String.format("SELECT * FROM %s WHERE management_status = 'REVIEWING' OR management_status = 'ONHOLD' LIMIT :no_rows", TABLE_NAME); + private final String SELECT_INDENT_PO_APPROVAL_REQUESTS_QUERY_TOP_N = String.format("SELECT * FROM %s WHERE indenter_div_head_status = 'REVIEWING' OR indenter_div_head_status = 'ONHOLD' LIMIT :no_rows", TABLE_NAME); + private final String SELECT_COMPLETED_BY_SUPPLIER_QUERY = String.format("SELECT * FROM %s WHERE supplier_id = :supplier_id AND completed = 1", TABLE_NAME); + private final String SELECT_BY_START_DATE_USER_STATUS_IN_PAYMENT_TERM_STATUS_QUERY = String.format("SELECT * FROM %s WHERE physical_date >= :start_date AND user_status = :user_status AND main_payment_term_id IN (:main_payment_term_ids) ORDER BY id DESC", TABLE_NAME); + private final String SELECT_BY_USER_STATUS_IN_PAYMENT_TERM_STATUS_QUERY = String.format("SELECT * FROM %s WHERE user_status = :user_status AND main_payment_term_id IN (:main_payment_term_ids) ORDER BY id DESC", TABLE_NAME); + private final String SELECT_BY_PAYMENT_TERMS_STATUS_QUERY = String.format("SELECT * FROM %s WHERE main_payment_term_id IN (:main_payment_term_ids) ORDER BY id DESC", TABLE_NAME); + private final String SELECT_BY_PARENT_DOCUMENT_QUERY = String.format("SELECT * FROM %s WHERE parent_document_type = :parent_document_type AND parent_document_id = :parent_document_id", TABLE_NAME); + private final String SELECT_BY_PARENT_DOCUMENTS_QUERY = String.format("SELECT * FROM %s WHERE parent_document_type = :parent_document_type AND parent_document_id IN (:parent_document_id)", TABLE_NAME); + private final String SELECT_BY_APPROVAL_DATE_RANGE_QUERY = String.format("SELECT * FROM %s WHERE DATE(approval_date) >= :start_date AND DATE(approval_date) <= :end_date ORDER BY id DESC", TABLE_NAME); + private final String SELECT_ALL_QUERY = String.format("SELECT * FROM %s ORDER BY id DESC", TABLE_NAME); + private final String SELECT_ALL_QUERY_TOP_N = String.format("SELECT * FROM %s ORDER BY id DESC LIMIT :no_rows", TABLE_NAME); + private final String SELECT_BY_INDENT_GENERAL_IDS = String.format("SELECT * FROM %s WHERE parent_document_id IN (:parent_document_id)", TABLE_NAME); + private final String SELECT_BY_INDENT_GENERAL_IDS_AND_LIMIT = String.format("SELECT * FROM %s WHERE parent_document_id IN (:parent_document_id) ORDER BY id ASC", TABLE_NAME); + private final String DELETE_QUERY = String.format("DELETE FROM %s WHERE id = :id", TABLE_NAME); + private final String INSERT_QUERY = String.format( + "INSERT INTO %s (id, code, date_generated, physical_date, approval_date, indenter_div_approval_date, generated_by_user, approved_by_user, indenter_div_approved_by, company_id, function_id, department_id, section_id, quotation_reference_number, quotation_date, supplier_id, broker_id, delivery_location_site_id, user_remarks, user_status, management_status, management_remarks, indenter_div_head_status, indenter_div_head_remarks, shipment_mode, currency_symbol, currency_conversion_rate, gst_amount, gst_amount_in_pkr, total_cost, total_cost_in_pkr, total_cost_in_words, total_cost_in_words_in_pkr, outstanding_advance_amount, amount_paid, main_payment_term_id, date_completed, termination_reason, parent_document_type, parent_document_code, parent_document_id, indent_id, completed, is_rated, is_locked, are_charges_paid, is_urgent, is_flagged) VALUES (:id, :code, :date_generated, :physical_date, :approval_date, :indenter_div_approval_date, :generated_by_user, :approved_by_user, :indenter_div_approved_by, :company_id, :function_id, :department_id, :section_id, :quotation_reference_number, :quotation_date, :supplier_id, :broker_id, :delivery_location_site_id, :user_remarks, :user_status, :management_status, :management_remarks, :indenter_div_head_status, :indenter_div_head_remarks, :shipment_mode, :currency_symbol, :currency_conversion_rate, :gst_amount, :gst_amount_in_pkr, :total_cost, :total_cost_in_pkr, :total_cost_in_words, :total_cost_in_words_in_pkr, :outstanding_advance_amount, :amount_paid, :main_payment_term_id, :date_completed, :termination_reason, :parent_document_type, :parent_document_code, :parent_document_id, :indent_id, :completed, :is_rated, :is_locked, :are_charges_paid, :is_urgent, :is_flagged) ON DUPLICATE KEY UPDATE code = :code, date_generated = :date_generated, physical_date = :physical_date, approval_date = :approval_date, indenter_div_approval_date = :indenter_div_approval_date, generated_by_user = :generated_by_user, approved_by_user = :approved_by_user, indenter_div_approved_by = :indenter_div_approved_by, company_id = :company_id, function_id = :function_id, department_id = :department_id, section_id = :section_id, quotation_reference_number = :quotation_reference_number, quotation_date = :quotation_date, supplier_id = :supplier_id, broker_id = :broker_id, delivery_location_site_id = :delivery_location_site_id, user_remarks = :user_remarks, user_status = :user_status, management_status = :management_status, management_remarks = :management_remarks, indenter_div_head_status = :indenter_div_head_status, indenter_div_head_remarks = :indenter_div_head_remarks, shipment_mode = :shipment_mode, currency_symbol = :currency_symbol, currency_conversion_rate = :currency_conversion_rate, gst_amount = :gst_amount, gst_amount_in_pkr = :gst_amount_in_pkr, total_cost = :total_cost, total_cost_in_pkr = :total_cost_in_pkr, total_cost_in_words = :total_cost_in_words, total_cost_in_words_in_pkr = :total_cost_in_words_in_pkr, outstanding_advance_amount = :outstanding_advance_amount, amount_paid = :amount_paid, main_payment_term_id = :main_payment_term_id, date_completed = :date_completed, termination_reason = :termination_reason, parent_document_type = :parent_document_type, parent_document_code = :parent_document_code, parent_document_id = :parent_document_id, indent_id = :indent_id, completed = :completed, is_rated = :is_rated, is_locked = :is_locked, are_charges_paid = :are_charges_paid, is_urgent = :is_urgent, is_flagged = :is_flagged", + TABLE_NAME + ); + private final String SELECT_PURCHASE_ORDER_BY_INDENT_GENERAL_NOT_EXITS = String.format("SELECT * FROM %s WHERE parent_document_id IS NULL AND management_status = :management_status AND user_status != :user_status", TABLE_NAME); + // sum by supplier + private final String SELECT_ITEM_SUBTOTAL_SUM_BY_SUPPLIER_QUERY = String.format("SELECT po.supplier_id, SUM((item.unit_price_in_pkr * item.quantity) + item.gst_in_pkr) AS total FROM %s item LEFT JOIN %s po ON item.purchase_order_id = po.id GROUP BY po.supplier_id", "inventory.purchase_order_item", TABLE_NAME); + private final String SELECT_BY_PO_IDS_AND_ISCOMPLETED = String.format("SELECT * FROM %s WHERE id IN (:id) AND completed = :completed AND management_status = :management_status ORDER BY id DESC", TABLE_NAME); + private final String SELECT_BY_GENERATED_BY_USER_AND_COMPANY_DETAILS_QUERY = String.format("SELECT * FROM %s WHERE generated_by_user = :generated_by_user AND company_id = :company_id AND function_id = :function_id AND department_id = :department_id AND section_id = :section_id", TABLE_NAME); + + private final String SELECT_BY_TERM = String.format( "SELECT * FROM %s WHERE code LIKE :term", TABLE_NAME ); + + public PurchaseOrderDAO(@Qualifier("namedParameterJdbcTemplateUind") NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + // prepare query params + private MapSqlParameterSource prepareInsertQueryParams(PurchaseOrder purchaseOrder) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", purchaseOrder.getId()) + .addValue("code", purchaseOrder.getCode()) + .addValue("date_generated", purchaseOrder.getDateGenerated()) + .addValue("physical_date", purchaseOrder.getPhysicalDate()) + .addValue("approval_date", purchaseOrder.getApprovalDate()) + .addValue("indenter_div_approval_date", purchaseOrder.getIndentDivApprovalDate()) + .addValue("generated_by_user", purchaseOrder.getGeneratedByUser()) + .addValue("approved_by_user", purchaseOrder.getApprovedByUser()) + .addValue("indenter_div_approved_by", purchaseOrder.getIndenterDivApprovedByUser()) + .addValue("company_id", purchaseOrder.getCompanyId()) + .addValue("function_id", purchaseOrder.getFunctionId()) + .addValue("department_id", purchaseOrder.getDepartmentId()) + .addValue("section_id", purchaseOrder.getSectionId()) + .addValue("quotation_reference_number", purchaseOrder.getQuotationReferenceNumber()) + .addValue("quotation_date", purchaseOrder.getQuotationDate()) + .addValue("supplier_id", purchaseOrder.getSupplierId()) + .addValue("broker_id", purchaseOrder.getBrokerId()) + .addValue("delivery_location_site_id", purchaseOrder.getDeliveryLocationSiteId()) + .addValue("user_remarks", purchaseOrder.getUserRemarks()) + .addValue("user_status", purchaseOrder.getUserStatus()) + .addValue("management_status", purchaseOrder.getManagementStatus()) + .addValue("management_remarks", purchaseOrder.getManagementRemarks()) + .addValue("indenter_div_head_status", purchaseOrder.getIndenterDivPoStatus()) + .addValue("indenter_div_head_remarks", purchaseOrder.getIndenterDivPoRemarks()) + .addValue("shipment_mode", purchaseOrder.getShipmentMode()) + .addValue("currency_symbol", purchaseOrder.getCurrencySymbol()) + .addValue("currency_conversion_rate", purchaseOrder.getCurrencyConversionRate()) + .addValue("gst_amount", purchaseOrder.getGstAmount()) + .addValue("gst_amount_in_pkr", purchaseOrder.getGstAmountInPkr()) + .addValue("total_cost", purchaseOrder.getTotalCost()) + .addValue("total_cost_in_pkr", purchaseOrder.getTotalCostInPkr()) + .addValue("total_cost_in_words", purchaseOrder.getTotalCostInWords()) + .addValue("total_cost_in_words_in_pkr", purchaseOrder.getTotalCostInWordsInPkr()) + .addValue("outstanding_advance_amount", purchaseOrder.getOutstandingAdvanceAmount()) + .addValue("amount_paid", purchaseOrder.getAmountPaid()) + .addValue("main_payment_term_id", purchaseOrder.getMainPaymentTermId()) + .addValue("date_completed", purchaseOrder.getDateCompleted()) + .addValue("termination_reason", purchaseOrder.getTerminationReason()) + .addValue("parent_document_type", purchaseOrder.getParentDocumentType()) + .addValue("parent_document_code", purchaseOrder.getParentDocumentCode()) + .addValue("parent_document_id", purchaseOrder.getParentDocumentId()) + .addValue("indent_id", purchaseOrder.getIndentId()) + .addValue("is_flagged", purchaseOrder.getIsFlagged()); + return params; + } + + // find + public PurchaseOrder find(long id) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", id); + List purchaseOrders = namedParameterJdbcTemplate.query(SELECT_QUERY, params, new PurchaseOrderRowMapper()); + if (purchaseOrders.size() > 0) { + return purchaseOrders.get(0); + } else { + return new PurchaseOrder(); + } + } + + // find by ids + public List findByIds(List ids) { + if (!ids.isEmpty()) { + Map params = Collections.singletonMap("ids", ids); + return namedParameterJdbcTemplate.query(SELECT_BY_IDS, params, new PurchaseOrderRowMapper()); + } else { + return new ArrayList<>(); + } + } + + // select by supplier + public List findBySupplierId(long supplierId) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("supplier_id", supplierId); + return namedParameterJdbcTemplate.query(SELECT_BY_SUPPLIER_QUERY, params, new PurchaseOrderRowMapper()); + } + + // select by supplier and user status + public List findBySupplierId(long supplierId, String userStatus) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("supplier_id", supplierId); + params.addValue("user_status", userStatus); + return namedParameterJdbcTemplate.query(SELECT_BY_SUPPLIER_AND_USER_STATUS_QUERY, params, new PurchaseOrderRowMapper()); + } + + // find by ids + public List findByIdsAndManagementStatus(List ids, String managementStatus) { + if (!ids.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids", ids); + params.addValue("management_status", managementStatus); + return namedParameterJdbcTemplate.query(SELECT_BY_IDS_AND_MANAGEMENT_STATUS, params, new PurchaseOrderRowMapper()); + } else { + return new ArrayList<>(); + } + } + + + // find all + public List findAll() { + return namedParameterJdbcTemplate.query(SELECT_ALL_QUERY, new PurchaseOrderRowMapper()); + } + + // find all by row limit + public List findAllByRowLimit(long row_limit) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("no_rows", row_limit); + return namedParameterJdbcTemplate.query(SELECT_ALL_QUERY_TOP_N, params, new PurchaseOrderRowMapper()); + } + + // find by department id + public List findByDepartmentId(long departmentId) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("department_id", departmentId); + return namedParameterJdbcTemplate.query(SELECT_BY_DEPARTMENT_QUERY, params, new PurchaseOrderRowMapper()); + } + + // find by function id + public List findByFunctionId(long functionId) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("function_id", functionId); + return namedParameterJdbcTemplate.query(SELECT_BY_FUNCTION_QUERY, params, new PurchaseOrderRowMapper()); + } + + // find by management status + public List findByManagementStatus(String managementStatus) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("management_status", managementStatus); + return namedParameterJdbcTemplate.query(SELECT_BY_MANAGEMENT_STATUS_QUERY, params, new PurchaseOrderRowMapper()); + } + + // find by management status limit by rows + public List findByManagementStatusRowLimit(String managementStatus, long row_limit) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("management_status", managementStatus); + params.addValue("no_rows", row_limit); + return namedParameterJdbcTemplate.query(SELECT_BY_MANAGEMENT_STATUS_QUERY_TOP_N, params, new PurchaseOrderRowMapper()); + } + + // find by management status limit by rows + public List findByIndentDivApprovalStatusRowLimit(String indenterDivStatus, long row_limit) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("indenter_div_head_status", indenterDivStatus); + params.addValue("no_rows", row_limit); + return namedParameterJdbcTemplate.query(SELECT_BY_INDENT_DIV_APPROVAL_QUERY_TOP_N, params, new PurchaseOrderRowMapper()); + } + + + // find PO by management status 'APPROVED' and greater equals date generated + public List findByManagementStatusAndDateGenerated(String managementStatus, String date) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("management_status", managementStatus); + params.addValue("date_generated", date); + return namedParameterJdbcTemplate.query(SELECT_BY_MANAGEMENT_STATUS_AND_DATE_QUERY, params, new PurchaseOrderRowMapper()); + } + + // find by user status + public List findByUserStatus(String userStatus) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("user_status", userStatus); + return namedParameterJdbcTemplate.query(SELECT_BY_USER_STATUS_QUERY, params, new PurchaseOrderRowMapper()); + } + + // find by user status and completed status + public List findByUserStatusAndCompletedStatus(String userStatus, boolean completed) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("user_status", userStatus); + params.addValue("completed", completed); + return namedParameterJdbcTemplate.query(SELECT_BY_USER_STATUS_AND_COMPLETED_QUERY, params, new PurchaseOrderRowMapper()); + } + + // find by supplier id + public List findCompletedBySupplierId(long supplierId) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("supplier_id", supplierId); + return namedParameterJdbcTemplate.query(SELECT_COMPLETED_BY_SUPPLIER_QUERY, params, new PurchaseOrderRowMapper()); + } + + // find approval requests + public List findApprovalRequests() { + return namedParameterJdbcTemplate.query(SELECT_APPROVAL_REQUESTS_QUERY, new PurchaseOrderRowMapper()); + } + + // find approval requests by row limit + public List findApprovalRequestsByRowLimit(long row_limit) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("no_rows", row_limit); + return namedParameterJdbcTemplate.query(SELECT_APPROVAL_REQUESTS_QUERY_TOP_N, params, new PurchaseOrderRowMapper()); + } + + // find approval requests by row limit + public List findIndentPOApprovalRequestsByRowLimit(long row_limit) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("no_rows", row_limit); + return namedParameterJdbcTemplate.query(SELECT_INDENT_PO_APPROVAL_REQUESTS_QUERY_TOP_N, params, new PurchaseOrderRowMapper()); + } + + // find like code + public List findLikeCode(String code) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("code", "%" + code + "%"); + return namedParameterJdbcTemplate.query(SELECT_LIKE_CODE_QUERY, params, new PurchaseOrderRowMapper()); + } + + // find like code by management status + public List findLikeCodeByManagementStatus(String code, String managementStatus) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("code", "%" + code + "%"); + params.addValue("management_status", managementStatus); + return namedParameterJdbcTemplate.query(SELECT_LIKE_CODE_BY_MANAGEMENT_STATUS_QUERY, params, new PurchaseOrderRowMapper()); + } + + // find by query + public List findByQuery(String customQuery) { + return namedParameterJdbcTemplate.query(customQuery, new PurchaseOrderRowMapper()); + } + + // find by user status in payment term + public List findByUserStatusInPaymentTerm(String userStatus, List paymentTermIds) { + if (!paymentTermIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("user_status", userStatus); + params.addValue("main_payment_term_ids", paymentTermIds); + return namedParameterJdbcTemplate.query(SELECT_BY_USER_STATUS_IN_PAYMENT_TERM_STATUS_QUERY, params, new PurchaseOrderRowMapper()); + } else { + return new ArrayList<>(); + } + } + + // find by payment term + public List findByPaymentTerms(List paymentTermIds) { + if (!paymentTermIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("main_payment_term_ids", paymentTermIds); + return namedParameterJdbcTemplate.query(SELECT_BY_PAYMENT_TERMS_STATUS_QUERY, params, new PurchaseOrderRowMapper()); + } else { + return new ArrayList<>(); + } + } + + // find by start date and user status in payment term + public List findByStartDateAndUserStatusInPaymentTerm(String startDate, String userStatus, List paymentTermIds) { + if (!paymentTermIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("start_date", startDate); + params.addValue("user_status", userStatus); + params.addValue("main_payment_term_ids", paymentTermIds); + return namedParameterJdbcTemplate.query(SELECT_BY_START_DATE_USER_STATUS_IN_PAYMENT_TERM_STATUS_QUERY, params, new PurchaseOrderRowMapper()); + } else { + return new ArrayList<>(); + } + } + + + // find by parent documents + public List findByParentDocument(String parentDocumentType, long parentDocumentId) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("parent_document_type", parentDocumentType); + params.addValue("parent_document_id", parentDocumentId); + return namedParameterJdbcTemplate.query(SELECT_BY_PARENT_DOCUMENT_QUERY, params, new PurchaseOrderRowMapper()); + } + + public List findByParentDocuments(String parentDocumentType, List parentIds) { + if (parentIds.isEmpty()) return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("parent_document_type", parentDocumentType); + params.addValue("parent_document_id", parentIds); + return namedParameterJdbcTemplate.query(SELECT_BY_PARENT_DOCUMENTS_QUERY, params, new PurchaseOrderRowMapper()); + + } + + // find by approval date range and management status + public List findByApprovalDateRange(String startDate, String endDate) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("start_date", startDate); + params.addValue("end_date", endDate); + return namedParameterJdbcTemplate.query(SELECT_BY_APPROVAL_DATE_RANGE_QUERY, params, new PurchaseOrderRowMapper()); + } + + // save + public long save(PurchaseOrder purchaseOrder) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareInsertQueryParams(purchaseOrder); + namedParameterJdbcTemplate.update(INSERT_QUERY, params, keyHolder); + return KeyHolderFunctions.getKey(purchaseOrder.getId(), keyHolder); + } + + // save all + public int[] saveAll(List purchaseOrders) { + List batchArgs = new ArrayList<>(); + for (PurchaseOrder purchaseOrder : purchaseOrders) { + MapSqlParameterSource params = prepareInsertQueryParams(purchaseOrder); + batchArgs.add(params); + } + return namedParameterJdbcTemplate.batchUpdate(INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[purchaseOrders.size()])); + } + + // delete + public boolean delete(long id) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", id); + return namedParameterJdbcTemplate.update(DELETE_QUERY, params) > 0; + } + + //get PO from indent general ids + public List findByIndentGeneralIds(List indentGeneralIds) { + if (!indentGeneralIds.isEmpty()) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("parent_document_id", indentGeneralIds); + return namedParameterJdbcTemplate.query(SELECT_BY_INDENT_GENERAL_IDS, params, new PurchaseOrderRowMapper()); + } + return new ArrayList<>(); + } + + //get PO from indent general ids + public List findByIndentIds(List indentGeneralIds) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("parent_document_id", indentGeneralIds); + return namedParameterJdbcTemplate.query(SELECT_BY_INDENT_GENERAL_IDS_AND_LIMIT, params, new PurchaseOrderRowMapper()); + } + + // find by generated by user and company details + public List findByGeneratedByUserAndCompanyDetails(String username, long companyId, long functionId, long departmentId, long sectionId) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("generated_by_user", username) + .addValue("company_id", companyId) + .addValue("function_id", functionId) + .addValue("department_id", departmentId) + .addValue("section_id", sectionId); + return namedParameterJdbcTemplate.query(SELECT_BY_GENERATED_BY_USER_AND_COMPANY_DETAILS_QUERY, params, new PurchaseOrderRowMapper()); + } + + /* + * find by term + * */ + public List findByTerm( String term ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("term", "%" + term + "%" ); + return namedParameterJdbcTemplate.query( SELECT_BY_TERM, params, new PurchaseOrderRowMapper() ); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/uind/PurchaseOrderRowMapper.java b/src/main/java/com/utopiaindustries/dao/uind/PurchaseOrderRowMapper.java new file mode 100644 index 0000000..96d1ec5 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/uind/PurchaseOrderRowMapper.java @@ -0,0 +1,94 @@ +package com.utopiaindustries.dao.uind; + +import com.utopiaindustries.model.uind.PurchaseOrder; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PurchaseOrderRowMapper implements RowMapper { + + @Override + public PurchaseOrder mapRow(ResultSet rs, int i) throws SQLException { + PurchaseOrder purchaseOrder = new PurchaseOrder(); + purchaseOrder.setId( rs.getLong( "id" ) ); + purchaseOrder.setCode( rs.getString( "code" ) ); + purchaseOrder.setDateGenerated( rs.getTimestamp( "date_generated" ).toLocalDateTime() ); + if ( rs.getDate( "physical_date" ) != null ) { + purchaseOrder.setPhysicalDate( rs.getDate( "physical_date" ).toLocalDate() ); + } + if ( rs.getTimestamp( "approval_date" ) != null ) { + purchaseOrder.setApprovalDate( rs.getTimestamp( "approval_date" ).toLocalDateTime() ); + } + if ( rs.getTimestamp( "indenter_div_approval_date" ) != null ) { + purchaseOrder.setIndentDivApprovalDate( rs.getTimestamp( "indenter_div_approval_date" ).toLocalDateTime() ); + } + purchaseOrder.setGeneratedByUser( rs.getString( "generated_by_user" ) ); + purchaseOrder.setApprovedByUser( rs.getString( "approved_by_user" ) ); + purchaseOrder.setIndenterDivApprovedByUser( rs.getString( "indenter_div_approved_by" ) ); + purchaseOrder.setCompanyId( rs.getLong( "company_id" ) ); + purchaseOrder.setFunctionId( rs.getLong( "function_id" ) ); + purchaseOrder.setDepartmentId( rs.getLong( "department_id" ) ); + purchaseOrder.setSectionId( rs.getLong( "section_id" ) ); + purchaseOrder.setQuotationReferenceNumber( rs.getString( "quotation_reference_number" ) ); + purchaseOrder.setQuotationDate( rs.getDate( "quotation_date" ).toLocalDate() ); + purchaseOrder.setCurrencySymbol( rs.getString( "currency_symbol" ) ); + Float currencyConversionRate = rs.getFloat( "currency_conversion_rate" ); + if ( rs.wasNull() ) { + currencyConversionRate = null; + } + purchaseOrder.setCurrencyConversionRate( currencyConversionRate ); + purchaseOrder.setGstAmount( rs.getFloat( "gst_amount" ) ); + purchaseOrder.setGstAmountInPkr( rs.getFloat( "gst_amount_in_pkr" ) ); + purchaseOrder.setTotalCost( rs.getFloat( "total_cost" ) ); + purchaseOrder.setTotalCostInPkr( rs.getFloat( "total_cost_in_pkr" ) ); + purchaseOrder.setTotalCostInWords( rs.getString( "total_cost_in_words" ) ); + purchaseOrder.setTotalCostInWordsInPkr( rs.getString( "total_cost_in_words_in_pkr" ) ); + purchaseOrder.setOutstandingAdvanceAmount( rs.getFloat( "outstanding_advance_amount" ) ); + purchaseOrder.setAmountPaid( rs.getFloat( "amount_paid" ) ); + purchaseOrder.setSupplierId( rs.getLong( "supplier_id" ) ); + Long brokerId = rs.getLong( "broker_id" ); + if ( rs.wasNull() ) { + brokerId = null; + } + purchaseOrder.setBrokerId( brokerId ); + Long deliverySiteId = rs.getLong( "delivery_location_site_id" ); + if ( rs.wasNull() ) { + deliverySiteId = null; + } + purchaseOrder.setDeliveryLocationSiteId( deliverySiteId ); + purchaseOrder.setUserStatus( rs.getString( "user_status" ) ); + purchaseOrder.setUserRemarks( rs.getString( "user_remarks" ) ); + Long mainPaymentTermId = rs.getLong( "main_payment_term_id" ); + if ( rs.wasNull() ) { + mainPaymentTermId = null; + } + purchaseOrder.setMainPaymentTermId( mainPaymentTermId ); + purchaseOrder.setShipmentMode( rs.getString( "shipment_mode" ) ); + purchaseOrder.setManagementStatus( rs.getString( "management_status" ) ); + purchaseOrder.setManagementRemarks( rs.getString( "management_remarks" ) ); + purchaseOrder.setIndenterDivPoStatus( rs.getString( "indenter_div_head_status" ) ); + purchaseOrder.setIndenterDivPoRemarks( rs.getString( "indenter_div_head_remarks" ) ); + purchaseOrder.setCompleted( rs.getBoolean( "completed" ) ); + if ( rs.getTimestamp( "date_completed" ) != null ) { + purchaseOrder.setDateCompleted( rs.getTimestamp( "date_completed" ).toLocalDateTime() ); + } + purchaseOrder.setTerminationReason( rs.getString( "termination_reason" ) ); + purchaseOrder.setParentDocumentType( rs.getString( "parent_document_type" ) ); + purchaseOrder.setParentDocumentCode( rs.getString( "parent_document_code" ) ); + Long parentDocumentId = rs.getLong( "parent_document_id" ); + if ( rs.wasNull() ) { + parentDocumentId = null; + } + purchaseOrder.setParentDocumentId( parentDocumentId ); + Long indentId = rs.getLong( "indent_id" ); + if ( rs.wasNull() ) { + indentId = null; + } + purchaseOrder.setIndentId( indentId ); + purchaseOrder.setIsLocked( rs.getBoolean( "is_locked" ) ); + purchaseOrder.setAreChargesPaid( rs.getBoolean( "are_charges_paid" ) ); + purchaseOrder.setIsFlagged( rs.getBoolean( "is_flagged" ) ); + return purchaseOrder; + } +} diff --git a/src/main/java/com/utopiaindustries/dialect/CTPDialect.java b/src/main/java/com/utopiaindustries/dialect/CTPDialect.java new file mode 100644 index 0000000..1fc64f5 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dialect/CTPDialect.java @@ -0,0 +1,31 @@ +package com.utopiaindustries.dialect; + +import org.thymeleaf.dialect.AbstractProcessorDialect; +import org.thymeleaf.processor.IProcessor; + +import java.util.HashSet; +import java.util.Set; + +public class CTPDialect extends AbstractProcessorDialect { + + public CTPDialect() { + super( + "Utopia Industries", + "ctp", + 1000 + ); + } + + public Set getProcessors( final String dialectPrefix ) { + final Set processors = new HashSet(); + processors.add( new FormatCurrencyTagProcessor( dialectPrefix ) ); + processors.add( new FormatDateTagProcessor( dialectPrefix ) ); + processors.add( new FormatDateTimeTagProcessor( dialectPrefix ) ); + processors.add( new FormatTimePeriodHumanReadableSince( dialectPrefix ) ); + processors.add( new FormatTimePeriodHumanReadableBetween( dialectPrefix ) ); + processors.add( new IsOnPathTagProcessor( dialectPrefix ) ); + processors.add( new FormatTimeTagProcessor( dialectPrefix ) ); + processors.add( new FormatNumberTagProcessor( dialectPrefix ) ); + return processors; + } +} diff --git a/src/main/java/com/utopiaindustries/dialect/FormatCurrencyTagProcessor.java b/src/main/java/com/utopiaindustries/dialect/FormatCurrencyTagProcessor.java new file mode 100644 index 0000000..d2adb86 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dialect/FormatCurrencyTagProcessor.java @@ -0,0 +1,67 @@ +package com.utopiaindustries.dialect; + +import com.utopiaindustries.model.CurrencySymbol; +import org.thymeleaf.IEngineConfiguration; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.engine.AttributeName; +import org.thymeleaf.model.IProcessableElementTag; +import org.thymeleaf.processor.element.AbstractAttributeTagProcessor; +import org.thymeleaf.processor.element.IElementTagStructureHandler; +import org.thymeleaf.standard.expression.IStandardExpression; +import org.thymeleaf.standard.expression.IStandardExpressionParser; +import org.thymeleaf.standard.expression.StandardExpressions; +import org.thymeleaf.templatemode.TemplateMode; + +import java.text.NumberFormat; +import java.util.Locale; + +// https://docs.oracle.com/javase/tutorial/i18n/format/numberFormat.html +// https://www.localeplanet.com/icu/en-PK/index.html +public class FormatCurrencyTagProcessor extends AbstractAttributeTagProcessor { + private static final String ATTR_NAME = "formatcurrency"; + private static final int PRECEDENCE = 100000; + + public FormatCurrencyTagProcessor( final String dialectPrefix ) { + super( + TemplateMode.HTML, + dialectPrefix, + null, + false, + ATTR_NAME, + true, + PRECEDENCE, + true + ); + } + + protected void doProcess( ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler iElementTagStructureHandler ) { + final IEngineConfiguration configuration = iTemplateContext.getConfiguration(); + final IStandardExpressionParser parser = StandardExpressions.getExpressionParser( configuration ); + final IStandardExpression expression = parser.parseExpression( iTemplateContext, attributeValue ); + final String attributeValueParsed = ( String ) expression.execute( iTemplateContext ); + // get arguments from comma separated list + String[] args = attributeValueParsed.split( "," ); + double amount = Double.parseDouble( args[0] == null ? "0" : args[0] ); + String currencyCode = args[1]; + // create locale + Locale locale = new Locale( CurrencySymbol.valueOf( currencyCode ).getLanguage(), CurrencySymbol.valueOf( currencyCode ).getLocation() ); + // formatted amount in the specified locale + NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance( locale ); + // check if decimals required + int fractionDigits; + if ( args.length == 3 ) { + fractionDigits = Integer.parseInt( args[2] ); + } else { + fractionDigits = 2; + } + currencyFormatter.setMaximumFractionDigits( fractionDigits ); + // format + String formattedAmount = currencyFormatter.format( Math.abs( amount ) ); + // if amount is less than zero, add brackets + if ( amount < 0 ) { + formattedAmount = "(" + formattedAmount + ")"; + } + // render the body + iElementTagStructureHandler.setBody( formattedAmount, false ); + } +} diff --git a/src/main/java/com/utopiaindustries/dialect/FormatDateTagProcessor.java b/src/main/java/com/utopiaindustries/dialect/FormatDateTagProcessor.java new file mode 100644 index 0000000..ec7eedd --- /dev/null +++ b/src/main/java/com/utopiaindustries/dialect/FormatDateTagProcessor.java @@ -0,0 +1,48 @@ +package com.utopiaindustries.dialect; + +import com.utopiaindustries.util.CTPDateTimeFormat; +import org.thymeleaf.IEngineConfiguration; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.engine.AttributeName; +import org.thymeleaf.model.IProcessableElementTag; +import org.thymeleaf.processor.element.AbstractAttributeTagProcessor; +import org.thymeleaf.processor.element.IElementTagStructureHandler; +import org.thymeleaf.standard.expression.IStandardExpression; +import org.thymeleaf.standard.expression.IStandardExpressionParser; +import org.thymeleaf.standard.expression.StandardExpressions; +import org.thymeleaf.templatemode.TemplateMode; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public class FormatDateTagProcessor extends AbstractAttributeTagProcessor { + private static final String ATTR_NAME = "formatdate"; + private static final int PRECEDENCE = 100000; + + public FormatDateTagProcessor( final String dialectPrefix ) { + super( + TemplateMode.HTML, + dialectPrefix, + null, + false, + ATTR_NAME, + true, + PRECEDENCE, + true + ); + } + + protected void doProcess( ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler iElementTagStructureHandler ) { + final IEngineConfiguration configuration = iTemplateContext.getConfiguration(); + final IStandardExpressionParser parser = StandardExpressions.getExpressionParser( configuration ); + final IStandardExpression expression = parser.parseExpression( iTemplateContext, attributeValue ); + final LocalDate attributeValueParsed = ( LocalDate ) expression.execute( iTemplateContext ); + iElementTagStructureHandler.setBody( "", false ); + if( attributeValueParsed != null ){ + // format zoned date time + String formattedDateTime = attributeValueParsed.format( DateTimeFormatter.ofPattern( CTPDateTimeFormat.TEMPLATE_DATE_FORMAT ) ); + // render the body + iElementTagStructureHandler.setBody( formattedDateTime, false ); + } + } +} diff --git a/src/main/java/com/utopiaindustries/dialect/FormatDateTimeTagProcessor.java b/src/main/java/com/utopiaindustries/dialect/FormatDateTimeTagProcessor.java new file mode 100644 index 0000000..d54efbd --- /dev/null +++ b/src/main/java/com/utopiaindustries/dialect/FormatDateTimeTagProcessor.java @@ -0,0 +1,48 @@ +package com.utopiaindustries.dialect; + +import com.utopiaindustries.util.CTPDateTimeFormat; +import org.thymeleaf.IEngineConfiguration; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.engine.AttributeName; +import org.thymeleaf.model.IProcessableElementTag; +import org.thymeleaf.processor.element.AbstractAttributeTagProcessor; +import org.thymeleaf.processor.element.IElementTagStructureHandler; +import org.thymeleaf.standard.expression.IStandardExpression; +import org.thymeleaf.standard.expression.IStandardExpressionParser; +import org.thymeleaf.standard.expression.StandardExpressions; +import org.thymeleaf.templatemode.TemplateMode; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class FormatDateTimeTagProcessor extends AbstractAttributeTagProcessor { + private static final String ATTR_NAME = "formatdatetime"; + private static final int PRECEDENCE = 100000; + + public FormatDateTimeTagProcessor( final String dialectPrefix ) { + super( + TemplateMode.HTML, + dialectPrefix, + null, + false, + ATTR_NAME, + true, + PRECEDENCE, + true + ); + } + + protected void doProcess( ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler iElementTagStructureHandler ) { + final IEngineConfiguration configuration = iTemplateContext.getConfiguration(); + final IStandardExpressionParser parser = StandardExpressions.getExpressionParser( configuration ); + final IStandardExpression expression = parser.parseExpression( iTemplateContext, attributeValue ); + final LocalDateTime attributeValueParsed = ( LocalDateTime ) expression.execute( iTemplateContext ); + iElementTagStructureHandler.setBody( "", false ); + // format zoned date time + if( attributeValueParsed != null ){ + String formattedDateTime = attributeValueParsed.format( DateTimeFormatter.ofPattern( CTPDateTimeFormat.TEMPLATE_DATE_TIME_FORMAT ) ); + // render the body + iElementTagStructureHandler.setBody( formattedDateTime, false ); + } + } +} diff --git a/src/main/java/com/utopiaindustries/dialect/FormatNumberTagProcessor.java b/src/main/java/com/utopiaindustries/dialect/FormatNumberTagProcessor.java new file mode 100644 index 0000000..4bd88c7 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dialect/FormatNumberTagProcessor.java @@ -0,0 +1,66 @@ +package com.utopiaindustries.dialect; + +import com.utopiaindustries.model.CurrencySymbol; +import org.thymeleaf.IEngineConfiguration; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.engine.AttributeName; +import org.thymeleaf.model.IProcessableElementTag; +import org.thymeleaf.processor.element.AbstractAttributeTagProcessor; +import org.thymeleaf.processor.element.IElementTagStructureHandler; +import org.thymeleaf.standard.expression.IStandardExpression; +import org.thymeleaf.standard.expression.IStandardExpressionParser; +import org.thymeleaf.standard.expression.StandardExpressions; +import org.thymeleaf.templatemode.TemplateMode; + +import java.text.NumberFormat; +import java.util.Locale; + +// https://docs.oracle.com/javase/tutorial/i18n/format/numberFormat.html +// https://www.localeplanet.com/icu/en-PK/index.html +public class FormatNumberTagProcessor extends AbstractAttributeTagProcessor { + private static final String ATTR_NAME = "formatnumber"; + private static final int PRECEDENCE = 100000; + + public FormatNumberTagProcessor( final String dialectPrefix ) { + super( + TemplateMode.HTML, + dialectPrefix, + null, + false, + ATTR_NAME, + true, + PRECEDENCE, + true + ); + } + + protected void doProcess( ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler iElementTagStructureHandler ) { + final IEngineConfiguration configuration = iTemplateContext.getConfiguration(); + final IStandardExpressionParser parser = StandardExpressions.getExpressionParser( configuration ); + final IStandardExpression expression = parser.parseExpression( iTemplateContext, attributeValue ); + final String attributeValueParsed = ( String ) expression.execute( iTemplateContext ); + // get arguments from comma separated list + String[] args = attributeValueParsed.split( "," ); + double amount = Double.parseDouble( args[0] ); + String currencyCode = args[1]; + // create locale + Locale locale = new Locale( CurrencySymbol.valueOf( currencyCode ).getLanguage(), CurrencySymbol.valueOf( currencyCode ).getLocation() ); + // formatted amount in the specified locale + NumberFormat formatter = NumberFormat.getNumberInstance( locale ); + // check if decimals required + int fractionDigits; + if ( args.length == 3 ) { + fractionDigits = Integer.parseInt( args[2] ); + } else { + fractionDigits = 0; + } + formatter.setMaximumFractionDigits( fractionDigits ); + // if amount is less than zero, add brackets + String formattedAmount = formatter.format( Math.abs( amount ) ); + if ( amount < 0 ) { + formattedAmount = "(" + formattedAmount + ")"; + } + // render the body + iElementTagStructureHandler.setBody( formattedAmount, false ); + } +} diff --git a/src/main/java/com/utopiaindustries/dialect/FormatTimePeriodHumanReadableBetween.java b/src/main/java/com/utopiaindustries/dialect/FormatTimePeriodHumanReadableBetween.java new file mode 100644 index 0000000..321b424 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dialect/FormatTimePeriodHumanReadableBetween.java @@ -0,0 +1,51 @@ +package com.utopiaindustries.dialect; + +import com.utopiaindustries.util.TimePeriodFormatter; +import org.thymeleaf.IEngineConfiguration; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.engine.AttributeName; +import org.thymeleaf.model.IProcessableElementTag; +import org.thymeleaf.processor.element.AbstractAttributeTagProcessor; +import org.thymeleaf.processor.element.IElementTagStructureHandler; +import org.thymeleaf.standard.expression.IStandardExpression; +import org.thymeleaf.standard.expression.IStandardExpressionParser; +import org.thymeleaf.standard.expression.StandardExpressions; +import org.thymeleaf.templatemode.TemplateMode; + +import java.time.LocalDateTime; + +public class FormatTimePeriodHumanReadableBetween extends AbstractAttributeTagProcessor { + private static final String ATTR_NAME = "humanreadableperiodbetween"; + private static final int PRECEDENCE = 100000; + + public FormatTimePeriodHumanReadableBetween( final String dialectPrefix ) { + super( + TemplateMode.HTML, + dialectPrefix, + null, + false, + ATTR_NAME, + true, + PRECEDENCE, + true + ); + } + + protected void doProcess( ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler iElementTagStructureHandler ) { + final IEngineConfiguration configuration = iTemplateContext.getConfiguration(); + final IStandardExpressionParser parser = StandardExpressions.getExpressionParser( configuration ); + final IStandardExpression expression = parser.parseExpression( iTemplateContext, attributeValue ); + final String attributeValueParsed = ( String ) expression.execute( iTemplateContext ); + // get arguments from comma separated list + String[] args = attributeValueParsed.split( "," ); + LocalDateTime from = LocalDateTime.parse( args[0] ); + LocalDateTime to = LocalDateTime.parse( args[1] ); + // formatted time period + String formattedPeriod = ( new TimePeriodFormatter() ) + .from( from ) + .to( to ) + .format(); + // render the body + iElementTagStructureHandler.setBody( formattedPeriod, false ); + } +} diff --git a/src/main/java/com/utopiaindustries/dialect/FormatTimePeriodHumanReadableSince.java b/src/main/java/com/utopiaindustries/dialect/FormatTimePeriodHumanReadableSince.java new file mode 100644 index 0000000..a3092c0 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dialect/FormatTimePeriodHumanReadableSince.java @@ -0,0 +1,47 @@ +package com.utopiaindustries.dialect; + +import com.utopiaindustries.util.TimePeriodFormatter; +import org.thymeleaf.IEngineConfiguration; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.engine.AttributeName; +import org.thymeleaf.model.IProcessableElementTag; +import org.thymeleaf.processor.element.AbstractAttributeTagProcessor; +import org.thymeleaf.processor.element.IElementTagStructureHandler; +import org.thymeleaf.standard.expression.IStandardExpression; +import org.thymeleaf.standard.expression.IStandardExpressionParser; +import org.thymeleaf.standard.expression.StandardExpressions; +import org.thymeleaf.templatemode.TemplateMode; + +import java.time.LocalDateTime; + +public class FormatTimePeriodHumanReadableSince extends AbstractAttributeTagProcessor { + private static final String ATTR_NAME = "humanreadableperiodsince"; + private static final int PRECEDENCE = 100000; + + public FormatTimePeriodHumanReadableSince( final String dialectPrefix ) { + super( + TemplateMode.HTML, + dialectPrefix, + null, + false, + ATTR_NAME, + true, + PRECEDENCE, + true + ); + } + + protected void doProcess( ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler iElementTagStructureHandler ) { + final IEngineConfiguration configuration = iTemplateContext.getConfiguration(); + final IStandardExpressionParser parser = StandardExpressions.getExpressionParser( configuration ); + final IStandardExpression expression = parser.parseExpression( iTemplateContext, attributeValue ); + final LocalDateTime from = ( LocalDateTime ) expression.execute( iTemplateContext ); + // formatted time period + String formattedPeriod = ( new TimePeriodFormatter() ) + .from( from ) + .to( LocalDateTime.now() ) + .format(); + // render the body + iElementTagStructureHandler.setBody( formattedPeriod, false ); + } +} diff --git a/src/main/java/com/utopiaindustries/dialect/FormatTimeTagProcessor.java b/src/main/java/com/utopiaindustries/dialect/FormatTimeTagProcessor.java new file mode 100644 index 0000000..28e53e7 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dialect/FormatTimeTagProcessor.java @@ -0,0 +1,46 @@ +package com.utopiaindustries.dialect; + +import com.utopiaindustries.util.CTPDateTimeFormat; +import org.thymeleaf.IEngineConfiguration; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.engine.AttributeName; +import org.thymeleaf.model.IProcessableElementTag; +import org.thymeleaf.processor.element.AbstractAttributeTagProcessor; +import org.thymeleaf.processor.element.IElementTagStructureHandler; +import org.thymeleaf.standard.expression.IStandardExpression; +import org.thymeleaf.standard.expression.IStandardExpressionParser; +import org.thymeleaf.standard.expression.StandardExpressions; +import org.thymeleaf.templatemode.TemplateMode; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class FormatTimeTagProcessor extends AbstractAttributeTagProcessor { + private static final String ATTR_NAME = "formattime"; + private static final int PRECEDENCE = 100000; + + public FormatTimeTagProcessor( final String dialectPrefix ) { + super( + TemplateMode.HTML, + dialectPrefix, + null, + false, + ATTR_NAME, + true, + PRECEDENCE, + true + ); + } + + protected void doProcess( ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler iElementTagStructureHandler ) { + final IEngineConfiguration configuration = iTemplateContext.getConfiguration(); + final IStandardExpressionParser parser = StandardExpressions.getExpressionParser( configuration ); + final IStandardExpression expression = parser.parseExpression( iTemplateContext, attributeValue ); + final LocalDateTime attributeValueParsed = ( LocalDateTime ) expression.execute( iTemplateContext ); + // format zoned date time + String formattedDateTime = attributeValueParsed.format( DateTimeFormatter.ofPattern( CTPDateTimeFormat.HTML5_TIME_INPUT_FORMAT_ATTENDANCE ) ); + // render the body + iElementTagStructureHandler.setBody( formattedDateTime, false ); + } + +} diff --git a/src/main/java/com/utopiaindustries/dialect/IsOnPathTagProcessor.java b/src/main/java/com/utopiaindustries/dialect/IsOnPathTagProcessor.java new file mode 100644 index 0000000..bfeff67 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dialect/IsOnPathTagProcessor.java @@ -0,0 +1,55 @@ +package com.utopiaindustries.dialect; + +import org.thymeleaf.IEngineConfiguration; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.engine.AttributeName; +import org.thymeleaf.model.IProcessableElementTag; +import org.thymeleaf.processor.element.AbstractAttributeTagProcessor; +import org.thymeleaf.processor.element.IElementTagStructureHandler; +import org.thymeleaf.standard.expression.IStandardExpression; +import org.thymeleaf.standard.expression.IStandardExpressionParser; +import org.thymeleaf.standard.expression.StandardExpressions; +import org.thymeleaf.templatemode.TemplateMode; + +public class IsOnPathTagProcessor extends AbstractAttributeTagProcessor { + private static final String ATTR_NAME = "is-on-path"; + private static final int PRECEDENCE = 100000; + + public IsOnPathTagProcessor( final String dialectPrefix ) { + super( + TemplateMode.HTML, + dialectPrefix, + null, + false, + ATTR_NAME, + true, + PRECEDENCE, + true + ); + } + + /** + * this tag accepts paths as params with the path to check against as the last argument + */ + protected void doProcess( ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler iElementTagStructureHandler ) { + final IEngineConfiguration configuration = iTemplateContext.getConfiguration(); + final IStandardExpressionParser parser = StandardExpressions.getExpressionParser( configuration ); + final IStandardExpression expression = parser.parseExpression( iTemplateContext, attributeValue ); + final String[] attributeValueParsed = ( ( String ) expression.execute( iTemplateContext ) ).split( "," ); + // the target path is the last argument + final String targetPath = attributeValueParsed[attributeValueParsed.length - 1]; + boolean matched = false; + // iterate over paths (except the last one, since thats the target path) + // and check if any thing matched + for ( int i = 0; i < attributeValueParsed.length - 1; i++ ) { + if ( targetPath.contains( attributeValueParsed[i] ) ) { + matched = true; + break; + } + } + // remove body if didn't match + if ( ! matched ) { + iElementTagStructureHandler.removeElement(); + } + } +} diff --git a/src/main/java/com/utopiaindustries/model/CurrencySymbol.java b/src/main/java/com/utopiaindustries/model/CurrencySymbol.java new file mode 100644 index 0000000..030df25 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/CurrencySymbol.java @@ -0,0 +1,31 @@ +package com.utopiaindustries.model; + +public enum CurrencySymbol { + AUD("en", "AU"), + BRL("por", "BR"), + CAD("en", "CA"), + CNY("en", "CN"), + EUR("de", "DE"), + GBP("en", "GB"), + JPY("jpn", "JP"), + MXN("spa", "MX"), + PKR("ur", "PK"), + AED("en", "AE"), + USD("en", "US"); + + private final String language; + private final String location; + + CurrencySymbol( String language, String location ) { + this.language = language; + this.location = location; + } + + public String getLanguage() { + return language; + } + + public String getLocation() { + return location; + } +} diff --git a/src/main/java/com/utopiaindustries/model/Granularity.java b/src/main/java/com/utopiaindustries/model/Granularity.java new file mode 100644 index 0000000..e19c1ba --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/Granularity.java @@ -0,0 +1,8 @@ +package com.utopiaindustries.model; + +public enum Granularity { + DAILY, + WEEKLY, + MONTHLY, + YEARLY +} diff --git a/src/main/java/com/utopiaindustries/model/Roles.java b/src/main/java/com/utopiaindustries/model/Roles.java new file mode 100644 index 0000000..f5d44fd --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/Roles.java @@ -0,0 +1,10 @@ +package com.utopiaindustries.model; + +public enum Roles { + ROLE_ADMIN, + ROLE_USER, + ROLE_CUTTING, + ROLE_STITCHING, + ROLE_QUALITY_CONTROL, + ROLE_PACKAGING +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/Authority.java b/src/main/java/com/utopiaindustries/model/ctp/Authority.java new file mode 100644 index 0000000..29a4c13 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/Authority.java @@ -0,0 +1,35 @@ +package com.utopiaindustries.model.ctp; + +public class Authority { + + private String username; + private String authority; + + public Authority() { + } + + public Authority(String authority) { + this.authority = authority; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getAuthority() { + return authority; + } + + public void setAuthority(String authority) { + this.authority = authority; + } + + @Override + public String toString() { + return authority ; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/BarcodeSpecs.java b/src/main/java/com/utopiaindustries/model/ctp/BarcodeSpecs.java new file mode 100644 index 0000000..07108a3 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/BarcodeSpecs.java @@ -0,0 +1,10 @@ +package com.utopiaindustries.model.ctp; + +public class BarcodeSpecs { + + public enum Format { + QR_CODE, + CODE_128 + } + +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/BarcodeStickerSize.java b/src/main/java/com/utopiaindustries/model/ctp/BarcodeStickerSize.java new file mode 100644 index 0000000..c05db90 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/BarcodeStickerSize.java @@ -0,0 +1,101 @@ +package com.utopiaindustries.model.ctp; + +public enum BarcodeStickerSize { + + SIZE_1_5_X_3( 3 * 72, 1.5f * 72, 10, 10, 6, 6, 50, 50, 125, 125, 14, 9, 7), + SIZE_2_X_3( 3 * 72, 2 * 72, 10, 10, 6, 6, 50, 50, 125, 125, 14, 9, 7), + SIZE_4_X_4( 4 * 72, 4 * 72, 8, 8, 8, 8, 200, 100, 250, 250, 14, 9, 7), + SIZE_1_75_X_3_5( 3.5f * 72, 1.75f * 72, 10, 10, 6, 6, 50, 50, 125, 125, 14, 9, 7); + + + private final float width; + private final float height; + private final int marginLeft; + private final int marginRight; + private final int marginTop; + private final int marginBottom; + private final int imageWidthBarcode; + private final int imageHeightBarcode; + private final int imageWidthQrCode; + private final int imageHeightQrCode; + private final int textSize; + private final int textSizeSmall; + private final int textSizeExtraSmall; + + BarcodeStickerSize(float width, float height, int marginLeft, int marginRight, int marginTop, int marginBottom, int imageWidthBarcode, int imageHeightBarcode, int imageWidthQrCode, int imageHeightQrCode, int textSize, int textSizeSmall, int textSizeExtraSmall) { + this.width = width; + this.height = height; + this.marginLeft = marginLeft; + this.marginRight = marginRight; + this.marginTop = marginTop; + this.marginBottom = marginBottom; + this.imageWidthBarcode = imageWidthBarcode; + this.imageHeightBarcode = imageHeightBarcode; + this.imageWidthQrCode = imageWidthQrCode; + this.imageHeightQrCode = imageHeightQrCode; + this.textSize = textSize; + this.textSizeSmall = textSizeSmall; + this.textSizeExtraSmall = textSizeExtraSmall; + } + + public float getWidth() { + return width; + } + + public float getHeight() { + return height; + } + + public int getMarginLeft() { + return marginLeft; + } + + public int getMarginRight() { + return marginRight; + } + + public int getMarginTop() { + return marginTop; + } + + public int getMarginBottom() { + return marginBottom; + } + + public int getImageWidthBarcode() { + return imageWidthBarcode; + } + + public int getImageHeightBarcode() { + return imageHeightBarcode; + } + + public int getImageWidthQrCode() { + return imageWidthQrCode; + } + + public int getImageHeightQrCode() { + return imageHeightQrCode; + } + + public int getTextSize() { + return textSize; + } + + public int getTextSizeSmall() { + return textSizeSmall; + } + + public int getTextSizeExtraSmall() { + return textSizeExtraSmall; + } + + public static BarcodeStickerSize getSize(String sizeName ) { + for ( BarcodeStickerSize stickerSize: values() ) { + if ( stickerSize.name().equalsIgnoreCase( sizeName ) ) { + return stickerSize; + } + } + return null; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/Bundle.java b/src/main/java/com/utopiaindustries/model/ctp/Bundle.java new file mode 100644 index 0000000..501d98d --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/Bundle.java @@ -0,0 +1,129 @@ +package com.utopiaindustries.model.ctp; + +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +public class Bundle implements InventoryArtifact { + + private long id; + private long itemId; + private String sku; + private BigDecimal wrapQuantity; + private String barcode; + private String type; + private String createdBy; + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + private LocalDateTime createdAt; + private long jobCardId; + private long masterBundleId; + + // wrapper + private MasterBundle masterBundle; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getItemId() { + return itemId; + } + + public void setItemId(long itemId) { + this.itemId = itemId; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public BigDecimal getWrapQuantity() { + return wrapQuantity; + } + + public void setWrapQuantity(BigDecimal wrapQuantity) { + this.wrapQuantity = wrapQuantity; + } + + public String getBarcode() { + return barcode; + } + + public void setBarcode(String barcode) { + this.barcode = barcode; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public long getJobCardId() { + return jobCardId; + } + + public void setJobCardId(long jobCardId) { + this.jobCardId = jobCardId; + } + + public long getMasterBundleId() { + return masterBundleId; + } + + public void setMasterBundleId(long masterBundleId) { + this.masterBundleId = masterBundleId; + } + + public MasterBundle getMasterBundle() { + return masterBundle; + } + + public void setMasterBundle(MasterBundle masterBundle) { + this.masterBundle = masterBundle; + } + + @Override + public String toString() { + return "Bundle{" + + "id=" + id + + ", itemId=" + itemId + + ", sku='" + sku + '\'' + + ", wrapQuantity=" + wrapQuantity + + ", barcode='" + barcode + '\'' + + ", type='" + type + '\'' + + ", createdBy='" + createdBy + '\'' + + ", createdAt=" + createdAt + + ", jobCardId=" + jobCardId + + ", masterBundleId=" + masterBundleId + + ", masterBundle=" + masterBundle + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/CutPiece.java b/src/main/java/com/utopiaindustries/model/ctp/CutPiece.java new file mode 100644 index 0000000..ed9b2f9 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/CutPiece.java @@ -0,0 +1,54 @@ +package com.utopiaindustries.model.ctp; + +import java.math.BigDecimal; + +public class CutPiece { + + private long id; + private long jobCardItemId; + private String type; + private BigDecimal quantity; + + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getJobCardItemId() { + return jobCardItemId; + } + + public void setJobCardItemId(long jobCardItemId) { + this.jobCardItemId = jobCardItemId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public BigDecimal getQuantity() { + return quantity; + } + + public void setQuantity(BigDecimal quantity) { + this.quantity = quantity; + } + + @Override + public String toString() { + return "CutPiece{" + + "id=" + id + + ", jobCardItemId=" + jobCardItemId + + ", type='" + type + '\'' + + ", quantity=" + quantity + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/CutPieceType.java b/src/main/java/com/utopiaindustries/model/ctp/CutPieceType.java new file mode 100644 index 0000000..c27d166 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/CutPieceType.java @@ -0,0 +1,31 @@ +package com.utopiaindustries.model.ctp; + +public class CutPieceType { + + private long id; + private String title; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Override + public String toString() { + return "CutPieceType{" + + "id=" + id + + ", title='" + title + '\'' + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/FinishedItem.java b/src/main/java/com/utopiaindustries/model/ctp/FinishedItem.java new file mode 100644 index 0000000..182c6a3 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/FinishedItem.java @@ -0,0 +1,163 @@ +package com.utopiaindustries.model.ctp; + +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +public class FinishedItem implements InventoryArtifact { + + private long id; + private long itemId; + private String sku; + private String barcode; + private long jobCardId; + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + private LocalDateTime createdAt; + private String createdBy; + private boolean isQa; + private long stitchedItemId; + private boolean isSegregated; + private String qaRemarks; + // wrapper + private JobCard jobCard; + private long accountId; + private String qaStatus; + + + public long getId() { + return id; + } + + @Override + public String getType() { + return "-"; + } + + public void setId(long id) { + this.id = id; + } + + public long getItemId() { + return itemId; + } + + public void setItemId(long itemId) { + this.itemId = itemId; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public String getBarcode() { + return barcode; + } + + public void setBarcode(String barcode) { + this.barcode = barcode; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public long getJobCardId() { + return jobCardId; + } + + public void setJobCardId(long jobCardId) { + this.jobCardId = jobCardId; + } + + public boolean getIsQa() { + return isQa; + } + + public void setIsQa(boolean qa) { + isQa = qa; + } + + public long getStitchedItemId() { + return stitchedItemId; + } + + public void setStitchedItemId(long stitchedItemId) { + this.stitchedItemId = stitchedItemId; + } + + public JobCard getJobCard() { + return jobCard; + } + + public void setJobCard(JobCard jobCard) { + this.jobCard = jobCard; + } + + public boolean getIsSegregated() { + return isSegregated; + } + + public void setIsSegregated(boolean segregated) { + isSegregated = segregated; + } + + public String getQaRemarks() { + return qaRemarks; + } + + public void setQaRemarks(String qaRemarks) { + this.qaRemarks = qaRemarks; + } + + public long getAccountId() { + return accountId; + } + + public void setAccountId(long accountId) { + this.accountId = accountId; + } + + public String getQaStatus() { + return qaStatus; + } + + public void setQaStatus(String qaStatus) { + this.qaStatus = qaStatus; + } + + @Override + public String toString() { + return "FinishedItem{" + + "id=" + id + + ", itemId=" + itemId + + ", sku='" + sku + '\'' + + ", barcode='" + barcode + '\'' + + ", jobCardId=" + jobCardId + + ", createdAt=" + createdAt + + ", createdBy='" + createdBy + '\'' + + ", isQa=" + isQa + + ", stitchedItemId=" + stitchedItemId + + ", isSegregated=" + isSegregated + + ", qaRemarks='" + qaRemarks + '\'' + + ", jobCard=" + jobCard + + ", accountId=" + accountId + + ", qaStatus='" + qaStatus + '\'' + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/FinishedItemWrapper.java b/src/main/java/com/utopiaindustries/model/ctp/FinishedItemWrapper.java new file mode 100644 index 0000000..755ca33 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/FinishedItemWrapper.java @@ -0,0 +1,23 @@ +package com.utopiaindustries.model.ctp; + +import java.util.List; + +public class FinishedItemWrapper { + + private List items; + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + @Override + public String toString() { + return "FinishedItemWrapper{" + + "items=" + items + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java b/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java new file mode 100644 index 0000000..5b3ff7e --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java @@ -0,0 +1,125 @@ +package com.utopiaindustries.model.ctp; + +import java.time.LocalDateTime; + +public class InventoryAccount { + + private long id; + private String title; + private String parentEntityType; + private long parentEntityId; + private Boolean active; + private String createdBy; + private LocalDateTime createdAt; + private Integer locationSiteId; + private String notes; + private Boolean isPackaging; + //wrapper + private String locationTitle; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getParentEntityType() { + return parentEntityType; + } + + public void setParentEntityType(String parentEntityType) { + this.parentEntityType = parentEntityType; + } + + public long getParentEntityId() { + return parentEntityId; + } + + public void setParentEntityId(long parentEntityId) { + this.parentEntityId = parentEntityId; + } + + public Boolean getActive() { + return active; + } + + public void setActive(Boolean active) { + this.active = active; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public Integer getLocationSiteId() { + return locationSiteId; + } + + public void setLocationSiteId(Integer locationSiteId) { + this.locationSiteId = locationSiteId; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public Boolean getIsPackaging() { + return isPackaging; + } + + public void setIsPackaging(Boolean isPackaging) { + this.isPackaging = isPackaging; + } + + public String getLocationTitle() { + return locationTitle; + } + + public void setLocationTitle(String locationTitle) { + this.locationTitle = locationTitle; + } + + + @Override + public String toString() { + return "InventoryAccount{" + + "id=" + id + + ", title='" + title + '\'' + + ", parentEntityType='" + parentEntityType + '\'' + + ", parentEntityId=" + parentEntityId + + ", active=" + active + + ", createdBy='" + createdBy + '\'' + + ", createdAt=" + createdAt + + ", locationSiteId=" + locationSiteId + + ", notes='" + notes + '\'' + + ", isPackaging=" + isPackaging + + ", locationTitle='" + locationTitle + '\'' + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/InventoryArtifact.java b/src/main/java/com/utopiaindustries/model/ctp/InventoryArtifact.java new file mode 100644 index 0000000..8c4b981 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/InventoryArtifact.java @@ -0,0 +1,11 @@ +package com.utopiaindustries.model.ctp; + +public interface InventoryArtifact { + + long getId(); + long getItemId(); + String getSku(); + String getType(); + String getBarcode(); + +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/InventoryArtifactType.java b/src/main/java/com/utopiaindustries/model/ctp/InventoryArtifactType.java new file mode 100644 index 0000000..cd43cdc --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/InventoryArtifactType.java @@ -0,0 +1,7 @@ +package com.utopiaindustries.model.ctp; + +public enum InventoryArtifactType { + BUNDLE, + STITCHING_OFFLINE, + FINISHED_ITEM +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/InventorySummary.java b/src/main/java/com/utopiaindustries/model/ctp/InventorySummary.java new file mode 100644 index 0000000..1a6aab5 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/InventorySummary.java @@ -0,0 +1,63 @@ +package com.utopiaindustries.model.ctp; + +import java.math.BigDecimal; + +public class InventorySummary { + + private long itemId; + private String sku; + private String parentDocumentType; + private String pieceType; + private BigDecimal balance; + + public long getItemId() { + return itemId; + } + + public void setItemId(long itemId) { + this.itemId = itemId; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public String getParentDocumentType() { + return parentDocumentType; + } + + public void setParentDocumentType(String parentDocumentType) { + this.parentDocumentType = parentDocumentType; + } + + public BigDecimal getBalance() { + return balance; + } + + public void setBalance(BigDecimal balance) { + this.balance = balance; + } + + public String getPieceType() { + return pieceType; + } + + public void setPieceType(String pieceType) { + this.pieceType = pieceType; + } + + @Override + public String toString() { + return "InventorySummary{" + + "itemId=" + itemId + + ", sku='" + sku + '\'' + + ", parentDocumentType='" + parentDocumentType + '\'' + + ", pieceType='" + pieceType + '\'' + + ", balance=" + balance + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/InventoryTransaction.java b/src/main/java/com/utopiaindustries/model/ctp/InventoryTransaction.java new file mode 100644 index 0000000..82b3840 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/InventoryTransaction.java @@ -0,0 +1,65 @@ +package com.utopiaindustries.model.ctp; + +import java.time.LocalDateTime; +import java.util.List; + +public class InventoryTransaction { + + private long id; + private LocalDateTime transactionDateTime; + private String generatedBy; + private String notes; + // wrapper + private List inventoryTransactionLegs; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public LocalDateTime getTransactionDateTime() { + return transactionDateTime; + } + + public void setTransactionDateTime(LocalDateTime transactionDateTime) { + this.transactionDateTime = transactionDateTime; + } + + public String getGeneratedBy() { + return generatedBy; + } + + public void setGeneratedBy(String generatedBy) { + this.generatedBy = generatedBy; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public List getInventoryTransactionLegs() { + return inventoryTransactionLegs; + } + + public void setInventoryTransactionLegs(List inventoryTransactionLegs) { + this.inventoryTransactionLegs = inventoryTransactionLegs; + } + + @Override + public String toString() { + return "InventoryTransaction{" + + "id=" + id + + ", transactionDateTime=" + transactionDateTime + + ", generatedBy='" + generatedBy + '\'' + + ", notes='" + notes + '\'' + + '}'; + } +} + diff --git a/src/main/java/com/utopiaindustries/model/ctp/InventoryTransactionLeg.java b/src/main/java/com/utopiaindustries/model/ctp/InventoryTransactionLeg.java new file mode 100644 index 0000000..6bb555f --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/InventoryTransactionLeg.java @@ -0,0 +1,151 @@ +package com.utopiaindustries.model.ctp; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +public class InventoryTransactionLeg { + + public enum Type{ + IN, + OUT + } + + private long id; + private long transactionId; + private long itemId; + private String sku; + private String type; + private BigDecimal quantity; + private Integer accountId; + private BigDecimal balance; + private LocalDateTime transactionLegDateTime; + private String parentDocumentType; + private long parentDocumentId; + private String parentDocumentPieceType; + + //wrapper + private InventoryTransaction transaction; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getTransactionId() { + return transactionId; + } + + public void setTransactionId(long transactionId) { + this.transactionId = transactionId; + } + + public long getItemId() { + return itemId; + } + + public void setItemId(long itemId) { + this.itemId = itemId; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public BigDecimal getQuantity() { + return quantity; + } + + public void setQuantity(BigDecimal quantity) { + this.quantity = quantity; + } + + public Integer getAccountId() { + return accountId; + } + + public void setAccountId(Integer accountId) { + this.accountId = accountId; + } + + public BigDecimal getBalance() { + return balance; + } + + public void setBalance(BigDecimal balance) { + this.balance = balance; + } + + public LocalDateTime getTransactionLegDateTime() { + return transactionLegDateTime; + } + + public void setTransactionLegDateTime(LocalDateTime transactionLegDateTime) { + this.transactionLegDateTime = transactionLegDateTime; + } + + public String getParentDocumentType() { + return parentDocumentType; + } + + public void setParentDocumentType(String parentDocumentType) { + this.parentDocumentType = parentDocumentType; + } + + public long getParentDocumentId() { + return parentDocumentId; + } + + public void setParentDocumentId(long parentDocumentId) { + this.parentDocumentId = parentDocumentId; + } + + public String getParentDocumentPieceType() { + return parentDocumentPieceType; + } + + public void setParentDocumentPieceType(String parentDocumentPieceType) { + this.parentDocumentPieceType = parentDocumentPieceType; + } + + public InventoryTransaction getTransaction() { + return transaction; + } + + public void setTransaction(InventoryTransaction transaction) { + this.transaction = transaction; + } + + @Override + public String toString() { + return "InventoryTransactionLeg{" + + "id=" + id + + ", transactionId=" + transactionId + + ", itemId=" + itemId + + ", sku='" + sku + '\'' + + ", type='" + type + '\'' + + ", quantity=" + quantity + + ", accountId=" + accountId + + ", balance=" + balance + + ", transactionLegDateTime=" + transactionLegDateTime + + ", parentDocumentType='" + parentDocumentType + '\'' + + ", parentDocumentId=" + parentDocumentId + + ", parentDocumentPieceType='" + parentDocumentPieceType + '\'' + + ", transaction=" + transaction + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/JobCard.java b/src/main/java/com/utopiaindustries/model/ctp/JobCard.java new file mode 100644 index 0000000..c824295 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/JobCard.java @@ -0,0 +1,186 @@ +package com.utopiaindustries.model.ctp; + +import java.time.LocalDateTime; +import java.util.List; + +public class JobCard { + + public enum Status{ + DRAFT, + POSTED, + } + + public enum InventoryStatus { + NOT_RECEIVED_YET, + RECEIVED + } + + private long id; + private String code; + private long jobOrderId; + private LocalDateTime createdAt; + private String createdBy; + private String status; + private String inventoryStatus; + private String customer; + private String lotNumber; + private long purchaseOrderId; + private long locationSiteId; + private String description; + // wrapper + private List items; + private long toAccountId; + private String purchaseOrderTitle; + private String locationTitle; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public long getJobOrderId() { + return jobOrderId; + } + + public void setJobOrderId(long jobOrderId) { + this.jobOrderId = jobOrderId; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getInventoryStatus() { + return inventoryStatus; + } + + public void setInventoryStatus(String inventoryStatus) { + this.inventoryStatus = inventoryStatus; + } + + + public String getCustomer() { + return customer; + } + + public void setCustomer(String customer) { + this.customer = customer; + } + + public String getLotNumber() { + return lotNumber; + } + + public void setLotNumber(String lotNumber) { + this.lotNumber = lotNumber; + } + + public long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public long getLocationSiteId() { + return locationSiteId; + } + + public void setLocationSiteId(long locationSiteId) { + this.locationSiteId = locationSiteId; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public long getToAccountId() { + return toAccountId; + } + + public void setToAccountId(long toAccountId) { + this.toAccountId = toAccountId; + } + + public String getPurchaseOrderTitle() { + return purchaseOrderTitle; + } + + public void setPurchaseOrderTitle(String purchaseOrderTitle) { + this.purchaseOrderTitle = purchaseOrderTitle; + } + + public String getLocationTitle() { + return locationTitle; + } + + public void setLocationTitle(String locationTitle) { + this.locationTitle = locationTitle; + } + + @Override + public String toString() { + return "JobCard{" + + "id=" + id + + ", code='" + code + '\'' + + ", jobOrderId=" + jobOrderId + + ", createdAt=" + createdAt + + ", createdBy='" + createdBy + '\'' + + ", status='" + status + '\'' + + ", inventoryStatus='" + inventoryStatus + '\'' + + ", customer='" + customer + '\'' + + ", lotNumber='" + lotNumber + '\'' + + ", purchaseOrderId=" + purchaseOrderId + + ", locationSiteId=" + locationSiteId + + ", description='" + description + '\'' + + ", items=" + items + + ", toAccountId=" + toAccountId + + ", purchaseOrderTitle='" + purchaseOrderTitle + '\'' + + ", locationTitle='" + locationTitle + '\'' + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/JobCardItem.java b/src/main/java/com/utopiaindustries/model/ctp/JobCardItem.java new file mode 100644 index 0000000..881031e --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/JobCardItem.java @@ -0,0 +1,122 @@ +package com.utopiaindustries.model.ctp; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; + +public class JobCardItem { + private long id; + private long jobCardId; + private long itemId; + private String sku; + private BigDecimal expectedProductionQuantity; + private BigDecimal totalProduction; + private BigDecimal production; + // wrapper + private List cutPieces; + private String title; + + public JobCardItem() { + this.expectedProductionQuantity = BigDecimal.ZERO; + this.totalProduction = BigDecimal.ZERO; + this.production = BigDecimal.ZERO; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getJobCardId() { + return jobCardId; + } + + public void setJobCardId(long jobCardId) { + this.jobCardId = jobCardId; + } + + public long getItemId() { + return itemId; + } + + public void setItemId(long itemId) { + this.itemId = itemId; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public BigDecimal getExpectedProductionQuantity() { + return expectedProductionQuantity; + } + + public void setExpectedProductionQuantity(BigDecimal expectedProductionQuantity) { + this.expectedProductionQuantity = expectedProductionQuantity; + } + + public List getCutPieces() { + return cutPieces; + } + + public void setCutPieces(List cutPieces) { + this.cutPieces = cutPieces; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public BigDecimal getTotalProduction() { + return totalProduction; + } + + public void setTotalProduction(BigDecimal totalProduction) { + this.totalProduction = totalProduction; + } + + public BigDecimal getProduction() { + return production; + } + + public void setProduction(BigDecimal production) { + this.production = production; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + JobCardItem item = (JobCardItem) o; + return id == item.id; + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + @Override + public String toString() { + return "JobCardItem{" + + "id=" + id + + ", jobCardId=" + jobCardId + + ", itemId=" + itemId + + ", sku='" + sku + '\'' + + ", expectedProductionQuantity=" + expectedProductionQuantity + + ", cutPieces=" + cutPieces + + ", title='" + title + '\'' + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/MasterBundle.java b/src/main/java/com/utopiaindustries/model/ctp/MasterBundle.java new file mode 100644 index 0000000..a419294 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/MasterBundle.java @@ -0,0 +1,118 @@ +package com.utopiaindustries.model.ctp; + +import java.time.LocalDateTime; +import java.util.List; + +public class MasterBundle implements InventoryArtifact{ + + private long id; + private String barcode; + private long itemId; + private String sku; + private String createdBy; + private LocalDateTime createdAt; + private boolean isReceived; + private long jobCardId; + // wrapper + private List bundles; + private List items; + + public long getId() { + return id; + } + + @Override + public String getType() { + return ""; + } + + public void setId(long id) { + this.id = id; + } + + public String getBarcode() { + return barcode; + } + + public void setBarcode(String barcode) { + this.barcode = barcode; + } + + public long getItemId() { + return itemId; + } + + public void setItemId(long itemId) { + this.itemId = itemId; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public long getJobCardId() { + return jobCardId; + } + + public void setJobCardId(long jobCardId) { + this.jobCardId = jobCardId; + } + + public boolean getIsReceived() { + return isReceived; + } + + public void setIsReceived(boolean received) { + isReceived = received; + } + + public List getBundles() { + return bundles; + } + + public void setBundles(List bundles) { + this.bundles = bundles; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + @Override + public String toString() { + return "MasterBundle{" + + "id=" + id + + ", barcode='" + barcode + '\'' + + ", itemId=" + itemId + + ", sku='" + sku + '\'' + + ", createdBy='" + createdBy + '\'' + + ", createdAt=" + createdAt + + ", isReceived=" + isReceived + + ", jobCardId=" + jobCardId + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/Process.java b/src/main/java/com/utopiaindustries/model/ctp/Process.java new file mode 100644 index 0000000..f4b9183 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/Process.java @@ -0,0 +1,41 @@ +package com.utopiaindustries.model.ctp; + +public class Process { + + private long id; + private String title; + private String notes; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + @Override + public String toString() { + return "Process{" + + "id=" + id + + ", title='" + title + '\'' + + ", notes='" + notes + '\'' + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/StitchedItemWrapper.java b/src/main/java/com/utopiaindustries/model/ctp/StitchedItemWrapper.java new file mode 100644 index 0000000..8c61503 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/StitchedItemWrapper.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.model.ctp; + +import java.util.*; +public class StitchedItemWrapper { + + + private List items; + private Long finishedAccountId; + + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public Long getFinishedAccountId() { + return finishedAccountId; + } + + public void setFinishedAccountId(Long finishedAccountId) { + this.finishedAccountId = finishedAccountId; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/StitchingOfflineItem.java b/src/main/java/com/utopiaindustries/model/ctp/StitchingOfflineItem.java new file mode 100644 index 0000000..95ecf8c --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/StitchingOfflineItem.java @@ -0,0 +1,125 @@ +package com.utopiaindustries.model.ctp; + +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +public class StitchingOfflineItem implements InventoryArtifact { + + private long id; + private long itemId; + private String sku; + private String barcode; + private long jobCardId; + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + private LocalDateTime createdAt; + private String createdBy; + private boolean isQa; + private String qaRemarks; + private String qaStatus; + + @Override + public String getType() { + return "-"; + } + + @Override + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + @Override + public long getItemId() { + return itemId; + } + + public void setItemId(long itemId) { + this.itemId = itemId; + } + + @Override + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + @Override + public String getBarcode() { + return barcode; + } + + public void setBarcode(String barcode) { + this.barcode = barcode; + } + + public long getJobCardId() { + return jobCardId; + } + + public void setJobCardId(long jobCardId) { + this.jobCardId = jobCardId; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public boolean getIsQa() { + return isQa; + } + + public void setIsQa(boolean qa) { + isQa = qa; + } + + public String getQaRemarks() { + return qaRemarks; + } + + public void setQaRemarks(String qaRemarks) { + this.qaRemarks = qaRemarks; + } + + public String getQaStatus() { + return qaStatus; + } + + public void setQaStatus(String qaStatus) { + this.qaStatus = qaStatus; + } + + @Override + public String toString() { + return "StitchingOfflineItem{" + + "id=" + id + + ", itemId=" + itemId + + ", sku='" + sku + '\'' + + ", barcode='" + barcode + '\'' + + ", jobCardId=" + jobCardId + + ", createdAt=" + createdAt + + ", createdBy='" + createdBy + '\'' + + ", isQa=" + isQa + + ", qaRemarks='" + qaRemarks + '\'' + + ", qaStatus='" + qaStatus + '\'' + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/User.java b/src/main/java/com/utopiaindustries/model/ctp/User.java new file mode 100644 index 0000000..8bc8eef --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/User.java @@ -0,0 +1,74 @@ +package com.utopiaindustries.model.ctp; + +import java.util.List; + +public class User { + + private String username; + private String password; + private boolean enabled; + //wrapper + private List authorities; + private List inventoryAccounts; + private String newPassword; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public boolean getEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public List getAuthorities() { + return authorities; + } + + public void setAuthorities(List authorities) { + this.authorities = authorities; + } + + public List getInventoryAccounts() { + return inventoryAccounts; + } + + public void setInventoryAccounts(List inventoryAccounts) { + this.inventoryAccounts = inventoryAccounts; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + + @Override + public String toString() { + return "User{" + + "username='" + username + '\'' + + ", password='" + password + '\'' + + ", enabled=" + enabled + + ", authorities=" + authorities + + ", inventoryAccounts=" + inventoryAccounts + + ", newPassword='" + newPassword + '\'' + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/UserInventoryAccount.java b/src/main/java/com/utopiaindustries/model/ctp/UserInventoryAccount.java new file mode 100644 index 0000000..4c4e791 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/UserInventoryAccount.java @@ -0,0 +1,38 @@ +package com.utopiaindustries.model.ctp; + +public class UserInventoryAccount { + + private String username; + private long accountId; + // wrapper + private String accountTitle; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public long getAccountId() { + return accountId; + } + + public void setAccountId(long accountId) { + this.accountId = accountId; + } + + public String getAccountTitle() { + return accountTitle; + } + + public void setAccountTitle(String accountTitle) { + this.accountTitle = accountTitle; + } + + @Override + public String toString() { + return accountTitle; + } +} diff --git a/src/main/java/com/utopiaindustries/model/uind/Item.java b/src/main/java/com/utopiaindustries/model/uind/Item.java new file mode 100644 index 0000000..02f36f8 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/uind/Item.java @@ -0,0 +1,505 @@ +package com.utopiaindustries.model.uind; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +public class Item { + + private long id; + private String title; + private String shortTitle; + private String description; + private String spec1; + private String spec2; + private String spec3; + private String spec4; + private String spec5; + private String brand; + private String year; + private String model; + private long unitId; + private long companyId; + private long functionId; + private long departmentId; + private Long sectionId; + private long typeId; + private long categoryId; + private Long subcategoryOneId; + private Long subcategoryTwoId; + private String code; + private String sku; + private long itemRequestId; + private long minimumLevel; + private long deadLevel; + private long storageLocationSiteId; + private long storageLocationUnitId; + private Long storageLocationFloorId; + private Long storageLocationStoreId; + private Long storageLocationShelfId; + private LocalDate dateAdded; + + private String lastAuditUpdateBy; + private LocalDateTime lastAuditDate; + private String requestedByUser; + private String addedByUser; + private boolean isActive; + private String hsCode; + private String imageUrl; + private String approvalStatus; + private String approvedBy; + private LocalDateTime approvedDate; + private String remarks; + private LocalDateTime requestDateTime; + private String materialType; + private String measurement; + private String origin; + private boolean isSkuSystemGenerated; + private boolean isUpdated; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getShortTitle() { + return shortTitle; + } + + public void setShortTitle(String shortTitle) { + this.shortTitle = shortTitle; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSpec1() { + return spec1; + } + + public void setSpec1(String spec1) { + this.spec1 = spec1; + } + + public String getSpec2() { + return spec2; + } + + public void setSpec2(String spec2) { + this.spec2 = spec2; + } + + public String getSpec3() { + return spec3; + } + + public void setSpec3(String spec3) { + this.spec3 = spec3; + } + + public String getSpec4() { + return spec4; + } + + public void setSpec4(String spec4) { + this.spec4 = spec4; + } + + public String getSpec5() { + return spec5; + } + + public void setSpec5(String spec5) { + this.spec5 = spec5; + } + + public String getBrand() { + return brand; + } + + public void setBrand(String brand) { + this.brand = brand; + } + + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public long getUnitId() { + return unitId; + } + + public void setUnitId(long unitId) { + this.unitId = unitId; + } + + public long getCompanyId() { + return companyId; + } + + public void setCompanyId(long companyId) { + this.companyId = companyId; + } + + public long getFunctionId() { + return functionId; + } + + public void setFunctionId(long functionId) { + this.functionId = functionId; + } + + public long getDepartmentId() { + return departmentId; + } + + public void setDepartmentId(long departmentId) { + this.departmentId = departmentId; + } + + public Long getSectionId() { + return sectionId; + } + + public void setSectionId(Long sectionId) { + this.sectionId = sectionId; + } + + public long getTypeId() { + return typeId; + } + + public void setTypeId(long typeId) { + this.typeId = typeId; + } + + public long getCategoryId() { + return categoryId; + } + + public void setCategoryId(long categoryId) { + this.categoryId = categoryId; + } + + public Long getSubcategoryOneId() { + return subcategoryOneId; + } + + public void setSubcategoryOneId(Long subcategoryOneId) { + this.subcategoryOneId = subcategoryOneId; + } + + public Long getSubcategoryTwoId() { + return subcategoryTwoId; + } + + public void setSubcategoryTwoId(Long subcategoryTwoId) { + this.subcategoryTwoId = subcategoryTwoId; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public long getItemRequestId() { + return itemRequestId; + } + + public void setItemRequestId(long itemRequestId) { + this.itemRequestId = itemRequestId; + } + + public long getMinimumLevel() { + return minimumLevel; + } + + public void setMinimumLevel(long minimumLevel) { + this.minimumLevel = minimumLevel; + } + + public long getDeadLevel() { + return deadLevel; + } + + public void setDeadLevel(long deadLevel) { + this.deadLevel = deadLevel; + } + + public long getStorageLocationSiteId() { + return storageLocationSiteId; + } + + public void setStorageLocationSiteId(long storageLocationSiteId) { + this.storageLocationSiteId = storageLocationSiteId; + } + + public long getStorageLocationUnitId() { + return storageLocationUnitId; + } + + public void setStorageLocationUnitId(long storageLocationUnitId) { + this.storageLocationUnitId = storageLocationUnitId; + } + + public Long getStorageLocationFloorId() { + return storageLocationFloorId; + } + + public void setStorageLocationFloorId(Long storageLocationFloorId) { + this.storageLocationFloorId = storageLocationFloorId; + } + + public Long getStorageLocationStoreId() { + return storageLocationStoreId; + } + + public void setStorageLocationStoreId(Long storageLocationStoreId) { + this.storageLocationStoreId = storageLocationStoreId; + } + + public Long getStorageLocationShelfId() { + return storageLocationShelfId; + } + + public void setStorageLocationShelfId(Long storageLocationShelfId) { + this.storageLocationShelfId = storageLocationShelfId; + } + + public LocalDate getDateAdded() { + return dateAdded; + } + + public void setDateAdded(LocalDate dateAdded) { + this.dateAdded = dateAdded; + } + + public String getLastAuditUpdateBy() { + return lastAuditUpdateBy; + } + + public void setLastAuditUpdateBy(String lastAuditUpdateBy) { + this.lastAuditUpdateBy = lastAuditUpdateBy; + } + + public LocalDateTime getLastAuditDate() { + return lastAuditDate; + } + + public void setLastAuditDate(LocalDateTime lastAuditDate) { + this.lastAuditDate = lastAuditDate; + } + + public String getRequestedByUser() { + return requestedByUser; + } + + public void setRequestedByUser(String requestedByUser) { + this.requestedByUser = requestedByUser; + } + + public String getAddedByUser() { + return addedByUser; + } + + public void setAddedByUser(String addedByUser) { + this.addedByUser = addedByUser; + } + + public boolean getIsActive() { + return isActive; + } + + public void setIsActive(boolean active) { + isActive = active; + } + + public String getHsCode() { + return hsCode; + } + + public void setHsCode(String hsCode) { + this.hsCode = hsCode; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getApprovalStatus() { + return approvalStatus; + } + + public void setApprovalStatus(String approvalStatus) { + this.approvalStatus = approvalStatus; + } + + public String getApprovedBy() { + return approvedBy; + } + + public void setApprovedBy(String approvedBy) { + this.approvedBy = approvedBy; + } + + public LocalDateTime getApprovedDate() { + return approvedDate; + } + + public void setApprovedDate(LocalDateTime approvedDate) { + this.approvedDate = approvedDate; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public LocalDateTime getRequestDateTime() { + return requestDateTime; + } + + public void setRequestDateTime(LocalDateTime requestDateTime) { + this.requestDateTime = requestDateTime; + } + + public String getMaterialType() { + return materialType; + } + + public void setMaterialType(String materialType) { + this.materialType = materialType; + } + + public String getMeasurement() { + return measurement; + } + + public void setMeasurement(String measurement) { + this.measurement = measurement; + } + + public String getOrigin() { + return origin; + } + + public void setOrigin(String origin) { + this.origin = origin; + } + + public boolean getIsSkuSystemGenerated() { + return isSkuSystemGenerated; + } + + public void setIsSkuSystemGenerated(boolean skuSystemGenerated) { + isSkuSystemGenerated = skuSystemGenerated; + } + + public boolean getIsUpdated() { + return isUpdated; + } + + public void setIsUpdated(boolean updated) { + isUpdated = updated; + } + + @Override + public String toString() { + return "Item{" + + "id=" + id + + ", title='" + title + '\'' + + ", shortTitle='" + shortTitle + '\'' + + ", description='" + description + '\'' + + ", spec1='" + spec1 + '\'' + + ", spec2='" + spec2 + '\'' + + ", spec3='" + spec3 + '\'' + + ", spec4='" + spec4 + '\'' + + ", spec5='" + spec5 + '\'' + + ", brand='" + brand + '\'' + + ", year='" + year + '\'' + + ", model='" + model + '\'' + + ", unitId=" + unitId + + ", companyId=" + companyId + + ", functionId=" + functionId + + ", departmentId=" + departmentId + + ", sectionId=" + sectionId + + ", typeId=" + typeId + + ", categoryId=" + categoryId + + ", subcategoryOneId=" + subcategoryOneId + + ", subcategoryTwoId=" + subcategoryTwoId + + ", code='" + code + '\'' + + ", sku='" + sku + '\'' + + ", itemRequestId=" + itemRequestId + + ", minimumLevel=" + minimumLevel + + ", deadLevel=" + deadLevel + + ", storageLocationSiteId=" + storageLocationSiteId + + ", storageLocationUnitId=" + storageLocationUnitId + + ", storageLocationFloorId=" + storageLocationFloorId + + ", storageLocationStoreId=" + storageLocationStoreId + + ", storageLocationShelfId=" + storageLocationShelfId + + ", dateAdded=" + dateAdded + + ", lastAuditUpdateBy='" + lastAuditUpdateBy + '\'' + + ", lastAuditDate=" + lastAuditDate + + ", requestedByUser='" + requestedByUser + '\'' + + ", addedByUser='" + addedByUser + '\'' + + ", isActive=" + isActive + + ", hsCode='" + hsCode + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", approvalStatus='" + approvalStatus + '\'' + + ", approvedBy='" + approvedBy + '\'' + + ", approvedDate=" + approvedDate + + ", remarks='" + remarks + '\'' + + ", requestDateTime=" + requestDateTime + + ", materialType='" + materialType + '\'' + + ", measurement='" + measurement + '\'' + + ", origin='" + origin + '\'' + + ", isSkuSystemGenerated=" + isSkuSystemGenerated + + ", isUpdated=" + isUpdated + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/model/uind/LocationSite.java b/src/main/java/com/utopiaindustries/model/uind/LocationSite.java new file mode 100644 index 0000000..c06f689 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/uind/LocationSite.java @@ -0,0 +1,70 @@ +package com.utopiaindustries.model.uind; + +public class LocationSite { + private long id; + private String title; + private String shortTitle; + private String address; + private boolean hasColony; + + public LocationSite() {} + + public LocationSite(long id, String title, String shortTitle, String address, boolean hasColony ) { + this.id = id; + this.title = title; + this.shortTitle = shortTitle; + this.address = address; + this.hasColony = hasColony; + } + + public long getId() { + return id; + } + + public void setId( long id ) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle( String title ) { + this.title = title; + } + + public String getShortTitle() { + return shortTitle; + } + + public void setShortTitle( String shortTitle ) { + this.shortTitle = shortTitle; + } + + public String getAddress() { + return address; + } + + public void setAddress( String address ) { + this.address = address; + } + + public boolean getHasColony() { + return hasColony; + } + + public void setHasColony(boolean hasColony) { + this.hasColony = hasColony; + } + + @Override + public String toString() { + return "LocationSite{" + + "id=" + id + + ", title='" + title + '\'' + + ", shortTitle='" + shortTitle + '\'' + + ", address='" + address + '\'' + + ", hasColony=" + hasColony + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/uind/PurchaseOrder.java b/src/main/java/com/utopiaindustries/model/uind/PurchaseOrder.java new file mode 100644 index 0000000..77ccc73 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/uind/PurchaseOrder.java @@ -0,0 +1,496 @@ +package com.utopiaindustries.model.uind; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Map; + +public class PurchaseOrder { + private long id; + private String code; + private LocalDateTime dateGenerated; + private LocalDate physicalDate; + private LocalDateTime approvalDate; + private LocalDateTime indentDivApprovalDate; + private String generatedByUser; + private String approvedByUser; + private String indenterDivApprovedByUser; + private long companyId; + private long functionId; + private long departmentId; + private Long sectionId; + private String quotationReferenceNumber; + private LocalDate quotationDate; + private long supplierId; + private Long brokerId; + private Long deliveryLocationSiteId; + private String userRemarks; + private String userStatus; + private String managementStatus; + private String indenterDivPoStatus; + private String managementRemarks; + private String indenterDivPoRemarks; + private String shipmentMode; + private String currencySymbol; + private Float currencyConversionRate; + private float gstAmount; + private float gstAmountInPkr; + private float totalCost; + private float totalCostInPkr; + private String totalCostInWords; + private String totalCostInWordsInPkr; + private float outstandingAdvanceAmount; // this is the balance advance amount, not total + private float amountPaid; + private Long mainPaymentTermId; + private LocalDateTime dateCompleted; + private String terminationReason; + private String parentDocumentType; + private String parentDocumentCode; + private Long parentDocumentId; + private Long indentId; + private boolean completed; + private boolean isRated; + private boolean isLocked; + private boolean areChargesPaid; // if charges are "billed" or "un-billed". not necessarily "paid" + private boolean isUrgent; + private boolean isFlagged; + // wrapper fields + + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public LocalDateTime getDateGenerated() { + return dateGenerated; + } + + public void setDateGenerated(LocalDateTime dateGenerated) { + this.dateGenerated = dateGenerated; + } + + public LocalDate getPhysicalDate() { + return physicalDate; + } + + public void setPhysicalDate(LocalDate physicalDate) { + this.physicalDate = physicalDate; + } + + public LocalDateTime getApprovalDate() { + return approvalDate; + } + + public void setApprovalDate(LocalDateTime approvalDate) { + this.approvalDate = approvalDate; + } + + public LocalDateTime getIndentDivApprovalDate() { + return indentDivApprovalDate; + } + + public void setIndentDivApprovalDate(LocalDateTime indentDivApprovalDate) { + this.indentDivApprovalDate = indentDivApprovalDate; + } + + public String getGeneratedByUser() { + return generatedByUser; + } + + public void setGeneratedByUser(String generatedByUser) { + this.generatedByUser = generatedByUser; + } + + public String getApprovedByUser() { + return approvedByUser; + } + + public void setApprovedByUser(String approvedByUser) { + this.approvedByUser = approvedByUser; + } + + public String getIndenterDivApprovedByUser() { + return indenterDivApprovedByUser; + } + + public void setIndenterDivApprovedByUser(String indenterDivApprovedByUser) { + this.indenterDivApprovedByUser = indenterDivApprovedByUser; + } + + public long getCompanyId() { + return companyId; + } + + public void setCompanyId(long companyId) { + this.companyId = companyId; + } + + public long getFunctionId() { + return functionId; + } + + public void setFunctionId(long functionId) { + this.functionId = functionId; + } + + public long getDepartmentId() { + return departmentId; + } + + public void setDepartmentId(long departmentId) { + this.departmentId = departmentId; + } + + public Long getSectionId() { + return sectionId; + } + + public void setSectionId(Long sectionId) { + this.sectionId = sectionId; + } + + public String getQuotationReferenceNumber() { + return quotationReferenceNumber; + } + + public void setQuotationReferenceNumber(String quotationReferenceNumber) { + this.quotationReferenceNumber = quotationReferenceNumber; + } + + public LocalDate getQuotationDate() { + return quotationDate; + } + + public void setQuotationDate(LocalDate quotationDate) { + this.quotationDate = quotationDate; + } + + public long getSupplierId() { + return supplierId; + } + + public void setSupplierId(long supplierId) { + this.supplierId = supplierId; + } + + public Long getBrokerId() { + return brokerId; + } + + public void setBrokerId(Long brokerId) { + this.brokerId = brokerId; + } + + public Long getDeliveryLocationSiteId() { + return deliveryLocationSiteId; + } + + public void setDeliveryLocationSiteId(Long deliveryLocationSiteId) { + this.deliveryLocationSiteId = deliveryLocationSiteId; + } + + public String getUserRemarks() { + return userRemarks; + } + + public void setUserRemarks(String userRemarks) { + this.userRemarks = userRemarks; + } + + public String getUserStatus() { + return userStatus; + } + + public void setUserStatus(String userStatus) { + this.userStatus = userStatus; + } + + public String getManagementStatus() { + return managementStatus; + } + + public void setManagementStatus(String managementStatus) { + this.managementStatus = managementStatus; + } + + public String getIndenterDivPoStatus() { + return indenterDivPoStatus; + } + + public void setIndenterDivPoStatus(String indenterDivPoStatus) { + this.indenterDivPoStatus = indenterDivPoStatus; + } + + public String getManagementRemarks() { + return managementRemarks; + } + + public void setManagementRemarks(String managementRemarks) { + this.managementRemarks = managementRemarks; + } + + public String getIndenterDivPoRemarks() { + return indenterDivPoRemarks; + } + + public void setIndenterDivPoRemarks(String indenterDivPoRemarks) { + this.indenterDivPoRemarks = indenterDivPoRemarks; + } + + public String getShipmentMode() { + return shipmentMode; + } + + public void setShipmentMode(String shipmentMode) { + this.shipmentMode = shipmentMode; + } + + public String getCurrencySymbol() { + return currencySymbol; + } + + public void setCurrencySymbol(String currencySymbol) { + this.currencySymbol = currencySymbol; + } + + public Float getCurrencyConversionRate() { + return currencyConversionRate; + } + + public void setCurrencyConversionRate(Float currencyConversionRate) { + this.currencyConversionRate = currencyConversionRate; + } + + public float getGstAmount() { + return gstAmount; + } + + public void setGstAmount(float gstAmount) { + this.gstAmount = gstAmount; + } + + public float getGstAmountInPkr() { + return gstAmountInPkr; + } + + public void setGstAmountInPkr(float gstAmountInPkr) { + this.gstAmountInPkr = gstAmountInPkr; + } + + public float getTotalCost() { + return totalCost; + } + + public void setTotalCost(float totalCost) { + this.totalCost = totalCost; + } + + public float getTotalCostInPkr() { + return totalCostInPkr; + } + + public void setTotalCostInPkr(float totalCostInPkr) { + this.totalCostInPkr = totalCostInPkr; + } + + public String getTotalCostInWords() { + return totalCostInWords; + } + + public void setTotalCostInWords(String totalCostInWords) { + this.totalCostInWords = totalCostInWords; + } + + public String getTotalCostInWordsInPkr() { + return totalCostInWordsInPkr; + } + + public void setTotalCostInWordsInPkr(String totalCostInWordsInPkr) { + this.totalCostInWordsInPkr = totalCostInWordsInPkr; + } + + public float getOutstandingAdvanceAmount() { + return outstandingAdvanceAmount; + } + + public void setOutstandingAdvanceAmount(float outstandingAdvanceAmount) { + this.outstandingAdvanceAmount = outstandingAdvanceAmount; + } + + public float getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(float amountPaid) { + this.amountPaid = amountPaid; + } + + public Long getMainPaymentTermId() { + return mainPaymentTermId; + } + + public void setMainPaymentTermId(Long mainPaymentTermId) { + this.mainPaymentTermId = mainPaymentTermId; + } + + public LocalDateTime getDateCompleted() { + return dateCompleted; + } + + public void setDateCompleted(LocalDateTime dateCompleted) { + this.dateCompleted = dateCompleted; + } + + public String getTerminationReason() { + return terminationReason; + } + + public void setTerminationReason(String terminationReason) { + this.terminationReason = terminationReason; + } + + public String getParentDocumentType() { + return parentDocumentType; + } + + public void setParentDocumentType(String parentDocumentType) { + this.parentDocumentType = parentDocumentType; + } + + public String getParentDocumentCode() { + return parentDocumentCode; + } + + public void setParentDocumentCode(String parentDocumentCode) { + this.parentDocumentCode = parentDocumentCode; + } + + public Long getParentDocumentId() { + return parentDocumentId; + } + + public void setParentDocumentId(Long parentDocumentId) { + this.parentDocumentId = parentDocumentId; + } + + public Long getIndentId() { + return indentId; + } + + public void setIndentId(Long indentId) { + this.indentId = indentId; + } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } + + public boolean isRated() { + return isRated; + } + + public void setRated(boolean rated) { + isRated = rated; + } + + public boolean getIsLocked() { + return isLocked; + } + + public void setIsLocked(boolean locked) { + isLocked = locked; + } + + public boolean isAreChargesPaid() { + return areChargesPaid; + } + + public void setAreChargesPaid(boolean areChargesPaid) { + this.areChargesPaid = areChargesPaid; + } + + public boolean isUrgent() { + return isUrgent; + } + + public void setUrgent(boolean urgent) { + isUrgent = urgent; + } + + public boolean getIsFlagged() { + return isFlagged; + } + + public void setIsFlagged(boolean flagged) { + isFlagged = flagged; + } + + @Override + public String toString() { + return "PurchaseOrder{" + + "id=" + id + + ", code='" + code + '\'' + + ", dateGenerated=" + dateGenerated + + ", physicalDate=" + physicalDate + + ", approvalDate=" + approvalDate + + ", indentDivApprovalDate=" + indentDivApprovalDate + + ", generatedByUser='" + generatedByUser + '\'' + + ", approvedByUser='" + approvedByUser + '\'' + + ", indenterDivApprovedByUser='" + indenterDivApprovedByUser + '\'' + + ", companyId=" + companyId + + ", functionId=" + functionId + + ", departmentId=" + departmentId + + ", sectionId=" + sectionId + + ", quotationReferenceNumber='" + quotationReferenceNumber + '\'' + + ", quotationDate=" + quotationDate + + ", supplierId=" + supplierId + + ", brokerId=" + brokerId + + ", deliveryLocationSiteId=" + deliveryLocationSiteId + + ", userRemarks='" + userRemarks + '\'' + + ", userStatus='" + userStatus + '\'' + + ", managementStatus='" + managementStatus + '\'' + + ", indenterDivPoStatus='" + indenterDivPoStatus + '\'' + + ", managementRemarks='" + managementRemarks + '\'' + + ", indenterDivPoRemarks='" + indenterDivPoRemarks + '\'' + + ", shipmentMode='" + shipmentMode + '\'' + + ", currencySymbol='" + currencySymbol + '\'' + + ", currencyConversionRate=" + currencyConversionRate + + ", gstAmount=" + gstAmount + + ", gstAmountInPkr=" + gstAmountInPkr + + ", totalCost=" + totalCost + + ", totalCostInPkr=" + totalCostInPkr + + ", totalCostInWords='" + totalCostInWords + '\'' + + ", totalCostInWordsInPkr='" + totalCostInWordsInPkr + '\'' + + ", outstandingAdvanceAmount=" + outstandingAdvanceAmount + + ", amountPaid=" + amountPaid + + ", mainPaymentTermId=" + mainPaymentTermId + + ", dateCompleted=" + dateCompleted + + ", terminationReason='" + terminationReason + '\'' + + ", parentDocumentType='" + parentDocumentType + '\'' + + ", parentDocumentCode='" + parentDocumentCode + '\'' + + ", parentDocumentId=" + parentDocumentId + + ", indentId=" + indentId + + ", completed=" + completed + + ", isRated=" + isRated + + ", isLocked=" + isLocked + + ", areChargesPaid=" + areChargesPaid + + ", isUrgent=" + isUrgent + + ", isFlagged=" + isFlagged + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/querybuilder/QueryBuilder.java b/src/main/java/com/utopiaindustries/querybuilder/QueryBuilder.java new file mode 100644 index 0000000..4db43fb --- /dev/null +++ b/src/main/java/com/utopiaindustries/querybuilder/QueryBuilder.java @@ -0,0 +1,831 @@ +package com.utopiaindustries.querybuilder; + +import com.utopiaindustries.util.MySQLUtils; +import com.utopiaindustries.util.StringUtils; + +public class QueryBuilder { + private StringBuilder query; + private String table; + private boolean previousCondition; + + public QueryBuilder() { + this.query = new StringBuilder(); + this.previousCondition = false; + } + + // setTable + public QueryBuilder setTable( String table ) { + this.table = table; + return this; + } + + // selectColumns + public QueryBuilder setColumns( String[] columns ) { + String formattedColumns = formatColumns( columns ); + this.query.append( String.format( "SELECT %s FROM %s", formattedColumns, this.table ) ); + this.query.append( " " ); + return this; + } + + public QueryBuilder setColumnsWithoutFormat( String[] columns ) { + this.query.append( String.format( "SELECT %s FROM %s", String.join( ",", columns ), this.table ) ); + this.query.append( " " ); + return this; + } + + // selectColumns + public QueryBuilder setJoinColumns( String[] columns ) { + String formattedColumns = formatJoinColumns( columns ); + this.query.append( String.format( "SELECT %s FROM %s", formattedColumns, this.table ) ); + this.query.append( " " ); + return this; + } + + public QueryBuilder setColumns( String column ) { + String formattedColumn = column.equals( "*" ) ? "*" : String.format( "`%s`", column ); + this.query.append( String.format( "SELECT %s FROM %s", formattedColumn, this.table ) ); + this.query.append( " " ); + return this; + } + + // set columns without formatting + public QueryBuilder setColumnsWithoutFormat( String columns ) { + this.query.append( String.format( "SELECT %s FROM %s", columns, this.table ) ); + this.query.append( " " ); + return this; + } + + // set column for count + public QueryBuilder setColumnForCount( String column ) { + String formattedColumn = column.equals( "*" ) ? "*" : String.format( "`%s`", column ); + this.query.append( String.format( "SELECT COUNT( %s ) FROM %s", formattedColumn, this.table ) ); + this.query.append( " " ); + return this; + } + + // where + public QueryBuilder where() { + this.query.append( "WHERE" ); + this.query.append( " " ); + return this; + } + + + // columns are Equal + public QueryBuilder columnsAreEqual( String col1, String col2 ) { + this.query.append( String.format( "`%s` = `%s`", col1, col2 ) ); + this.query.append( " " ); + this.previousCondition = true; + return this; + } + + // columnEquals + public QueryBuilder columnEquals( String col, Integer val ) { + if ( val != null ) { + this.query.append( String.format( "`%s` = %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnEquals( String col, Long val ) { + if ( val != null ) { + this.query.append( String.format( "`%s` = %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnEquals( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` = \"%s\"", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnEqualsWithoutBackTicks( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "%s = \"%s\"", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnJoinEquals( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + String[] parts = col.split( "\\." ); + this.query.append( String.format( "`%s`.`%s` = \"%s\"", parts[0], parts[1], MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnEquals( String col, Boolean val ) { + if ( isNotNull( val ) ) { + this.query.append( String.format( "`%s` = %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnDateEquals( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` = '%s'", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnJoinDateEquals( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + String[] parts = col.split( "\\." ); + this.query.append( String.format( "`%s`.`%s` = %s", parts[0], parts[1], MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + // columnNotEquals + public QueryBuilder columnNotEquals( String col, Long val ) { + if ( val != null ) { + this.query.append( String.format( "%s != %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + // columnNotEquals + public QueryBuilder columnNotEquals( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` != \"%s\"", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + // columnEqualsAnd + public QueryBuilder columnEqualsAnd( String col, String[] vals ) { + int index = 1; + for ( String val : vals ) { + if ( index == 1 ) { + this.query.append( "(" ); + } + this.query.append( String.format( "`%s` = \"%s\"", col, MySQLUtils.escapeString( val ) ) ); + if ( index != vals.length ) { + this.query.append( " " ); + this.query.append( "AND" ); + this.query.append( " " ); + } + if ( index == vals.length ) { + this.query.append( ")" ); + } + index++; + } + return this; + } + + // columnEqualsOr + public QueryBuilder columnEqualsOr( String col, String[] vals ) { + int index = 1; + for ( String val : vals ) { + if ( index == 1 ) { + this.query.append( "(" ); + } + this.query.append( String.format( "`%s` = \"%s\"", col, MySQLUtils.escapeString( val ) ) ); + if ( index != vals.length ) { + this.query.append( " " ); + this.query.append( "OR" ); + this.query.append( " " ); + } + if ( index == vals.length ) { + this.query.append( ")" ); + } + index++; + } + return this; + } + + // columnGreaterThan + public QueryBuilder columnGreaterThan( String col, Integer val ) { + if ( val != null ) { + this.query.append( String.format( "`%s` > %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnGreaterThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` > %s", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + // columnEqualToOrGreaterThan + public QueryBuilder columnEqualToOrGreaterThan( String col, Integer val ) { + if ( val != null ) { + this.query.append( String.format( "`%s` >= %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnEqualToOrGreaterThan( String col, Long val ) { + if ( val != null ) { + this.query.append( String.format( "`%s` >= %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnEqualToOrGreaterThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` >= %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnDateEqualToOrGreaterThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` >= '%s'", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnDateGreaterThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` > '%s'", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnDateWthoutBackTicksEqualToOrGreaterThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "%s >= '%s'", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnJoinDateEqualToOrGreaterThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + String[] parts = col.split( "\\." ); + this.query.append( String.format( "`%s`.`%s` >= '%s'", parts[0], parts[1], MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + // columnLessThan + public QueryBuilder columnLessThan( String col, Integer val ) { + if ( val != null ) { + this.query.append( String.format( "`%s` < %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnLessThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` < %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + // columnEqualToOrLessThan + public QueryBuilder columnEqualToOrLessThan( String col, Integer val ) { + if ( val != null ) { + this.query.append( String.format( "`%s` <= %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnEqualToOrLessThan( String col, Long val ) { + if ( val != null ) { + this.query.append( String.format( "`%s` <= %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnEqualToOrLessThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` <= %s", col, val ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnDateEqualToOrLessThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` <= '%s'", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnDateLessThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` < '%s'", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnDateWithoutBackTicksEqualToOrLessThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "%s <= '%s'", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnJoinDateEqualToOrLessThan( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + String[] parts = col.split( "\\." ); + this.query.append( String.format( "`%s`.`%s` <= '%s'", parts[0], parts[1], MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + // columnBetween + public QueryBuilder columnBetween( String col, int val1, int val2 ) { + this.query.append( String.format( "`%s` BETWEEN %s AND %s", col, val1, val2 ) ); + this.query.append( " " ); + this.previousCondition = true; + return this; + } + + public QueryBuilder columnBetweenDate( String col, String val1, String val2 ) { + if ( isNotNullOrEmpty( val1 ) && isNotNullOrEmpty( val2 ) ) { + this.query.append( String.format( "%s BETWEEN %s AND %s", col, MySQLUtils.escapeString( val1 ), MySQLUtils.escapeString( val2 ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val1 ); + return this; + } + + public QueryBuilder columnBetween( String col, String val1, String val2 ) { + if ( isNotNullOrEmpty( val1 ) && isNotNullOrEmpty( val2 ) ) { + this.query.append( String.format( "%s BETWEEN \"%s\" AND \"%s\"", col, MySQLUtils.escapeString( val1 ), MySQLUtils.escapeString( val2 ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val1 ); + return this; + } + + // columnLike + public QueryBuilder columnLike( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` LIKE \"%s\"", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + // columnLikeJoin + public QueryBuilder columnLikeJoin( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "%s LIKE \"%s\"", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + //for stock report column like join sku + public QueryBuilder columnLikeSku( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + String modifiedVal = val.replace("'", "%"); + this.query.append( String.format( "%s LIKE '%s'", col, ( modifiedVal ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + //for stock report column like join title + public QueryBuilder columnLikeTitle(String col, String val) { + if (isNotNullOrEmpty(val)) { + String modifiedVal = val.replace("'", "%"); + this.query.append(String.format("`%s` LIKE '%s'", col, modifiedVal)); + this.query.append(" "); + } + setPreviousCondition(val); + return this; + } + + // columnNotLike + public QueryBuilder columnNotLike( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "`%s` NOT LIKE \"%s\"", col, MySQLUtils.escapeString( val ) ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + // full text search + public QueryBuilder columnFullText( String[] cols, String val, String operator ) { + if ( isNotNullOrEmpty( val ) ) { + // match phrase + String matchPhrase = String.format( "MATCH (%s) ", String.join( ",", cols ) ); + this.query.append( matchPhrase ); + // against phrase + String againstPhrase = String.format( "AGAINST ('%s' IN BOOLEAN MODE)", StringUtils.formatAgainstPhraseValues( val, operator ) ); + this.query.append( againstPhrase ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder columnFullText( String[] cols, String val ) { + if ( isNotNullOrEmpty( val ) ) { + // match phrase + String matchPhrase = String.format( "MATCH (%s) ", String.join( ",", cols ) ); + this.query.append( matchPhrase ); + // against phrase + String againstPhrase = String.format( "AGAINST ('%s' IN BOOLEAN MODE)", StringUtils.formatAgainstPhraseValues( val, "+" ) ); + this.query.append( againstPhrase ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + // columnIsNull + public QueryBuilder columnIsNull( String col ) { + this.query.append( String.format( "`%s` IS NULL", col ) ); + this.query.append( " " ); + this.previousCondition = true; + return this; + } + + // columnIsNotNull + public QueryBuilder columnIsNotNull( String col ) { + this.query.append( String.format( "`%s` IS NOT NULL", col ) ); + this.query.append( " " ); + this.previousCondition = true; + return this; + } + + // columnIn + public QueryBuilder columnIn( String col, String[] val ) { + if ( val == null || val.length == 0 ) { + this.previousCondition = false; + return this; + } + String formattedValues = formatInValues( val ); + this.query.append( String.format( "`%s` IN %s", col, formattedValues ) ); + this.query.append( " " ); + this.previousCondition = true; + return this; + } + + public QueryBuilder columnIn( String col, Long[] val ) { + if ( val == null || val.length == 0 ) { + this.previousCondition = false; + return this; + } + String formattedValues = formatInValues( val ); + this.query.append( String.format( "`%s` IN %s", col, formattedValues ) ); + this.query.append( " " ); + this.previousCondition = true; + return this; + } + + public QueryBuilder columnNotIn( String col, Long[] val ) { + if ( val == null || val.length == 0 ) { + this.previousCondition = false; + return this; + } + String formattedValues = formatInValues( val ); + this.query.append( String.format( "`%s` NOT IN %s", col, formattedValues ) ); + this.query.append( " " ); + this.previousCondition = true; + return this; + } + + + // columnIn + public QueryBuilder columnNotIn( String col, String[] val ) { + if ( val == null || val.length == 0 ) { + this.previousCondition = false; + return this; + } + String formattedValues = formatInValues( val ); + this.query.append( String.format( "`%s` NOT IN %s", col, formattedValues ) ); + this.query.append( " " ); + this.previousCondition = true; + return this; + } + + // comma separated column contains + public QueryBuilder commaSeparatedColumnContains( String col, Long val ) { + if ( val != null ) { + this.query.append( String.format( "find_in_set( %s , `%s` )", val, col ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + public QueryBuilder commaSeparatedColumnContains( String col, String val ) { + if ( isNotNullOrEmpty( val ) ) { + this.query.append( String.format( "find_in_set( \"%s\" , `%s` )", MySQLUtils.escapeString( val ), col ) ); + this.query.append( " " ); + } + setPreviousCondition( val ); + return this; + } + + + // orderBy + public QueryBuilder orderBy( String col, String sort ) { + this.query.append( String.format( "ORDER BY `%s` %s", col, sort ) ); + this.query.append( " " ); + return this; + } + + // orderByJoin + public QueryBuilder orderByJoin( String col, String sort ) { + String[] parts = col.split( "\\." ); + this.query.append( String.format( "ORDER BY `%s`.`%s` %s", parts[0], parts[1], sort ) ); + this.query.append( " " ); + return this; + } + + + // orderByCastValue + public QueryBuilder orderByCastColumn( String col, String dataType, String sort ) { + this.query.append( String.format( "ORDER BY CAST( `%s` AS %s ) %s", col, dataType, sort ) ); + this.query.append( " " ); + return this; + } + + + // orderBy + public QueryBuilder orderByColumnCondition( String columnCondition, String sort ) { + this.query.append( String.format( "ORDER BY %s %s", columnCondition, sort ) ); + this.query.append( " " ); + return this; + } + + // groupBy + public QueryBuilder groupBy( String col ) { + this.query.append( String.format( "GROUP BY `%s`", col ) ); + this.query.append( " " ); + return this; + } + + // limit + public QueryBuilder limit( Integer val ) { + if( val != null ) { + this.query.append( String.format( "LIMIT %s", val ) ); + this.query.append( " " ); + } + return this; + } + + public QueryBuilder limit( Long val ) { + if ( val != null ) { + this.query.append( String.format( "LIMIT %s", val ) ); + this.query.append( " " ); + } + return this; + } + + // not + public QueryBuilder not() { + this.query.append( "NOT" ); + this.query.append( " " ); + return this; + } + + // and + public QueryBuilder and() { + if ( this.previousCondition ) { + this.query.append( "AND" ); + this.query.append( " " ); + } + return this; + } + + // or + public QueryBuilder or() { + if ( this.previousCondition ) { + this.query.append( "OR" ); + this.query.append( " " ); + } + return this; + } + + //bracket open + public QueryBuilder bracketOpen() { + this.query.append( "(" ); + this.query.append( " " ); + return this; + } + + // bracket close + public QueryBuilder bracketClose() { + this.query.append( ")" ); + this.query.append( " " ); + return this; + } + + // build + public String build() { + String queryStr = this.query.toString().trim(); + // check for AND ORDER + if ( queryStr.contains( " AND ORDER BY " ) ) { + queryStr = queryStr.replaceAll( " AND ORDER BY ", " ORDER BY " ); + } + // check for AND LIMIT + if ( queryStr.contains( " AND LIMIT" ) ) { + queryStr = queryStr.replaceAll( " AND LIMIT", " LIMIT" ); + } + // check for AND GROUP BY + if ( queryStr.contains( " AND GROUP BY" ) ) { + queryStr = queryStr.replaceAll( " AND GROUP BY", " GROUP BY" ); + } + // check for ending OR + if ( queryStr.endsWith( " OR" ) ) { + queryStr = queryStr.substring( 0, queryStr.lastIndexOf( " OR" ) ); + } + // check for ending AND + if ( queryStr.endsWith( " AND" ) ) { + queryStr = queryStr.substring( 0, queryStr.lastIndexOf( " AND" ) ); + } + // checking for ending WHERE + if ( queryStr.endsWith( " WHERE" ) ) { + queryStr = queryStr.substring( 0, queryStr.lastIndexOf( " WHERE" ) ); + } + // checking for WHERE ORDER + if ( queryStr.contains( " WHERE ORDER" ) ) { + queryStr = queryStr.replaceAll( "WHERE ORDER BY", "ORDER BY" ); + } + // checking for WHERE LIMIT + if ( queryStr.contains( " WHERE LIMIT" ) ) { + queryStr = queryStr.replaceAll( "WHERE LIMIT", "LIMIT" ); + } + return queryStr; + } + + // isNotNullOrEmpty + private boolean isNotNullOrEmpty( String str ) { + return !( ( str == null ) || str.isEmpty() ); + } + + private boolean isNotNull( Boolean val ) { + return !( val == null ); + } + + // format columns + private String formatColumns( String[] columns ) { + StringBuilder stringBuilder = new StringBuilder(); + for ( String column : columns ) { + stringBuilder.append( String.format( "`%s`,", column ) ); + } + String str = stringBuilder.toString(); + if ( str.endsWith( "," ) ) { + str = str.substring( 0, str.lastIndexOf( "," ) ); + } + return str; + } + + // format columns + private String formatJoinColumns( String[] columns ) { + StringBuilder stringBuilder = new StringBuilder(); + for ( String column : columns ) { + int intIndex = column.indexOf( "(" ); + if ( intIndex != -1 ) { + String[] partsRound = column.split( "\\(" ); + String result = column.substring( column.indexOf( "(" ) + 1, column.indexOf( ")" ) ); + String[] partsPoint = result.split( "\\." ); + System.out.println( result ); + stringBuilder.append( String.format( "%s(", partsRound[0] ) ); + stringBuilder.append( String.format( "`%s`.", partsPoint[0] ) ); + stringBuilder.append( String.format( "`%s`),", partsPoint[1] ) ); + } else { + String[] parts = column.split( "\\." ); + stringBuilder.append( String.format( "`%s`.", parts[0] ) ); + stringBuilder.append( String.format( "`%s`,", parts[1] ) ); + } + + } + String str = stringBuilder.toString(); + if ( str.endsWith( "," ) ) { + str = str.substring( 0, str.lastIndexOf( "," ) ); + } + return str; + } + + // format in values + private String formatInValues( String[] vals ) { + if ( vals.length == 0 ) { + return "(\"\")"; + } + StringBuilder strBuilder = new StringBuilder(); + strBuilder.append( "(" ); + for ( String val : vals ) { + strBuilder.append( String.format( "\"%s\",", MySQLUtils.escapeString( val ) ) ); + } + strBuilder.append( ")" ); + String str = strBuilder.toString(); + // check for ending comma + if ( str.endsWith( ",)" ) ) { + str = str.substring( 0, str.lastIndexOf( ",)" ) ); + str += ")"; + } + return str; + } + + private String formatInValues( Long[] vals ) { + if ( vals.length == 0 ) { + return "(\"\")"; + } + StringBuilder strBuilder = new StringBuilder(); + strBuilder.append( "(" ); + for ( long val : vals ) { + strBuilder.append( String.format( "%s,", val ) ); + } + strBuilder.append( ")" ); + String str = strBuilder.toString(); + // check for ending comma + if ( str.endsWith( ",)" ) ) { + str = str.substring( 0, str.lastIndexOf( ",)" ) ); + str += ")"; + } + return str; + } + + public QueryBuilder setInnerJoin( String table, String columnLeft, String columnRight ) { + this.query.append( " INNER JOIN " ).append( table ).append( " ON " ).append( columnLeft ).append( " = " ).append( columnRight ).append( " " ); + return this; + } + + public QueryBuilder setLeftJoin( String table, String columnLeft, String columnRight ) { + this.query.append( " LEFT JOIN " ).append( table ).append( " ON " ).append( columnLeft ).append( " = " ).append( columnRight ).append( " " ); + return this; + } + + // set previous condition + private void setPreviousCondition( String val ) { + this.previousCondition = isNotNullOrEmpty( val ); + } + + private void setPreviousCondition( Long val ) { + this.previousCondition = ( val != null ); + } + + private void setPreviousCondition( Integer val ) { + this.previousCondition = ( val != null ); + } + + private void setPreviousCondition( Boolean val ) { + this.previousCondition = isNotNull( val ); + } + public QueryBuilder append(String sqlFragment) { + this.query.append(sqlFragment); + return this; + } +} diff --git a/src/main/java/com/utopiaindustries/querybuilder/ctp/BundleQueryBuilder.java b/src/main/java/com/utopiaindustries/querybuilder/ctp/BundleQueryBuilder.java new file mode 100644 index 0000000..cd382b2 --- /dev/null +++ b/src/main/java/com/utopiaindustries/querybuilder/ctp/BundleQueryBuilder.java @@ -0,0 +1,61 @@ +package com.utopiaindustries.querybuilder.ctp; + +import com.utopiaindustries.querybuilder.QueryBuilder; +import com.utopiaindustries.util.CTPDateTimeFormat; +import com.utopiaindustries.util.StringUtils; + +import java.time.LocalDate; + +public class BundleQueryBuilder { + + public static String buildQuery(String id, String sku, String jobCardId, String masterId, String type, String status, String startDate, String endDate, Long count) { + // format date + String formattedDate; + String formattedEndDate; + String startDate1 = ""; + String endDate1 = ""; + if (!StringUtils.isNullOrEmpty(startDate)) { + formattedDate = CTPDateTimeFormat.getMySQLFormattedDateString(startDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + formattedEndDate = CTPDateTimeFormat.getMySQLFormattedDateString(endDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + startDate1 = String.format("'%s 00:00:01'", formattedDate); + if (!StringUtils.isNullOrEmpty(endDate)) { + endDate1 = String.format("'%s 23:59:59'", formattedEndDate); + } else { + endDate1 = String.format("'%s 23:59:59'", LocalDate.now()); + } + } + + + QueryBuilder qb = new QueryBuilder() + .setTable("cut_to_pack.bundle") + .setColumns("*") + .where() + .columnEquals("id", id) + .and() + .columnEquals("sku", sku) + .and() + .columnEquals("job_card_id", jobCardId) + .and() + .columnEquals("type", type) + .and() + .columnEquals("master_bundle_id", masterId); + + + if (! StringUtils.isNullOrEmpty( status ) ) { + if (status.equalsIgnoreCase("1")) { + qb.and() + .columnGreaterThan("master_bundle_id", "0"); + } else { + qb.and() + .columnEquals("master_bundle_id", "0"); + } + } + qb.and() + .columnEqualToOrGreaterThan("created_at", startDate1) + .and() + .columnEqualToOrLessThan("created_at", endDate1) + .limit(count.intValue()); + + return qb.build(); + } +} diff --git a/src/main/java/com/utopiaindustries/querybuilder/ctp/FinishedItemQueryBuilder.java b/src/main/java/com/utopiaindustries/querybuilder/ctp/FinishedItemQueryBuilder.java new file mode 100644 index 0000000..456ff45 --- /dev/null +++ b/src/main/java/com/utopiaindustries/querybuilder/ctp/FinishedItemQueryBuilder.java @@ -0,0 +1,49 @@ +package com.utopiaindustries.querybuilder.ctp; + +import com.utopiaindustries.querybuilder.QueryBuilder; +import com.utopiaindustries.util.CTPDateTimeFormat; +import com.utopiaindustries.util.StringUtils; + +import java.time.LocalDate; + +public class FinishedItemQueryBuilder { + + + public static String buildQuery(String id, String itemId, String sku, String createdStartDate, String createdEndDate, String jobCardId, Long count) { + // format date + String formattedDate; + String formattedEndDate; + String startDate1 = ""; + String endDate1 = ""; + if (!StringUtils.isNullOrEmpty( createdStartDate)) { + formattedDate = CTPDateTimeFormat.getMySQLFormattedDateString(createdStartDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + formattedEndDate = CTPDateTimeFormat.getMySQLFormattedDateString(createdEndDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + startDate1 = String.format("'%s 00:00:01'", formattedDate); + if (!StringUtils.isNullOrEmpty(createdEndDate)) { + endDate1 = String.format("'%s 23:59:59'", formattedEndDate); + } else { + endDate1 = String.format("'%s 23:59:59'", LocalDate.now()); + } + } + + return ( new QueryBuilder() ) + .setTable("cut_to_pack.finished_item") + .setColumns("*") + .where() + .columnEquals("id", id) + .and() + .columnEquals("sku", sku) + .and() + .columnEquals("item_id", itemId ) + .and() + .columnEquals("job_card_id", jobCardId ) + .and() + .columnEqualToOrGreaterThan("created_at", startDate1) + .and() + .columnEqualToOrLessThan("created_at", endDate1 ) + .orderBy("id","DESC") + .limit(count) + .build(); + + } +} diff --git a/src/main/java/com/utopiaindustries/querybuilder/ctp/InventoryAccountQueryBuilder.java b/src/main/java/com/utopiaindustries/querybuilder/ctp/InventoryAccountQueryBuilder.java new file mode 100644 index 0000000..0489d2f --- /dev/null +++ b/src/main/java/com/utopiaindustries/querybuilder/ctp/InventoryAccountQueryBuilder.java @@ -0,0 +1,74 @@ +package com.utopiaindustries.querybuilder.ctp; + +import com.utopiaindustries.querybuilder.QueryBuilder; +import com.utopiaindustries.util.CTPDateTimeFormat; +import com.utopiaindustries.util.StringUtils; + +import java.time.LocalDate; +import java.util.List; + +public class InventoryAccountQueryBuilder { + + public static String buildQuery(String id, + String title, + String active, + String createdBy, + String startDate, + String endDate, + String siteId, + Long count, + List accountIds, + String parentEntityType, + String parentEntityId, + Boolean isPackaging) { + + // format date + String formattedDate; + String formattedEndDate; + String startDate1 = ""; + String endDate1 = ""; + if (!StringUtils.isNullOrEmpty(startDate)) { + formattedDate = CTPDateTimeFormat.getMySQLFormattedDateString(startDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + formattedEndDate = CTPDateTimeFormat.getMySQLFormattedDateString(endDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + startDate1 = String.format("'%s 00:00:01'", formattedDate); + if (!StringUtils.isNullOrEmpty(endDate)) { + endDate1 = String.format("'%s 23:59:59'", formattedEndDate); + } else { + endDate1 = String.format("'%s 23:59:59'", LocalDate.now()); + } + } + + QueryBuilder qb = (new QueryBuilder()) + .setTable("cut_to_pack.inventory_account") + .setColumns("*") + .where() + .columnEquals("id", id) + .and() + .columnLikeTitle("title", title) + .and() + .columnEquals("active", active) + .and() + .columnLike("created_by", createdBy) + .and() + .columnEqualToOrGreaterThan("created_at", startDate1) + .and() + .columnEqualToOrLessThan("created_at", endDate1) + .and() + .columnEquals("location_site_id", siteId) + .and() + .columnEquals("parent_entity_type", parentEntityType ) + .and() + .columnEquals("parent_entity_id", parentEntityId ) + .and() + .columnEquals("is_packaging", isPackaging ); + + if (!accountIds.isEmpty()) { + qb.and() + .columnIn("id", accountIds.toArray( new Long[0] )); + } + + qb.limit(count.intValue()); + return qb.build(); + + } +} diff --git a/src/main/java/com/utopiaindustries/querybuilder/ctp/MasterBundleQueryBuilder.java b/src/main/java/com/utopiaindustries/querybuilder/ctp/MasterBundleQueryBuilder.java new file mode 100644 index 0000000..2bba50b --- /dev/null +++ b/src/main/java/com/utopiaindustries/querybuilder/ctp/MasterBundleQueryBuilder.java @@ -0,0 +1,44 @@ +package com.utopiaindustries.querybuilder.ctp; + +import com.utopiaindustries.querybuilder.QueryBuilder; +import com.utopiaindustries.util.CTPDateTimeFormat; +import com.utopiaindustries.util.StringUtils; + +import java.time.LocalDate; + +public class MasterBundleQueryBuilder { + + + public static String buildQuery( String id, String jobCardId, String startDate, String endDate, Long count ){ + // format date + String formattedDate; + String formattedEndDate; + String startDate1 = ""; + String endDate1 = ""; + if ( ! StringUtils.isNullOrEmpty( startDate ) ) { + formattedDate = CTPDateTimeFormat.getMySQLFormattedDateString( startDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT ); + formattedEndDate = CTPDateTimeFormat.getMySQLFormattedDateString( endDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT ); + startDate1 = String.format( "'%s 00:00:01'", formattedDate ); + if ( ! StringUtils.isNullOrEmpty( endDate ) ) { + endDate1 = String.format("'%s 23:59:59'", formattedEndDate); + } + else { + endDate1 = String.format("'%s 23:59:59'", LocalDate.now() ); + } + } + + return ( new QueryBuilder() ) + .setTable( "cut_to_pack.master_bundle" ) + .setColumns( "*" ) + .where() + .columnEquals( "id", id ) + .and() + .columnEquals( "job_card_id", jobCardId ) + .and() + .columnEqualToOrGreaterThan("created_at" , startDate1 ) + .and() + .columnEqualToOrLessThan( "created_at", endDate1 ) + .limit( count.intValue() ) + .build(); + } +} diff --git a/src/main/java/com/utopiaindustries/restcontroller/BundleRestController.java b/src/main/java/com/utopiaindustries/restcontroller/BundleRestController.java new file mode 100644 index 0000000..8dd347e --- /dev/null +++ b/src/main/java/com/utopiaindustries/restcontroller/BundleRestController.java @@ -0,0 +1,37 @@ +package com.utopiaindustries.restcontroller; + +import com.utopiaindustries.model.ctp.Bundle; + +import com.utopiaindustries.model.ctp.MasterBundle; +import com.utopiaindustries.service.BundleService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping( "/rest/bundles" ) +public class BundleRestController { + + private final BundleService bundleService; + + public BundleRestController(BundleService bundleService) { + this.bundleService = bundleService; + } + + @GetMapping("/search") + public List searchBundles( @RequestParam String term ) { + return bundleService.getBundleByIdAndItemIdAndSku( term ); + } + + @GetMapping( "/master/search" ) + public List searchMasterBundle( @RequestParam String term, + @RequestParam boolean received ){ + return bundleService.getMasterBundleByIdTerm( term, received ); + } + + @GetMapping( "/find-by-master/{masterId}" ) + public List findByMasterBarcode( @PathVariable("masterId") long masterId ){ + return bundleService.findBundlesByMasterId( masterId ); + } + +} diff --git a/src/main/java/com/utopiaindustries/restcontroller/CutPieceRestController.java b/src/main/java/com/utopiaindustries/restcontroller/CutPieceRestController.java new file mode 100644 index 0000000..320d21f --- /dev/null +++ b/src/main/java/com/utopiaindustries/restcontroller/CutPieceRestController.java @@ -0,0 +1,27 @@ +package com.utopiaindustries.restcontroller; + +import com.utopiaindustries.service.JobCardService; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping( "/rest/cut-pieces" ) +public class CutPieceRestController { + + private final JobCardService jobCardService; + + public CutPieceRestController(JobCardService jobCardService) { + this.jobCardService = jobCardService; + } + + @PostMapping + public String deleteJobCardItemPiece( @RequestParam("cut-piece-id") long cutPieceId ){ + try { + return jobCardService.deleteCutPieceItem( cutPieceId ); + } catch ( Exception e ){ + return e.getMessage(); + } + } +} diff --git a/src/main/java/com/utopiaindustries/restcontroller/FinishedItemRestController.java b/src/main/java/com/utopiaindustries/restcontroller/FinishedItemRestController.java new file mode 100644 index 0000000..045439e --- /dev/null +++ b/src/main/java/com/utopiaindustries/restcontroller/FinishedItemRestController.java @@ -0,0 +1,27 @@ +package com.utopiaindustries.restcontroller; + +import com.utopiaindustries.dao.ctp.FinishedItemDAO; +import com.utopiaindustries.model.ctp.FinishedItem; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping( "/rest/finished-items" ) +public class FinishedItemRestController { + + private final FinishedItemDAO finishedItemDAO; + + public FinishedItemRestController(FinishedItemDAO finishedItemDAO) { + this.finishedItemDAO = finishedItemDAO; + } + + @GetMapping( "/search" ) + public List searchFinishedItems(@RequestParam( "term") String term, + @RequestParam( "is-segregated") boolean isSegregated ){ + return finishedItemDAO.findByTerm( term, isSegregated ); + } +} diff --git a/src/main/java/com/utopiaindustries/restcontroller/ItemRestController.java b/src/main/java/com/utopiaindustries/restcontroller/ItemRestController.java new file mode 100644 index 0000000..a693a75 --- /dev/null +++ b/src/main/java/com/utopiaindustries/restcontroller/ItemRestController.java @@ -0,0 +1,38 @@ +package com.utopiaindustries.restcontroller; + +import com.utopiaindustries.dao.uind.ItemDAO; +import com.utopiaindustries.model.uind.Item; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping( "/rest/items" ) +public class ItemRestController { + + private final ItemDAO itemDAO; + + public ItemRestController(ItemDAO itemDAO) { + this.itemDAO = itemDAO; + } + + @GetMapping("/search") + public List searchItemByTitle(@RequestParam String term, + @RequestParam(name = "type-ids", required = false) Long[] typeIds ) { + + List items; + // if type ids are present, search them + if (typeIds != null && typeIds.length > 0) { + items = itemDAO.findBySkuOrTitleAndTypeIdAndActive(term, Arrays.stream(typeIds).collect(Collectors.toList()), "1" ); + } else { + // else return all results + items = itemDAO.findLikeTitleAndStatus(term, true ); + } + return items; + } +} diff --git a/src/main/java/com/utopiaindustries/restcontroller/JobCardRestController.java b/src/main/java/com/utopiaindustries/restcontroller/JobCardRestController.java new file mode 100644 index 0000000..49cb9cf --- /dev/null +++ b/src/main/java/com/utopiaindustries/restcontroller/JobCardRestController.java @@ -0,0 +1,46 @@ +package com.utopiaindustries.restcontroller; + +import com.utopiaindustries.model.ctp.JobCard; +import com.utopiaindustries.model.ctp.JobCardItem; +import com.utopiaindustries.service.JobCardService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping( "/rest/job-cards" ) +public class JobCardRestController { + + private final JobCardService jobCardService; + + public JobCardRestController(JobCardService jobCardService) { + this.jobCardService = jobCardService; + } + + @GetMapping( "/search" ) + public List getJobCards( @RequestParam(value = "term", required = false) String term, + @RequestParam(value = "filter", required = false) Boolean filter){ + return jobCardService.searchJobCards( term , filter ); + } + + @GetMapping ( "/{id}/items" ) + public List getJobCardItems( @PathVariable( "id" ) long jobCardId ){ + return jobCardService.getJobCardItems( jobCardId ); + } + + @GetMapping( "/find/{id}" ) + public JobCard findById( @PathVariable("id") long cardId ){ + return jobCardService.findCardRecursively( cardId ); + } + + @PostMapping + public String deleteJobCardItem(@RequestParam( "job-card-item-id" ) long jobCardItemId ){ + try{ + jobCardService.deleteJobCardItem( jobCardItemId ); + return "success"; + }catch ( Exception e ){ + return e.getMessage(); + } + } + +} diff --git a/src/main/java/com/utopiaindustries/restcontroller/LocationRestController.java b/src/main/java/com/utopiaindustries/restcontroller/LocationRestController.java new file mode 100644 index 0000000..56db175 --- /dev/null +++ b/src/main/java/com/utopiaindustries/restcontroller/LocationRestController.java @@ -0,0 +1,27 @@ +package com.utopiaindustries.restcontroller; + +import com.utopiaindustries.model.uind.LocationSite; +import com.utopiaindustries.service.LocationService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping( "/rest/locations" ) +public class LocationRestController { + + private final LocationService locationService; + + public LocationRestController(LocationService locationService) { + this.locationService = locationService; + } + + @GetMapping("/sites/search") + private List searchSiteByTitle(@RequestParam String term ) { + return locationService.getSitesByTitle( term ); + } + +} diff --git a/src/main/java/com/utopiaindustries/restcontroller/PurchaseOrderRestController.java b/src/main/java/com/utopiaindustries/restcontroller/PurchaseOrderRestController.java new file mode 100644 index 0000000..9c4c3d7 --- /dev/null +++ b/src/main/java/com/utopiaindustries/restcontroller/PurchaseOrderRestController.java @@ -0,0 +1,29 @@ +package com.utopiaindustries.restcontroller; + +import com.utopiaindustries.model.uind.PurchaseOrder; +import com.utopiaindustries.service.PurchaseOrderService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping( "/rest/purchase-orders" ) +public class PurchaseOrderRestController { + + private final PurchaseOrderService purchaseOrderService; + + public PurchaseOrderRestController(PurchaseOrderService purchaseOrderService) { + this.purchaseOrderService = purchaseOrderService; + } + + /* + * search by term + * */ + @GetMapping( "/search" ) + public List findByTerm(@RequestParam("term") String term ) { + return purchaseOrderService.findByTerm( term ); + } +} diff --git a/src/main/java/com/utopiaindustries/restcontroller/StitchingItemsRestController.java b/src/main/java/com/utopiaindustries/restcontroller/StitchingItemsRestController.java new file mode 100644 index 0000000..2fd8b37 --- /dev/null +++ b/src/main/java/com/utopiaindustries/restcontroller/StitchingItemsRestController.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.restcontroller; + +import com.utopiaindustries.dao.ctp.StitchingOfflineItemDAO; +import com.utopiaindustries.model.ctp.StitchingOfflineItem; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping( "/rest/stitching-offline-items" ) +public class StitchingItemsRestController { + + private final StitchingOfflineItemDAO stitchingOfflineItemDAO; + + public StitchingItemsRestController(StitchingOfflineItemDAO stitchingOfflineItemDAO) { + this.stitchingOfflineItemDAO = stitchingOfflineItemDAO; + } + + @GetMapping( "/search" ) + public List searchFinishedItems(@RequestParam( "term") String term ){ + return stitchingOfflineItemDAO.findByTerm( term ); + } +} diff --git a/src/main/java/com/utopiaindustries/service/BarcodeService.java b/src/main/java/com/utopiaindustries/service/BarcodeService.java new file mode 100644 index 0000000..d6fda35 --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/BarcodeService.java @@ -0,0 +1,145 @@ +package com.utopiaindustries.service; + +import com.google.zxing.BarcodeFormat; +import com.itextpdf.html2pdf.ConverterProperties; +import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider; +import com.itextpdf.text.*; +import com.itextpdf.text.pdf.*; +import com.utopiaindustries.dao.ctp.BundleDAO; +import com.utopiaindustries.dao.ctp.FinishedItemDAO; +import com.utopiaindustries.dao.ctp.MasterBundleDAO; +import com.utopiaindustries.dao.ctp.StitchingOfflineItemDAO; +import com.utopiaindustries.model.ctp.*; +import com.utopiaindustries.util.BarcodeUtils; +import com.utopiaindustries.util.StringUtils; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class BarcodeService { + + private final BundleDAO bundleDAO; + private final MasterBundleDAO masterBundleDAO; + private final FinishedItemDAO finishedItemDAO; + private final StitchingOfflineItemDAO stitchingOfflineItemDAO; + + public BarcodeService(BundleDAO bundleDAO, MasterBundleDAO masterBundleDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO) { + this.bundleDAO = bundleDAO; + this.masterBundleDAO = masterBundleDAO; + this.finishedItemDAO = finishedItemDAO; + this.stitchingOfflineItemDAO = stitchingOfflineItemDAO; + } + + /* + * generate barcodes here + * */ + public ResponseEntity generateBarcodes(List ids, String artifactType) throws Exception { + String size = BarcodeStickerSize.SIZE_1_75_X_3_5.name(); + BarcodeStickerSize stickerSize = BarcodeStickerSize.getSize(size); + + List list = new ArrayList<>(); + if (StringUtils.compare(artifactType, Bundle.class.getSimpleName())) { + list = bundleDAO.findByIds(ids); + } else if (StringUtils.compare(artifactType, MasterBundle.class.getSimpleName())) { + list = masterBundleDAO.findByIds(ids); + } else if (StringUtils.compare(artifactType, FinishedItem.class.getSimpleName())) { + list = stitchingOfflineItemDAO.findByIds(ids); + } + + // get input stream + ByteArrayInputStream inputStream = null; + // get input stream + inputStream = getInputStream(list, stickerSize, artifactType); + + String headerContentDispositionStr = String.format("%s; filename=%s.pdf", "attachment", artifactType); + // return response + return ResponseEntity + .ok() + .header(HttpHeaders.CONTENT_DISPOSITION, headerContentDispositionStr) + .contentType(MediaType.APPLICATION_PDF) + .body(new InputStreamResource(inputStream)); + + } + + private ByteArrayInputStream getInputStream(List artifacts, + BarcodeStickerSize stickerSize, + String artifactType) throws Exception { + // resource loader + ResourceLoader resourceLoader = new DefaultResourceLoader(); + // output stream + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + // converter properties + ConverterProperties properties = new ConverterProperties(); + properties.setFontProvider(new DefaultFontProvider(false, false, true)); + // generate pdf + Document document = new Document(new Rectangle(stickerSize.getWidth(), stickerSize.getHeight()), stickerSize.getMarginLeft(), stickerSize.getMarginRight(), stickerSize.getMarginTop(), stickerSize.getMarginBottom()); + PdfWriter.getInstance(document, outputStream); + document.open(); + for (InventoryArtifact artifact : artifacts) { + document.newPage(); + // add sku + Paragraph skuPara = new Paragraph(artifact.getSku(), new Font(Font.FontFamily.HELVETICA, stickerSize.getTextSizeSmall(), Font.BOLD)); + skuPara.setAlignment(Element.ALIGN_CENTER); + document.add(skuPara); + + // add barcode image + byte[] imgBytes = BarcodeUtils.getBarcodeImageByteArray(artifact.getBarcode(), BarcodeFormat.CODE_128, stickerSize.getImageWidthBarcode(), stickerSize.getImageHeightBarcode()); + Image image = Image.getInstance(imgBytes); + image.setAlignment(Element.ALIGN_CENTER); + document.add(image); + + Paragraph barcodePara = new Paragraph(artifact.getBarcode(), new Font(Font.FontFamily.HELVETICA, stickerSize.getTextSizeSmall(), Font.BOLD)); + barcodePara.setAlignment(Element.ALIGN_CENTER); + document.add(barcodePara); + // add Artifact mark B / M / F + if ( artifactType.equalsIgnoreCase( Bundle.class.getSimpleName()) ) { + Paragraph artifactPara = new Paragraph(String.format("%s : %d", artifact.getType(), artifact.getId() ), new Font(Font.FontFamily.HELVETICA, stickerSize.getTextSizeExtraSmall(), Font.NORMAL)); + artifactPara.setAlignment(Element.ALIGN_CENTER); + + Paragraph type = new Paragraph(String.valueOf(artifactType.toCharArray()[0]), new Font(Font.FontFamily.HELVETICA, stickerSize.getTextSize(), Font.BOLD)); + type.setAlignment(Element.ALIGN_CENTER); + + // Create a table with 2 columns + PdfPTable table = new PdfPTable(2); + table.setWidthPercentage(100); + table.setWidths(new int[]{55, 45}); // Adjust column widths as needed + + // Add cells to the table + PdfPCell artifactCell = new PdfPCell(artifactPara); + artifactCell.setBorder(Rectangle.NO_BORDER); + artifactCell.setHorizontalAlignment(Element.ALIGN_RIGHT); + artifactCell.setPaddingTop(5); + + PdfPCell typeCell = new PdfPCell(type); + typeCell.setBorder(Rectangle.NO_BORDER); + typeCell.setHorizontalAlignment(Element.ALIGN_LEFT); + + table.addCell(artifactCell); + table.addCell(typeCell); + // Add the table to the document + document.add(table); + + } else { + Paragraph type = new Paragraph(String.valueOf(artifactType.toCharArray()[0]), new Font(Font.FontFamily.HELVETICA, stickerSize.getTextSize(), Font.BOLD)); + type.setAlignment(Element.ALIGN_CENTER); + document.add(type); + } + } + document.close(); + // input stream + return new ByteArrayInputStream(outputStream.toByteArray()); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/service/BundleService.java b/src/main/java/com/utopiaindustries/service/BundleService.java new file mode 100644 index 0000000..c566d42 --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/BundleService.java @@ -0,0 +1,172 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.ctp.*; +import com.utopiaindustries.model.ctp.Bundle; +import com.utopiaindustries.model.ctp.FinishedItem; +import com.utopiaindustries.model.ctp.MasterBundle; +import com.utopiaindustries.model.ctp.StitchingOfflineItem; +import com.utopiaindustries.querybuilder.ctp.BundleQueryBuilder; +import com.utopiaindustries.querybuilder.ctp.FinishedItemQueryBuilder; +import com.utopiaindustries.querybuilder.ctp.MasterBundleQueryBuilder; +import com.utopiaindustries.util.NumberUtils; +import com.utopiaindustries.util.StringUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Service +public class BundleService { + + private final BundleDAO bundleDAO; + private final MasterBundleDAO masterBundleDAO; + private final CryptographyService cryptographyService; + private final FinishedItemDAO finishedItemDAO; + private final StitchingOfflineItemDAO stitchingOfflineItemDAO; + + public BundleService(BundleDAO bundleDAO, MasterBundleDAO masterBundleDAO, CryptographyService cryptographyService, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO) { + this.bundleDAO = bundleDAO; + this.masterBundleDAO = masterBundleDAO; + this.cryptographyService = cryptographyService; + this.finishedItemDAO = finishedItemDAO; + this.stitchingOfflineItemDAO = stitchingOfflineItemDAO; + } + + /* + * find bundles by params + * */ + public List getBundles( String id, String sku, String jobCardId, String masterId,String type, String status, String startDate, String endDate, Long count ){ + List bundles = new ArrayList<>(); + if( count == null ){ + count = 100L; + } + if( StringUtils.isAnyNotNullOrEmpty( id, sku, jobCardId, masterId, type, status, startDate, endDate ) ){ + String query = BundleQueryBuilder.buildQuery( id, sku, jobCardId, masterId, type, status, startDate, endDate , count ); + System.out.println( query ); + bundles = bundleDAO.findByQuery( query ); + } else { + bundles = bundleDAO.findByLimit( count ); + } + return bundles; + } + + /* + * find master bundles by params + * */ + public List getMasterBundles( String id, String jobCardId, String startDate, String endDate, Long count ){ + List bundles = new ArrayList<>(); + if( count == null ){ + count = 100L; + } + if( StringUtils.isAnyNotNullOrEmpty(id, jobCardId, startDate, endDate ) ){ + String query = MasterBundleQueryBuilder.buildQuery( id, jobCardId, startDate, endDate , count ); + System.out.println( query ); + bundles = masterBundleDAO.findByQuery( query ); + } else { + bundles = masterBundleDAO.findByLimit( count ); + } + return bundles; + } + + /* + * find finished Items by params + * */ + public List getFinishedItem(String id, String itemId, String sku, String createdStartDate, String createdEndDate, String jobCardId, Long count ){ + List finishedItems = new ArrayList<>(); + if( count == null ){ + count = 100L; + } + if( StringUtils.isAnyNotNullOrEmpty(id, itemId, sku, createdStartDate, createdEndDate, jobCardId ) ){ + String query = FinishedItemQueryBuilder.buildQuery( id, itemId, sku, createdStartDate, createdEndDate, jobCardId , count ); + System.out.println( query ); + finishedItems = finishedItemDAO.findByQuery( query ); + } else { + finishedItems = finishedItemDAO.findByLimit( count ); + } + return finishedItems; + } + + + /* + * find finished Items by params + * */ + public List getStitchedOfflineItems(String id, String itemId, String sku, String createdStartDate, String createdEndDate, String jobCardId, Long count ){ + List stitchingOfflineItems = new ArrayList<>(); + if( count == null ){ + count = 100L; + } + if( StringUtils.isAnyNotNullOrEmpty(id, itemId, sku, createdStartDate, createdEndDate, jobCardId ) ){ + String query = FinishedItemQueryBuilder.buildQuery( id, itemId, sku, createdStartDate, createdEndDate, jobCardId , count ); + System.out.println( query ); + stitchingOfflineItems = stitchingOfflineItemDAO.findByQuery( query ); + } else { + stitchingOfflineItems = stitchingOfflineItemDAO.findByLimit( count ); + } + return stitchingOfflineItems; + } + + + /* + * + * */ + public List getBundleByIdAndItemIdAndSku( String term ){ + return bundleDAO.findByTerm( term ); + } + + /** + * */ + public List getMasterBundleByIdTerm( String term, boolean isReceived ){ return masterBundleDAO.findByTermAndNotReceived( term , isReceived);} + + /* + * create master bundle and tag to child bundles + * */ + public long createMasterBundle( BundleWrapper wrapper ){ + if( wrapper != null && wrapper.getBundles() != null && ! wrapper.getBundles().isEmpty() ){ + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + long itemId = 0; + String sku = ""; + long jobCardId = 0; + MasterBundle masterBundle = new MasterBundle(); + masterBundle.setCreatedBy( authentication.getName() ); + masterBundle.setCreatedAt( LocalDateTime.now() ); + long id = masterBundleDAO.save( masterBundle ); + masterBundle.setId( id ); + masterBundle.setBarcode( cryptographyService.generateRandomString( 15 ) ); + List newBundles = new ArrayList<>(); + for( Bundle bundle : wrapper.getBundles() ){ + bundle.setMasterBundleId( id ); + newBundles.add( bundle ); + // sku and item in master bundle + if( StringUtils.isNullOrEmpty( sku ) ){ + sku = bundle.getSku(); + } + if( NumberUtils.isNullOrZero( itemId ) ) { + itemId = bundle.getItemId(); + } + if( NumberUtils.isNullOrZero( jobCardId ) ){ + jobCardId = bundle.getJobCardId(); + } + } + masterBundle.setItemId( itemId ); + masterBundle.setSku( sku ); + masterBundle.setJobCardId( jobCardId ); + // save master + masterBundleDAO.save( masterBundle ); + //save child bundles + bundleDAO.saveAll( newBundles ); + return id; + } + return 0; + } + + /* + * find by master id + * */ + public List findBundlesByMasterId( long masterId ){ + return bundleDAO.findByMasterId( masterId ); + } + +} diff --git a/src/main/java/com/utopiaindustries/service/CryptographyService.java b/src/main/java/com/utopiaindustries/service/CryptographyService.java new file mode 100644 index 0000000..858da1a --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/CryptographyService.java @@ -0,0 +1,36 @@ +package com.utopiaindustries.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.Base64; + + +@Service +public class CryptographyService { + + private final Logger logger = LoggerFactory.getLogger(CryptographyService.class.getSimpleName()); + + @Value("${ctp.cipher.key}") + private String cipherKey; + + @Value("${ctp.cipher.seed-value}") + private String seedValue; + + public String generateRandomString( int length ) { + String allowedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + SecureRandom random = new SecureRandom(); + StringBuilder builder = new StringBuilder( length ); + for ( int i = 0; i < length; i++ ) { + int index = random.nextInt( allowedCharacters.length() ); + char randomChar = allowedCharacters.charAt( index ); + builder.append( randomChar ); + } + return builder.toString(); + } + + +} diff --git a/src/main/java/com/utopiaindustries/service/InventoryAccountService.java b/src/main/java/com/utopiaindustries/service/InventoryAccountService.java new file mode 100644 index 0000000..15bf46d --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/InventoryAccountService.java @@ -0,0 +1,126 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.ctp.InventoryAccountDAO; +import com.utopiaindustries.dao.ctp.ProcessDAO; +import com.utopiaindustries.dao.ctp.UserInventoryAccountDAO; +import com.utopiaindustries.dao.uind.LocationSiteDAO; +import com.utopiaindustries.model.ctp.InventoryAccount; +import com.utopiaindustries.model.ctp.Process; +import com.utopiaindustries.model.ctp.UserInventoryAccount; +import com.utopiaindustries.querybuilder.ctp.InventoryAccountQueryBuilder; +import com.utopiaindustries.util.StringUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class InventoryAccountService { + + private final InventoryAccountDAO inventoryAccountDAO; + private final ProcessDAO processDAO; + private final LocationSiteDAO locationSiteDAO; + private final UserInventoryAccountDAO userInventoryAccountDAO; + + public InventoryAccountService(InventoryAccountDAO inventoryAccountDAO, ProcessDAO processDAO, LocationSiteDAO locationSiteDAO, UserInventoryAccountDAO userInventoryAccountDAO) { + this.inventoryAccountDAO = inventoryAccountDAO; + this.processDAO = processDAO; + this.locationSiteDAO = locationSiteDAO; + this.userInventoryAccountDAO = userInventoryAccountDAO; + } + + public List getInventoryAccounts( String id, String title, String active, String createdBy, String startDate, String endDate, + String siteId, Long count, String parentEntityType, String parentEntityId, boolean isPackaging ){ + List accounts = new ArrayList<>(); + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + List userInventoryAccounts = userInventoryAccountDAO.findByUsername( authentication.getName() ); + List userInventoryAccountIds = userInventoryAccounts.stream().map( UserInventoryAccount::getAccountId ).collect(Collectors.toList()); + if( count == null ){ + count = 100L; + } + if( StringUtils.isAnyNotNullOrEmpty( id,title, active, createdBy, startDate, endDate, siteId ) ){ + String query = InventoryAccountQueryBuilder.buildQuery( + id, + title, + active, + createdBy, + startDate, + endDate, + siteId, + count, + userInventoryAccountIds, + parentEntityType, + parentEntityId, + isPackaging + + ); + System.out.println( query ); + accounts = inventoryAccountDAO.findByQuery( query ); + } else { + if( isPackaging ){ + accounts = inventoryAccountDAO.findByIdsAndPackagingAndIdAndLimit( userInventoryAccountIds, count, isPackaging ); + } else { + accounts = inventoryAccountDAO.findByIdsAndParentTypeAndIdAndLimit( userInventoryAccountIds, count, parentEntityType, parentEntityId ); + } + } + return accounts; + } + + public List findInventoryAccounts(){ + List accounts = inventoryAccountDAO.findAll(); + for( InventoryAccount account : accounts ){ + account.setLocationTitle( locationSiteDAO.find( account.getLocationSiteId() ).getTitle() ); + } + return accounts; + } + + public InventoryAccount createNewAccount(){ + // get login user + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + InventoryAccount account = new InventoryAccount(); + account.setCreatedBy( authentication.getName() ); + account.setCreatedAt( LocalDateTime.now() ); + return account; + } + + public void saveAccount( InventoryAccount account ){ + inventoryAccountDAO.save( account ); + } + + public InventoryAccount find( long id ){ + InventoryAccount account = inventoryAccountDAO.find( id ); + account.setLocationTitle( locationSiteDAO.find( account.getLocationSiteId() ).getTitle() ); + return account; + } + + public List getAllProcess(){ + return processDAO.findAll(); + } + + /* + * get all + * */ + public List findInventoryAccounts( long processId ){ + // get list of accounts tagged to user + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + List userInventoryAccounts = userInventoryAccountDAO.findByUsername( authentication.getName() ); + List userInventoryAccountIds = userInventoryAccounts.stream().map( UserInventoryAccount::getAccountId ).collect(Collectors.toList()); + return inventoryAccountDAO.findByIdsAndProcessId( userInventoryAccountIds, processId ); + } + + public List findInventoryAccountsForFinishedItems( ){ + // get list of accounts tagged to user + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + List userInventoryAccounts = userInventoryAccountDAO.findByUsername( authentication.getName() ); + List userInventoryAccountIds = userInventoryAccounts.stream().map( UserInventoryAccount::getAccountId ).collect(Collectors.toList()); + List processIds = new ArrayList<>(); + processIds.add(6L); + processIds.add(7L); + processIds.add(8L); + return inventoryAccountDAO.findByIdsAndProcessIds( userInventoryAccountIds, processIds ); + } +} diff --git a/src/main/java/com/utopiaindustries/service/InventoryArtifactService.java b/src/main/java/com/utopiaindustries/service/InventoryArtifactService.java new file mode 100644 index 0000000..71b02d2 --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/InventoryArtifactService.java @@ -0,0 +1,54 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.ctp.BundleDAO; +import com.utopiaindustries.dao.ctp.FinishedItemDAO; +import com.utopiaindustries.dao.ctp.JobCardDAO; +import com.utopiaindustries.dao.ctp.MasterBundleDAO; +import com.utopiaindustries.model.ctp.Bundle; +import com.utopiaindustries.model.ctp.FinishedItem; +import com.utopiaindustries.model.ctp.MasterBundle; +import org.springframework.stereotype.Service; + +@Service +public class InventoryArtifactService { + + private final BundleDAO bundleDAO; + private final MasterBundleDAO masterBundleDAO; + private final FinishedItemDAO finishedItemDAO; + private final JobCardDAO jobCardDAO; + + public InventoryArtifactService(BundleDAO bundleDAO, MasterBundleDAO masterBundleDAO, FinishedItemDAO finishedItemDAO, JobCardDAO jobCardDAO) { + this.bundleDAO = bundleDAO; + this.masterBundleDAO = masterBundleDAO; + this.finishedItemDAO = finishedItemDAO; + this.jobCardDAO = jobCardDAO; + } + + /* + * get bundle + * */ + public Bundle findBundleById( long id ) { + Bundle bundle = bundleDAO.find( id ); + bundle.setMasterBundle( masterBundleDAO.find( bundle.getMasterBundleId() ) ); + return bundle; + } + + /* + * get master bundle + * */ +// public MasterBundle findMasterBundleById( long id ){ +// MasterBundle masterBundle = masterBundleDAO.find( id ); +// masterBundle.setBundles( bundleDAO.findByMasterId( id ) ); +// masterBundle.setItems( finishedItemDAO.findByMasterId( id ) ); +// return masterBundle; +// } + + /* + * get finished Item + * */ + public FinishedItem findFinishedItemById( long id ){ + FinishedItem finishedItem = finishedItemDAO.find( id ); + finishedItem.setJobCard( jobCardDAO.find( finishedItem.getJobCardId() ) ); + return finishedItem; + } +} diff --git a/src/main/java/com/utopiaindustries/service/InventoryService.java b/src/main/java/com/utopiaindustries/service/InventoryService.java new file mode 100644 index 0000000..2b3b9b6 --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/InventoryService.java @@ -0,0 +1,568 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.ctp.*; +import com.utopiaindustries.model.ctp.*; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class InventoryService { + + private final JobCardItemDAO jobCardItemDAO; + private final CutPieceDAO cutPieceDAO; + private final BundleDAO bundleDAO; + private final InventoryTransactionLegDAO inventoryTransactionLegDAO; + private final InventoryTransactionDAO inventoryTransactionDAO; + private final JobCardDAO jobCardDAO; + private final CryptographyService cryptographyService; + private final MasterBundleDAO masterBundleDAO; + private final FinishedItemDAO finishedItemDAO; + private final StitchingOfflineItemDAO stitchingOfflineItemDAO; + + public InventoryService(JobCardItemDAO jobCardItemDAO, CutPieceDAO cutPieceDAO, BundleDAO bundleDAO, InventoryTransactionLegDAO inventoryTransactionLegDAO, InventoryTransactionDAO inventoryTransactionDAO, JobCardDAO jobCardDAO, CryptographyService cryptographyService, MasterBundleDAO masterBundleDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO) { + this.jobCardItemDAO = jobCardItemDAO; + this.cutPieceDAO = cutPieceDAO; + this.bundleDAO = bundleDAO; + this.inventoryTransactionLegDAO = inventoryTransactionLegDAO; + this.inventoryTransactionDAO = inventoryTransactionDAO; + this.jobCardDAO = jobCardDAO; + this.cryptographyService = cryptographyService; + this.masterBundleDAO = masterBundleDAO; + this.finishedItemDAO = finishedItemDAO; + this.stitchingOfflineItemDAO = stitchingOfflineItemDAO; + } + + + /* + * receive inv from job card + * */ + @Transactional(rollbackFor = Exception.class) + public void receiveJobCardInventory(long jobCardId, long accountId) { + if (jobCardId == 0 || accountId == 0) { + throw new RuntimeException("JobCard | Account can`t be empty"); + } + JobCard jobCard = jobCardDAO.find(jobCardId); + // get job cad items + List items = jobCardItemDAO.findByCardId(jobCardId); + if (items != null && !items.isEmpty()) { + // get job card ite ids + List jobCardItemIds = items.stream() + .map(JobCardItem::getId) + .collect(Collectors.toList()); + + // id to item map + Map idToItemMap = items.stream() + .collect(Collectors.toMap(JobCardItem::getId, Function.identity())); + + Map> piecesMap = cutPieceDAO.findByJobCardItemIds(jobCardItemIds) + .stream() + .collect(Collectors.groupingBy(CutPiece::getJobCardItemId)); + + // populate map + Map> jobCardItemtoPiecesMap = new HashMap<>(); + for (JobCardItem jobCardItem : items) { + if (!jobCardItemtoPiecesMap.containsKey(jobCardItem)) { + jobCardItemtoPiecesMap.put(jobCardItem, piecesMap.getOrDefault(jobCardItem.getId(), new ArrayList<>())); + } + } + + // create + save bundles + List bundles = createBundles(jobCardId, jobCardItemtoPiecesMap); + // create transactions + createTransactions(bundles, accountId, InventoryArtifactType.BUNDLE.name()); + // update job card inv status + jobCard.setInventoryStatus(JobCard.InventoryStatus.RECEIVED.name()); + jobCardDAO.save(jobCard); + } else { + throw new RuntimeException("Items Not found in Job Card"); + } + } + + /* + * t create transactions + * */ + private void createTransactions(List artifacts, long accountId, String parentDocumentType) { + if (!artifacts.isEmpty()) { + InventoryTransaction transaction = createInventoryTransaction("Transaction Against " + parentDocumentType); + for (InventoryArtifact artifact : artifacts) { + InventoryTransactionLeg leg = createInventoryTransactionLeg(transaction, artifact, accountId, InventoryTransactionLeg.Type.IN.name(), parentDocumentType); + } + } + } + + + /* + * create and save transaction + * */ + private InventoryTransaction createInventoryTransaction(String notes) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + InventoryTransaction transaction = new InventoryTransaction(); + transaction.setGeneratedBy(authentication.getName()); + transaction.setTransactionDateTime(LocalDateTime.now()); + transaction.setNotes(notes); + transaction.setId(inventoryTransactionDAO.save(transaction)); + return transaction; + } + + /* + * create and save inventory transaction + * */ + private InventoryTransactionLeg createInventoryTransactionLeg(InventoryTransaction transaction, + InventoryArtifact artifact, + long accountId, + String transactionType, + String parentDocumentType) { + + InventoryTransactionLeg inventoryTransactionLeg = new InventoryTransactionLeg(); + inventoryTransactionLeg.setTransactionId(transaction.getId()); + inventoryTransactionLeg.setType(transactionType); + inventoryTransactionLeg.setQuantity(BigDecimal.valueOf(1L)); + inventoryTransactionLeg.setAccountId((int) accountId); + inventoryTransactionLeg.setItemId(artifact.getItemId()); + inventoryTransactionLeg.setSku(artifact.getSku()); + inventoryTransactionLeg.setParentDocumentType(parentDocumentType); + inventoryTransactionLeg.setParentDocumentId(artifact.getId()); + inventoryTransactionLeg.setParentDocumentPieceType(artifact.getType()); + inventoryTransactionLeg.setTransactionLegDateTime(LocalDateTime.now()); + // set balance + BigDecimal initialBalance = calculateBalance(accountId, artifact.getItemId(), parentDocumentType, artifact.getType()); + + if (transactionType.equalsIgnoreCase(InventoryTransactionLeg.Type.IN.name())) { + initialBalance = initialBalance.add(inventoryTransactionLeg.getQuantity()); + } else { + initialBalance = initialBalance.subtract(inventoryTransactionLeg.getQuantity()); + } + inventoryTransactionLeg.setBalance(initialBalance); + inventoryTransactionLeg.setId(inventoryTransactionLegDAO.save(inventoryTransactionLeg)); + return inventoryTransactionLeg; + } + + + // calculate balance + private BigDecimal calculateBalance(long accountId, long itemId, String parentType, String pieceType) { + // find the last transaction leg of the current account Id with itemId + InventoryTransactionLeg lastTransactionLeg = inventoryTransactionLegDAO.findLastByAccountIdAndItemIdAndParentType(accountId, itemId, parentType, pieceType); + if (lastTransactionLeg.getBalance() != null) { + return lastTransactionLeg.getBalance(); + } + return BigDecimal.ZERO; + } + + + // create bundles from cut pieces + private List createBundles(long jobCardId, Map> jobCardItemtoPiecesMap) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (jobCardItemtoPiecesMap != null && !jobCardItemtoPiecesMap.isEmpty()) { + List bundles = new ArrayList<>(); + for (Map.Entry> entry : jobCardItemtoPiecesMap.entrySet()) { + JobCardItem key = entry.getKey(); + List value = entry.getValue(); + // create bundle against every cut piece + for (CutPiece cutPiece : value) { + Bundle bundle = new Bundle(); + bundle.setItemId(key.getItemId()); + bundle.setSku(key.getSku()); + bundle.setJobCardId(jobCardId); + bundle.setWrapQuantity(cutPiece.getQuantity()); + bundle.setType(cutPiece.getType()); + bundle.setCreatedAt(LocalDateTime.now()); + bundle.setCreatedBy(authentication.getName()); + bundles.add(bundle); + bundle.setId(bundleDAO.save(bundle)); + bundle.setBarcode(cryptographyService.generateRandomString(15)); + // save again after barcode generation + bundle.setId(bundleDAO.save(bundle)); + } + + } + return bundles; + } + return new ArrayList<>(); + } + + + /* + * receive inventory from master barcode + * */ + @Transactional(rollbackFor = Exception.class) + public void receiveInventoryFromMasterBarcode(long masterId, long toAccount) { + if (masterId == 0 || toAccount == 0) { + throw new RuntimeException("Master Barcode | Account can`t be empty"); + } + MasterBundle masterBundle = masterBundleDAO.find(masterId); + // find bundles from master barcode + List bundles = bundleDAO.findByMasterId(masterId); + if (bundles != null && !bundles.isEmpty()) { + // bundle ids + List bundleIds = bundles.stream().map(Bundle::getId).collect(Collectors.toList()); + + Map lastBundleIdInTransactionMap = inventoryTransactionLegDAO + .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), bundleIds, InventoryArtifactType.BUNDLE.name()) + .stream() + .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + + // create Transaction + InventoryTransaction transaction = createInventoryTransaction("Against Movement from Cutting to Stitching"); + inventoryTransactionDAO.save(transaction); + // create transaction legs + for (Bundle bundle : bundles) { + InventoryTransactionLeg lastInvTransaction = lastBundleIdInTransactionMap.getOrDefault(bundle.getId(), null); + if (lastInvTransaction != null) { + // OUT + long fromAccount = lastInvTransaction.getAccountId(); + createInventoryTransactionLeg(transaction, bundle, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.BUNDLE.name()); + // IN + createInventoryTransactionLeg(transaction, bundle, toAccount, InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.BUNDLE.name()); + } + } + // update status + masterBundle.setIsReceived(true); + masterBundleDAO.save(masterBundle); + } + } + + + private void validateItems(List cardItems) { + if (cardItems == null || cardItems.isEmpty()) { + throw new RuntimeException("Item cant be Empty | null"); + } + for (JobCardItem jobCardItem : cardItems) { + int finalQuantity = jobCardItem.getExpectedProductionQuantity().compareTo(jobCardItem.getTotalProduction().add(jobCardItem.getProduction())); + if (finalQuantity < 0) { + throw new RuntimeException(" Items cant be generated because it exceeds from limit of expected Production"); + } + } + } + + private void checkAllBundleAreReceived(long jobCardId, + List jobCardItems) { + + + if (jobCardItems != null && !jobCardItems.isEmpty()) { + List itemIds = jobCardItems.stream().map(JobCardItem::getItemId).collect(Collectors.toList()); + List bundles = bundleDAO.findByItemIdsAndCardId(itemIds, jobCardId); + List masterBundleIds = bundles.stream().map(Bundle::getMasterBundleId).collect(Collectors.toList()); +// Map> ItemIdCardIdToBundlesMap = bundles +// .stream() +// .collect( Collectors.groupingBy( e-> e.getItemId() + "-" + e.getJobCardId() ) ); + + Map idToMasterBundleMap = masterBundleDAO.findByIds(masterBundleIds) + .stream() + .collect(Collectors.toMap(MasterBundle::getId, Function.identity())); + + for (Bundle bundle : bundles) { + // check all bundles are received + MasterBundle masterBundle = idToMasterBundleMap.getOrDefault(bundle.getMasterBundleId(), null); + if (masterBundle == null || !masterBundle.getIsReceived()) { + throw new RuntimeException("Please Receive Bundles Against Master Bundles First to Create Finished Item"); + } + } + } + } + + /* + * create finished items from master bundles + * */ + @Transactional(rollbackFor = Exception.class) + public void createStitchingOfflineItemsFromJobCard(JobCard jobCard) { + List jobCardItems = jobCard.getItems(); + List updatedItems = new ArrayList<>(); + // validate items + validateItems(jobCardItems); + // check whether all bundles are received against finish goods + checkAllBundleAreReceived(jobCard.getId(), jobCardItems); + for (JobCardItem item : jobCardItems) { + // select which has inventory + if (!item.getProduction().equals(BigDecimal.ZERO)) { + // production is completed out bundles + if (item.getExpectedProductionQuantity().compareTo(item.getTotalProduction().add(item.getProduction())) == 0) { + // create out transactions of bundles in master bundles + List bundles = bundleDAO.findByItemIdAndCardId(item.getItemId(), jobCard.getId()); + if (bundles != null && !bundles.isEmpty()) { + // bundle ids + List bundleIds = bundles.stream().map(Bundle::getId).collect(Collectors.toList()); + + Map lastBundleIdInTransactionMap = inventoryTransactionLegDAO + .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), bundleIds, InventoryArtifactType.BUNDLE.name()) + .stream() + .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + // create Transaction + InventoryTransaction transaction = createInventoryTransaction("Against Movement from Stitching to Stitched Offline Item"); + inventoryTransactionDAO.save(transaction); + // create transaction legs + for (Bundle bundle : bundles) { + InventoryTransactionLeg lastInvTransaction = lastBundleIdInTransactionMap.getOrDefault(bundle.getId(), null); + if (lastInvTransaction != null) { + // OUT + long fromAccount = lastInvTransaction.getAccountId(); + createInventoryTransactionLeg(transaction, bundle, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.BUNDLE.name()); + } + } + } + } + // create finished items + List stitchingOfflineItems = createStitchingOfflineItems(item); + // create IN Transactions of Finished Items into account + createTransactions(stitchingOfflineItems, jobCard.getToAccountId(), InventoryArtifactType.STITCHING_OFFLINE.name()); + item.setTotalProduction(item.getTotalProduction().add(item.getProduction())); + item.setJobCardId(jobCard.getId()); + updatedItems.add(item); + } + } + // save all + jobCardItemDAO.saveAll(updatedItems); + } + + /* + * create finished items + * */ + public List createStitchingOfflineItems(JobCardItem jobCardItem) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + List items = new ArrayList<>(); + if (jobCardItem != null) { + for (int i = 1; i <= jobCardItem.getProduction().intValue(); i++) { + StitchingOfflineItem stitchingOfflineItem = new StitchingOfflineItem(); + stitchingOfflineItem.setCreatedAt(LocalDateTime.now()); + stitchingOfflineItem.setCreatedBy(authentication.getName()); + stitchingOfflineItem.setItemId(jobCardItem.getItemId()); + stitchingOfflineItem.setSku(jobCardItem.getSku()); + stitchingOfflineItem.setJobCardId(jobCardItem.getId()); + stitchingOfflineItem.setIsQa(true); + long id = stitchingOfflineItemDAO.save(stitchingOfflineItem); + stitchingOfflineItem.setId(id); + stitchingOfflineItem.setBarcode(cryptographyService.generateRandomString(15)); + stitchingOfflineItemDAO.save(stitchingOfflineItem); + items.add(stitchingOfflineItem); + } + } + return items; + } + + /* + * find transactions by account id + * */ + public List findTransactionByAccountId(long accountId) { + List legs = inventoryTransactionLegDAO.findByAccountId(accountId); + + List tIds = legs.stream().map(InventoryTransactionLeg::getTransactionId).collect(Collectors.toList()); + Map idToTransactioMap = inventoryTransactionDAO.findByIds(tIds).stream().collect(Collectors.toMap(InventoryTransaction::getId, Function.identity())); + legs.forEach(leg -> leg.setTransaction(idToTransactioMap.get(leg.getTransactionId()))); + return legs; + } + + /* + * + * */ + @Transactional(rollbackFor = Exception.class) + public void markFinishedItemsApproved(List fItemIds, long toAccount) { + + if (fItemIds.isEmpty() || toAccount == 0) { + throw new RuntimeException("Finished Item Ids | Account can`t be empty"); + } + + List finishedItems = finishedItemDAO.findByIds(fItemIds); + if (finishedItems != null && !finishedItems.isEmpty()) { + // bundle ids + List finishedItemIds = finishedItems.stream().map(FinishedItem::getId).collect(Collectors.toList()); + + Map lastBundleIdInTransactionMap = inventoryTransactionLegDAO + .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), finishedItemIds, InventoryArtifactType.STITCHING_OFFLINE.name()) + .stream() + .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + + // create Transaction + InventoryTransaction transaction = createInventoryTransaction("Against Movement from Stitching to Packaging After QA"); + inventoryTransactionDAO.save(transaction); + // create transaction legs + for (FinishedItem finishedItem : finishedItems) { + InventoryTransactionLeg lastInvTransaction = lastBundleIdInTransactionMap.getOrDefault(finishedItem.getId(), null); + if (lastInvTransaction != null) { + // OUT + long fromAccount = lastInvTransaction.getAccountId(); + createInventoryTransactionLeg(transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.STITCHING_OFFLINE.name()); + // IN + createInventoryTransactionLeg(transaction, finishedItem, toAccount, InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.STITCHING_OFFLINE.name()); + } + finishedItem.setIsQa(true); + } + finishedItemDAO.saveAll(finishedItems); + } + } + + + /* + * generate finished items against stitched items + * */ + @Transactional(rollbackFor = Exception.class) + public void createFinishedItemsAgainstStitchedItems( StitchedItemWrapper wrapper ) { + if (wrapper.getItems() != null && wrapper.getFinishedAccountId() != 0) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + List stitchingOfflineItems = wrapper.getItems(); + List updatedStitchedItems = new ArrayList<>(); + List finishedItems = new ArrayList<>(); + + List stitchedItemIds = stitchingOfflineItems.stream() + .map(StitchingOfflineItem::getId) + .collect(Collectors.toList()); + + Map lastStitchedIdInTransactionMap = inventoryTransactionLegDAO + .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), stitchedItemIds, InventoryArtifactType.STITCHING_OFFLINE.name()) + .stream() + .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + + // get finished items from stitched items i f exists + List preCreatedFinishedItemIds = finishedItemDAO.findByStitchedItemIds( stitchedItemIds ).stream(). + map( FinishedItem::getId ).collect(Collectors.toList()); + + Map lastFinishedItemInTransactionMap = inventoryTransactionLegDAO + .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), preCreatedFinishedItemIds, InventoryArtifactType.FINISHED_ITEM.name()) + .stream() + .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + + + InventoryTransaction transaction = createInventoryTransaction("Against Movement From Stitching Offline to Finished Item"); + + // generate FI for SI + for (StitchingOfflineItem stitchingOfflineItem : stitchingOfflineItems) { + if (stitchingOfflineItem.getQaStatus().equalsIgnoreCase("APPROVED" )) { + // check finished item is already created + FinishedItem preCreatedItem = finishedItemDAO.findByStitchedItem(stitchingOfflineItem.getId()); + if (preCreatedItem == null) { + FinishedItem finishedItem = new FinishedItem(); + finishedItem.setItemId(stitchingOfflineItem.getItemId()); + finishedItem.setSku(stitchingOfflineItem.getSku()); + finishedItem.setBarcode(stitchingOfflineItem.getBarcode()); + finishedItem.setCreatedBy(authentication.getName()); + finishedItem.setCreatedAt(LocalDateTime.now()); + finishedItem.setStitchedItemId(stitchingOfflineItem.getId()); + finishedItem.setJobCardId(stitchingOfflineItem.getJobCardId()); + finishedItem.setIsQa(false); + finishedItem.setId(finishedItemDAO.save(finishedItem)); + finishedItems.add(finishedItem); + InventoryTransactionLeg lastInvTransaction = lastStitchedIdInTransactionMap.getOrDefault(stitchingOfflineItem.getId(), null); + if ( lastInvTransaction != null ) { + // OUT + long fromAccount = lastInvTransaction.getAccountId(); + createInventoryTransactionLeg(transaction, stitchingOfflineItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.STITCHING_OFFLINE.name()); + } + // update stitched item + stitchingOfflineItem.setIsQa(true); + // if FI is already created + } else { + // create OUT from stitching account Finished Item + InventoryTransactionLeg lastInvTransaction = lastFinishedItemInTransactionMap.getOrDefault( preCreatedItem.getId(), null); + if ( lastInvTransaction != null ) { + // OUT + long fromAccount = lastInvTransaction.getAccountId(); + createInventoryTransactionLeg(transaction, stitchingOfflineItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name()); + } + // create IN in finishing Account Finished Item + finishedItems.add( preCreatedItem ); + } + } + } + for (FinishedItem finishedItem : finishedItems) { + // IN + createInventoryTransactionLeg(transaction, finishedItem, wrapper.getFinishedAccountId(), InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.FINISHED_ITEM.name()); + } + // save updated stitched items + stitchingOfflineItemDAO.saveAll(wrapper.getItems()); + } + } + + + /* + * segregate finish items + * */ + @Transactional(rollbackFor = Exception.class) + public void segregateFinishedItems(FinishedItemWrapper wrapper) { + if (wrapper != null && wrapper.getItems() != null) { + + List items = wrapper.getItems(); + List updatedItems = new ArrayList<>(); + // finished ids + List finishedItemIds = items.stream().map(FinishedItem::getId) + .collect(Collectors.toList()); + // stitched ids + List stitchedItemIds = items.stream().map(FinishedItem::getStitchedItemId) + .collect(Collectors.toList()); + + // create parent doc type last IN transaction map + Map lastFinishedItemIdInTransactionMap = inventoryTransactionLegDAO + .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), finishedItemIds, InventoryArtifactType.FINISHED_ITEM.name()) + .stream() + .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + + // create parent doc type last OUT transaction map + Map lastStitchedItemOutTransactionMap = inventoryTransactionLegDAO + .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.OUT.name(), stitchedItemIds, InventoryArtifactType.STITCHING_OFFLINE.name()) + .stream() + .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + + // create transaction + InventoryTransaction transaction = createInventoryTransaction("Against Segregation of Finished Items"); + + + // create IN and OUT for all approved items + for (FinishedItem finishedItem : items) { + InventoryTransactionLeg lastInvTransaction = lastFinishedItemIdInTransactionMap.getOrDefault(finishedItem.getId(), null); + finishedItem.setIsQa(true); + /* + * item is not approved and washed is selected then item remain in Finishing account + * */ + + /* + * item is approved and alter is selected then finished item will to stitching account + * */ + if (finishedItem.getQaStatus().equalsIgnoreCase("ALTER")) { + // create OUT and IN transactions for FI + if (lastInvTransaction != null) { + // OUT + long fromAccount = lastInvTransaction.getAccountId(); + createInventoryTransactionLeg(transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name()); + // IN + // get the stitching account id + long stitchedItemId = finishedItem.getStitchedItemId(); + InventoryTransactionLeg lastOutTransaction = lastStitchedItemOutTransactionMap.getOrDefault(stitchedItemId, null); + createInventoryTransactionLeg(transaction, finishedItem, lastOutTransaction.getAccountId(), InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.FINISHED_ITEM.name()); + } + } + + /* + * item is approved and grade is selected then fI is move to grade account + */ + if (finishedItem.getQaStatus().equalsIgnoreCase("APPROVED") && finishedItem.getAccountId() != 0) { + // create OUT and IN transactions for FI + if (lastInvTransaction != null) { + // OUT + long fromAccount = lastInvTransaction.getAccountId(); + createInventoryTransactionLeg(transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name()); + // IN + createInventoryTransactionLeg(transaction, finishedItem, finishedItem.getAccountId(), InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.FINISHED_ITEM.name()); + } + finishedItem.setIsSegregated(true); + } + updatedItems.add(finishedItem); + } + finishedItemDAO.saveAll(updatedItems); + // save finish items + } + } + + /* + * find item summary by account + * */ + public List findItemSummaryByAccountId(long accountId) { + return inventoryTransactionLegDAO.findSummaryByAccountId(accountId); + } +} diff --git a/src/main/java/com/utopiaindustries/service/JobCardService.java b/src/main/java/com/utopiaindustries/service/JobCardService.java new file mode 100644 index 0000000..fb9fa24 --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/JobCardService.java @@ -0,0 +1,189 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.ctp.CutPieceDAO; +import com.utopiaindustries.dao.ctp.CutPieceTypeDAO; +import com.utopiaindustries.dao.ctp.JobCardDAO; +import com.utopiaindustries.dao.ctp.JobCardItemDAO; +import com.utopiaindustries.dao.uind.ItemDAO; +import com.utopiaindustries.dao.uind.LocationSiteDAO; +import com.utopiaindustries.dao.uind.PurchaseOrderDAO; +import com.utopiaindustries.model.ctp.CutPiece; +import com.utopiaindustries.model.ctp.CutPieceType; +import com.utopiaindustries.model.ctp.JobCard; +import com.utopiaindustries.model.ctp.JobCardItem; +import com.utopiaindustries.model.uind.Item; +import com.utopiaindustries.util.StringUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class JobCardService { + + private final JobCardDAO jobCardDAO; + private final CutPieceTypeDAO cutPieceTypeDAO; + private final JobCardItemDAO jobCardItemDAO; + private final CutPieceDAO cutPieceDAO; + private final ItemDAO itemDAO; + private final LocationSiteDAO locationSiteDAO; + private final PurchaseOrderDAO purchaseOrderDAO; + + public JobCardService(JobCardDAO jobCardDAO, CutPieceTypeDAO cutPieceTypeDAO, JobCardItemDAO jobCardItemDAO, CutPieceDAO cutPieceDAO, ItemDAO itemDAO, LocationSiteDAO locationSiteDAO, PurchaseOrderDAO purchaseOrderDAO) { + this.jobCardDAO = jobCardDAO; + this.cutPieceTypeDAO = cutPieceTypeDAO; + this.jobCardItemDAO = jobCardItemDAO; + this.cutPieceDAO = cutPieceDAO; + this.itemDAO = itemDAO; + this.locationSiteDAO = locationSiteDAO; + this.purchaseOrderDAO = purchaseOrderDAO; + } + + /* + * search by code + * */ + public List searchJobCards( String term, Boolean filter ){ + List cards = new ArrayList<>(); + if( filter == null || filter ){ + cards = jobCardDAO.findLikeCode( term, + JobCard.InventoryStatus.NOT_RECEIVED_YET.name(), + JobCard.Status.POSTED.name() + ); + } else { + cards = jobCardDAO.findLikeCode( term ); + } + return cards; + } + + + /* + * get cards + * */ + public List getCards() { + return jobCardDAO.findAll(); + } + + /* + * create new job card + * */ + public JobCard createNewJobCard() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + JobCard jobCard = new JobCard(); + jobCard.setCreatedBy( authentication.getName() ); + jobCard.setCreatedAt( LocalDateTime.now() ); + // setting fields + List items = new ArrayList<>(); + List pieces = new ArrayList<>(); + JobCardItem item = new JobCardItem(); + CutPiece cutPiece = new CutPiece(); + pieces.add(cutPiece); + item.setCutPieces(pieces); + items.add(item); + jobCard.setItems(items); + return jobCard; + } + + /* + * save card + * */ + @Transactional( rollbackFor = Exception.class ) + public void save(JobCard jobCard) { + if (jobCard != null && jobCard.getItems() != null) { + long jobCardId = jobCardDAO.save( jobCard ); + jobCard.setId( jobCardId ); + generateCode( jobCard ); + jobCardDAO.save( jobCard ); + // save items + List cutPieces = new ArrayList<>(); + for (JobCardItem item : jobCard.getItems()) { + item.setJobCardId(jobCardId); + long itemId = jobCardItemDAO.save(item); + for (CutPiece cutPiece : item.getCutPieces()) { + cutPiece.setJobCardItemId(itemId); + cutPieces.add(cutPiece); + } + } + // save all pieces + cutPieceDAO.saveAll(cutPieces); + } + } + + + /* + * generate code + * */ + private void generateCode( JobCard card ){ + if( StringUtils.isNullOrEmpty( card.getCode() ) ){ + String code = "JC-" + card.getId() + "-" + card.getCreatedAt().toLocalDate().toString(); + card.setCode( code ); + } + } + + /* + * find card recursively + * */ + public JobCard findCardRecursively(long id) { + JobCard jobCard = jobCardDAO.find(id); + // set po and site titles + jobCard.setPurchaseOrderTitle( purchaseOrderDAO.find( jobCard.getPurchaseOrderId() ).getCode() ); + jobCard.setLocationTitle( locationSiteDAO.find( jobCard.getLocationSiteId() ).getTitle() ); + // set items + List items = jobCardItemDAO.findByCardId(id); + if (items != null && !items.isEmpty()) { + // get job card ite ids + List jobCardItemIds = items.stream() + .map(JobCardItem::getId) + .collect(Collectors.toList()); + + // item Ids + List invItemIds = items.stream() + .map(JobCardItem::getItemId) + .collect(Collectors.toList()); + + Map> piecesMap = cutPieceDAO.findByJobCardItemIds( jobCardItemIds ) + .stream() + .collect(Collectors.groupingBy( CutPiece::getJobCardItemId )); + + Map itemMap = itemDAO.findByIds(invItemIds) + .stream() + .collect(Collectors.toMap(Item::getId, Function.identity())); + + for (JobCardItem item : items) { + item.setCutPieces(piecesMap.getOrDefault(item.getId(), new ArrayList<>())); + item.setTitle(itemMap.getOrDefault(item.getItemId(), new Item()).getTitle()); + } + } + jobCard.setItems(items); + return jobCard; + + } + + + public String deleteJobCardItem(long jobCardItemId) { + cutPieceDAO.deleteByItemId(jobCardItemId); + jobCardItemDAO.delete(jobCardItemId); + return "success"; + } + + public String deleteCutPieceItem( long cutPieceId ){ + cutPieceDAO.delete( cutPieceId ); + return "success"; + } + + + public List getAllPieceTypes() { + return cutPieceTypeDAO.findAll(); + } + + public List getJobCardItems( long jobCardId ){ + return jobCardItemDAO.findByCardId( jobCardId ); + } + +} diff --git a/src/main/java/com/utopiaindustries/service/LocationService.java b/src/main/java/com/utopiaindustries/service/LocationService.java new file mode 100644 index 0000000..7ac019f --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/LocationService.java @@ -0,0 +1,40 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.uind.LocationSiteDAO; +import com.utopiaindustries.model.uind.LocationSite; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class LocationService { + + private final LocationSiteDAO locationSiteDAO; + + public LocationService(LocationSiteDAO locationSiteDAO) { + this.locationSiteDAO = locationSiteDAO; + } + + + public List findAll(){ + return locationSiteDAO.findAll(); + } + + /** + * get site by title + */ + public List getSitesByTitle( String title ) { + try { + List locationSites = locationSiteDAO.findAll(); + return locationSites.stream() + .filter( ent -> ent.getTitle().toLowerCase().matches( String.format( ".*%s.*", title.toLowerCase() ) ) ) + .collect( Collectors.toList() ); + } catch ( Exception e ) { + System.out.println( e ); + } + return new ArrayList<>(); + } + +} diff --git a/src/main/java/com/utopiaindustries/service/ProcessService.java b/src/main/java/com/utopiaindustries/service/ProcessService.java new file mode 100644 index 0000000..d9b358d --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/ProcessService.java @@ -0,0 +1,41 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.controller.ProcessListWrapper; +import com.utopiaindustries.dao.ctp.ProcessDAO; +import com.utopiaindustries.model.ctp.Process; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ProcessService { + + public final ProcessDAO processDAO; + + public ProcessService( ProcessDAO processDAO ) { + this.processDAO = processDAO; + } + + /* + * get all + * */ + public List findAllProcesses(){ + return processDAO.findAll(); + } + + /* + * get processes with wrapper + * */ + public ProcessListWrapper getAllProcessWrapper(){ + ProcessListWrapper processListWrapper = new ProcessListWrapper(); + processListWrapper.setProcesses( processDAO.findAll() ); + return processListWrapper; + } + + /* + * save all + * */ + public void saveAll( ProcessListWrapper processListWrapper ){ + processDAO.saveAll( processListWrapper.getProcesses() ); + } +} diff --git a/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java b/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java new file mode 100644 index 0000000..63ac636 --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java @@ -0,0 +1,21 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.uind.PurchaseOrderDAO; +import com.utopiaindustries.model.uind.PurchaseOrder; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class PurchaseOrderService { + + private final PurchaseOrderDAO purchaseOrderDAO; + + public PurchaseOrderService(PurchaseOrderDAO purchaseOrderDAO) { + this.purchaseOrderDAO = purchaseOrderDAO; + } + + public List findByTerm( String term ){ + return purchaseOrderDAO.findByTerm( term ); + } +} diff --git a/src/main/java/com/utopiaindustries/service/UserService.java b/src/main/java/com/utopiaindustries/service/UserService.java new file mode 100644 index 0000000..25ee323 --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/UserService.java @@ -0,0 +1,157 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.ctp.AuthorityDAO; +import com.utopiaindustries.dao.ctp.InventoryAccountDAO; +import com.utopiaindustries.dao.ctp.UserDAO; +import com.utopiaindustries.dao.ctp.UserInventoryAccountDAO; +import com.utopiaindustries.model.ctp.Authority; +import com.utopiaindustries.model.ctp.InventoryAccount; +import com.utopiaindustries.model.ctp.User; +import com.utopiaindustries.model.ctp.UserInventoryAccount; +import com.utopiaindustries.util.StringUtils; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.provisioning.JdbcUserDetailsManager; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class UserService { + + private final JdbcUserDetailsManager jdbcUserDetailsManager; + private final UserDAO userDAO; + private final AuthorityDAO authorityDAO; + private final UserInventoryAccountDAO userInventoryAccountDAO; + private final InventoryAccountDAO inventoryAccountDAO; + private final BCryptPasswordEncoder bCryptPasswordEncoder; + + + public UserService(JdbcUserDetailsManager jdbcUserDetailsManager, UserDAO userDAO, AuthorityDAO authorityDAO, UserInventoryAccountDAO userInventoryAccountDAO, InventoryAccountDAO inventoryAccountDAO, BCryptPasswordEncoder bCryptPasswordEncoder) { + this.jdbcUserDetailsManager = jdbcUserDetailsManager; + this.userDAO = userDAO; + this.authorityDAO = authorityDAO; + this.userInventoryAccountDAO = userInventoryAccountDAO; + this.inventoryAccountDAO = inventoryAccountDAO; + this.bCryptPasswordEncoder = bCryptPasswordEncoder; + } + + public User createEmptyUser(){ + User user = new User(); + user.setAuthorities( new ArrayList<>() ); + user.setInventoryAccounts( new ArrayList<>() ); + user.setEnabled( true ); + return user; + } + + public List findAllUsers(){ + List users = userDAO.findAll(); + populateRolesAndInventoryAccountInUsers( users ); + return users; + } + + /* + * get user by username + * */ + public User getUser( String username ){ + User user = userDAO.findByUsername( username ); + populateRolesAndInventoryAccountInUsers( Collections.singletonList( user ) ); + return user; + } + + /* + * save user + * */ + @Transactional + public void saveUser( User user ){ + // save user + createUser( user ); + // remove previous + deletePreviousRolesAndAccounts( user ); + // save again + saveUserRolesAndAccounts( user ); + } + + + private void createUser( User user ){ + User newUser = new User(); + newUser.setPassword( bCryptPasswordEncoder.encode( user.getPassword() ) ); + if( ! StringUtils.isNullOrEmpty( user.getNewPassword() )){ + newUser.setPassword( bCryptPasswordEncoder.encode( user.getNewPassword() ) ); + } + newUser.setEnabled( user.getEnabled() ); + newUser.setUsername( user.getUsername() ); + userDAO.save( newUser ); + } + + private void saveUserRolesAndAccounts( User user ){ + List newRoles = user.getAuthorities(); + newRoles.forEach(authority -> authority.setUsername( user.getUsername() )); + List newInventoryAccounts = user.getInventoryAccounts(); + newInventoryAccounts.forEach(account -> account.setUsername( user.getUsername() )); + + // save + authorityDAO.saveAll( newRoles ); + userInventoryAccountDAO.saveAll( newInventoryAccounts ); + } + + private void deletePreviousRolesAndAccounts( User user ){ + List oldRoles = authorityDAO.findByUsername( user.getUsername() ); + // delete + authorityDAO.deleteByUsername( user.getUsername() ); + userInventoryAccountDAO.deleteByUsername( user.getUsername() ); + } + + /* + * populate wrapper + * */ + private void populateRolesAndInventoryAccountInUsers( List users ){ + if( users != null && ! users.isEmpty() ){ + // maps + Map> userInvMap = new HashMap<>(); + Map> userAuthMap = new HashMap<>(); + + List usernames = users.stream() + .map( User::getUsername ) + .collect( Collectors.toList() ); + // get accounts + List inventoryAccounts = userInventoryAccountDAO.findByUsernames( usernames ); + { + // setting titles on inventory accounts + if (!inventoryAccounts.isEmpty()) { + List accountIds = inventoryAccounts + .stream() + .map(UserInventoryAccount::getAccountId) + .collect(Collectors.toList()); + List accounts = inventoryAccountDAO.findByIds(accountIds); + if (!accounts.isEmpty()) { + Map accToTitleMap = accounts.stream() + .collect(Collectors.toMap(InventoryAccount::getId, InventoryAccount::getTitle)); + for (UserInventoryAccount userInventoryAccount : inventoryAccounts) { + userInventoryAccount.setAccountTitle( accToTitleMap.getOrDefault(userInventoryAccount.getAccountId(), "")); + } + } + } + } + + // get roles + List authorities = authorityDAO.findByUsernames( usernames ); + if( ! inventoryAccounts.isEmpty() ){ + userInvMap = inventoryAccounts + .stream() + .collect( Collectors.groupingBy( UserInventoryAccount::getUsername ) ); + } + if( ! authorities.isEmpty() ){ + userAuthMap = authorities + .stream() + .collect( Collectors.groupingBy( Authority::getUsername ) ); + } + // set the fields + for( User user : users ){ + user.setInventoryAccounts( userInvMap.getOrDefault( user.getUsername() , new ArrayList<>()) ); + user.setAuthorities( userAuthMap.getOrDefault( user.getUsername() , new ArrayList<>()) ); + } + } + } +} diff --git a/src/main/java/com/utopiaindustries/util/BarcodeUtils.java b/src/main/java/com/utopiaindustries/util/BarcodeUtils.java new file mode 100644 index 0000000..a331335 --- /dev/null +++ b/src/main/java/com/utopiaindustries/util/BarcodeUtils.java @@ -0,0 +1,144 @@ +package com.utopiaindustries.util; + + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.Writer; +import com.google.zxing.aztec.AztecWriter; +import com.google.zxing.client.j2se.MatrixToImageConfig; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.datamatrix.DataMatrixWriter; +import com.google.zxing.oned.*; +import com.google.zxing.pdf417.PDF417Writer; +import com.google.zxing.qrcode.QRCodeWriter; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Base64; +import java.util.Map; + +public class BarcodeUtils { + + /** + * get qr code byte image array + */ + public static byte[] getQRCodeImageBytesArray( String data, int width, int height ) throws Exception { + // generate bit matrix + QRCodeWriter writer = new QRCodeWriter(); + BitMatrix bitMatrix = writer.encode( data, BarcodeFormat.QR_CODE, width, height ); + // remove whitespace + int padding = 0; + int[] rec = bitMatrix.getEnclosingRectangle(); + int newWidth = rec[2] + 2 * padding; + int newHeight = rec[3] + 2 * padding; + BitMatrix newBitMatrix = new BitMatrix( newWidth, newHeight ); + newBitMatrix.clear(); + for ( int i = 0; i < newWidth; i++ ) { + for ( int j = 0; j < newHeight; j++ ) { + if ( bitMatrix.get(i + rec[0], j + rec[1] ) ) { + newBitMatrix.set( i + padding, j + padding ); + } + } + } + // convert matrix to image + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + MatrixToImageConfig config = new MatrixToImageConfig(); + MatrixToImageWriter.writeToStream( newBitMatrix, "PNG", outputStream, config ); + // convert to byte array and return + byte[] imgData = outputStream.toByteArray(); + outputStream.close(); + return imgData; + } + + /** + * get qr code base64 encoded string + */ + public static String getQRCodeImageBase64Encoded( String data, int width, int height ) throws Exception { + // get image bytes + byte[] imgBytes = getQRCodeImageBytesArray( data, width, height ); + // convert to base64 and return + return Base64.getEncoder().encodeToString( imgBytes ); + } + + /** + * get writer + */ + private static Writer getWriter(BarcodeFormat format ) throws Exception { + if ( format.equals( BarcodeFormat.AZTEC ) ) { + return new AztecWriter(); + } else if ( format.equals( BarcodeFormat.CODABAR ) ) { + return new CodaBarWriter(); + } else if ( format.equals( BarcodeFormat.CODE_39 ) ) { + return new Code39Writer(); + } else if ( format.equals( BarcodeFormat.CODE_93 ) ) { + return new Code93Writer(); + } else if ( format.equals( BarcodeFormat.CODE_128 ) ) { + return new Code128Writer(); + } else if ( format.equals( BarcodeFormat.DATA_MATRIX ) ) { + return new DataMatrixWriter(); + } else if ( format.equals( BarcodeFormat.EAN_8 ) ) { + return new EAN8Writer(); + } else if ( format.equals( BarcodeFormat.EAN_13 ) ) { + return new EAN13Writer(); + } else if ( format.equals( BarcodeFormat.ITF ) ) { + return new ITFWriter(); + } else if ( format.equals( BarcodeFormat.PDF_417 ) ) { + return new PDF417Writer(); + } else if ( format.equals( BarcodeFormat.QR_CODE ) ) { + return new QRCodeWriter(); + } else if ( format.equals( BarcodeFormat.UPC_A ) ) { + return new UPCAWriter(); + } else if ( format.equals( BarcodeFormat.UPC_E ) ) { + return new UPCEWriter(); + } + throw new Exception( "Unsupported barcode format: " + format ); + } + + /** + * get barcode byte array + */ + public static byte[] getBarcodeImageByteArray( String data, BarcodeFormat format, int width, int height ) throws Exception { + try { + Writer barcodeWriter = getWriter( format ); + BitMatrix bitMatrix = barcodeWriter.encode( data, format, width, height ); + // convert matrix to image data + return getBarcodeImageByteArrayData( bitMatrix ); + } catch ( Exception e ) { + System.out.println( e.getMessage() ); + } + return new byte[0]; + } + + public static byte[] getBarcodeImageByteArray( String data, BarcodeFormat format, int width, int height, Map hints ) throws Exception { + try { + Writer barcodeWriter = getWriter( format ); + BitMatrix bitMatrix = barcodeWriter.encode( data, format, width, height, hints ); + // convert matrix to image data + return getBarcodeImageByteArrayData( bitMatrix ); + } catch ( Exception e ) { + e.printStackTrace(); + } + return new byte[0]; + } + + private static byte[] getBarcodeImageByteArrayData( BitMatrix bitMatrix ) throws IOException { + // convert matrix to image + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + MatrixToImageConfig config = new MatrixToImageConfig(); + MatrixToImageWriter.writeToStream( bitMatrix, "PNG", outputStream, config ); + // convert to byte array and return + byte[] imgData = outputStream.toByteArray(); + outputStream.close(); + return imgData; + } + + /** + * generate barcode base64 encoded string + */ + public static String getBarcodeImageBase64Encoded( String data, BarcodeFormat format, int width, int height ) throws Exception { + byte[] imgData = getBarcodeImageByteArray( data, format, width, height ); + // convert to base64 and return + return Base64.getEncoder().encodeToString( imgData ); + } +} diff --git a/src/main/java/com/utopiaindustries/util/CTPDateTimeFormat.java b/src/main/java/com/utopiaindustries/util/CTPDateTimeFormat.java new file mode 100644 index 0000000..cc78a09 --- /dev/null +++ b/src/main/java/com/utopiaindustries/util/CTPDateTimeFormat.java @@ -0,0 +1,287 @@ +package com.utopiaindustries.util; + +import com.utopiaindustries.model.Granularity; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.time.temporal.WeekFields; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.stream.Collectors; + +public class CTPDateTimeFormat { + // https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html + // generic format for date + public static final String DATE_FORMAT = "M/d/yyyy"; + // generic format for datetime + public static final String DATE_TIME_FORMAT = "M/d/yyyy HH:mm:ss"; + // format for bank statements + public static final String BANK_STATEMENT_DATE_FORMAT = "d/M/yyyy"; + // mysql datetime format (mysql stores in this format) + public static final String MYSQL_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + // date time format for file names + public static final String FILENAME_DATETIME_FORMAT = "yyyy-MM-dd--HH-mm-ss"; + // mysql date format (mysql stores in this format) + public static final String MYSQL_DATE_FORMAT = "yyyy-MM-dd"; + // output format for date in templates + public static final String TEMPLATE_DATE_FORMAT = "MMM dd, yyyy"; + // output format for datetime in templates + public static final String TEMPLATE_DATE_TIME_FORMAT = "MMM dd, yyyy hh:mm a"; + // html5 input date format + public static final String HTML5_DATE_INPUT_FORMAT = "yyyy-MM-dd"; + // html5 input datetime format + public static final String HTML5_DATETIME_INPUT_FORMAT = "yyyy-MM-dd'T'HH:mm"; + public static final String HTML5_DATETIME_INPUT_FORMAT_WITH_SECONDS = "yyyy-MM-dd'T'HH:mm:ss"; + // html5 input time format + public static final String HTML5_TIME_INPUT_FORMAT = "HH:mm"; + // html5 input time format + public static final String HTML5_TIME_INPUT_FORMAT_ATTENDANCE = "hh:mm a"; + // email Date Format + public static final String EMAIL_ATTENDANCE_DATE_FORMAT = "MMM dd"; + // probation email date format + public static final String EMAIL_PROBATION_DATE_FORMAT = "dd/MM/yyyy"; + //month year date format + public static final String MONTH_YEAR_DATE_FORMAT = "MMM-yyyy"; + // voc date format + public static final String VOC_DATETIME_INPUT_FORMAT_WITH_SECONDS = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; + // reviews date format + public static final String REVIEWS_DATETIME_INPUT_FORMAT_WITH_SECONDS = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + public static final String HTML5_MONTH_YEAR_FORMAT = "yyyy-MM"; + + /** + * parse date with format + */ + public static LocalDate getParsedDate( String date, String format ) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern( format ); + return LocalDate.parse( date, formatter ); + } + + /** + * parse date with format + */ + public static LocalDateTime getParsedDateTime( String date, String format ) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern( format ); + return LocalDateTime.parse( date, formatter ); + } + + /** + * format localdatetime into a given format string + */ + public static String getFormattedDateTimeString( LocalDateTime dateTime, String dateTimeFormat ) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern( dateTimeFormat ); + return dateTime.format( formatter ); + } + + /** + * format localdate into a given format string + */ + public static String getFormattedDateString( LocalDate dateTime, String dateTimeFormat ) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern( dateTimeFormat ); + return dateTime.format( formatter ); + } + + + /** + * format string/localdate to mysql date format string + */ + public static String getMySQLFormattedDateString( String date, String currentFormat ) { + String formattedDate = null; + if ( ! StringUtils.isNullOrEmpty( date ) ) { + DateTimeFormatter dtf = DateTimeFormatter.ofPattern( currentFormat ); + LocalDate localDate = LocalDate.parse( date, dtf ); + formattedDate = localDate.format( DateTimeFormatter.ofPattern( CTPDateTimeFormat.MYSQL_DATE_FORMAT ) ); + } + return formattedDate; + } + + /** + * get mysql formatted date time string + */ + public static String getMySQLFormattedDateTimeString( LocalDateTime dateTime ) { + String formattedDate = null; + if ( dateTime != null ) { + formattedDate = dateTime.format( DateTimeFormatter.ofPattern( CTPDateTimeFormat.MYSQL_DATETIME_FORMAT ) ); + } + return formattedDate; + } + + /** + * format string/localdate to mysql date format string + */ + public static String getMySQLFormattedDateString( String date ) { + return getMySQLFormattedDateString( date, CTPDateTimeFormat.MYSQL_DATE_FORMAT ); + } + + public static String getMySQLFormattedDateString( LocalDate date ) { + String formattedDate = null; + if ( date != null ) { + formattedDate = date.format( DateTimeFormatter.ofPattern( CTPDateTimeFormat.MYSQL_DATE_FORMAT ) ); + } + return formattedDate; + } + + public static String getDateFormat( LocalDate localDate, String format ){ + String formattedDate = null; + if ( localDate != null ) { + formattedDate = localDate.format( DateTimeFormatter.ofPattern( format ) ); + } + return formattedDate; + } + + public static String getTimeFormat( LocalTime localTime, String format ) { + String formattedTime = null; + if ( localTime != null ) { + formattedTime = localTime.format( DateTimeFormatter.ofPattern( format ) ); + } + return formattedTime; + } + + public static String[] getMonths() { + return new String[] {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", + "November", "December"}; + } + + /** + * get fiscal year + */ + public static String getFiscalYearForDate( LocalDate date ) { + String year = date.format( DateTimeFormatter.ofPattern( "yy" ) ); + if ( date.getMonthValue() <= 6 ) { + int previousYear = Integer.parseInt( year ) - 1; + return previousYear + year; + } else { + int nextYear = Integer.parseInt( year ) + 1; + return year + nextYear; + } + } + + /** + * get number of days in month of the year + */ + public static int getNumberOfDaysInMonthYear( LocalDate date ) { + YearMonth yearMonth = YearMonth.of( date.getYear(), date.getMonthValue() ); + return yearMonth.lengthOfMonth(); + } + + /** + * get date range + */ + public static List getDateRange( LocalDate startDate, LocalDate endDate ) { + long daysBetween = ChronoUnit.DAYS.between( startDate, endDate ); + List dateRange = new ArrayList<>(); + for ( int i = 0; i <= daysBetween; i++ ) { + dateRange.add( startDate.plusDays( i ) ); + } + return dateRange; + } + + /** + * get date range by granularity + */ + public static List getDateRangeByGranularity( LocalDate startDate, LocalDate endDate, String granularity ) { + if ( granularity.equalsIgnoreCase( Granularity.DAILY.name() ) ) { + return getDateRange( startDate, endDate ); + } else if ( granularity.equalsIgnoreCase( Granularity.WEEKLY.name() ) ) { + long daysBetween = ChronoUnit.DAYS.between( startDate, endDate ); + List dateRange = new ArrayList<>(); + for ( int i = 0; i < daysBetween; i++ ) { + LocalDate date = startDate.plusDays( i ).with( WeekFields.of( Locale.getDefault() ).getFirstDayOfWeek() ); + if ( ! dateRange.contains( date ) ) { + dateRange.add( date ); + } + } + return dateRange; + } else if ( granularity.equalsIgnoreCase( Granularity.MONTHLY.name() ) ) { + long daysBetween = ChronoUnit.DAYS.between( startDate, endDate ); + List dateRange = new ArrayList<>(); + for ( int i = 0; i < daysBetween; i++ ) { + LocalDate date = startDate.plusDays( i ).withDayOfMonth( 1 ); + if ( ! dateRange.contains( date ) ) { + dateRange.add( date ); + } + } + return dateRange; + } else if ( granularity.equalsIgnoreCase( Granularity.YEARLY.name() ) ) { + long daysBetween = ChronoUnit.DAYS.between( startDate, endDate ); + List dateRange = new ArrayList<>(); + for ( int i = 0; i < daysBetween; i++ ) { + LocalDate date = startDate.plusDays( i ).withDayOfYear( 1 ); + if ( ! dateRange.contains( date ) ) { + dateRange.add( date ); + } + } + return dateRange; + } + return new ArrayList<>(); + } + + /** + * get date wrt granularity + */ + public static LocalDate getDateByGranularity( LocalDate date, String granularity ) { + if ( granularity.equalsIgnoreCase( Granularity.DAILY.name() ) ) { + return date; + } else if ( granularity.equalsIgnoreCase( Granularity.WEEKLY.name() ) ) { + return date.with( WeekFields.of( Locale.getDefault() ).getFirstDayOfWeek() ); + } else if ( granularity.equalsIgnoreCase( Granularity.MONTHLY.name() ) ) { + return date.withDayOfMonth( 1 ); + } else if ( granularity.equalsIgnoreCase( Granularity.YEARLY.name() ) ) { + return date.withDayOfYear( 1 ); + } + return date; + } + + public static List getDateRangeMonthly( LocalDate startDate, LocalDate endDate ) { + long daysBetween = ChronoUnit.DAYS.between( startDate, endDate ); + List dateRange = new ArrayList<>(); + for ( int i = 0; i <= daysBetween; i++ ) { + LocalDate date = startDate.plusDays( i ).withDayOfMonth( 1 ); + if ( ! dateRange.contains( date ) ) { + dateRange.add( date ); + } + } + return dateRange; + } + + /** + * convert date to localdate + */ + public static LocalDate convertDateToLocalDate( Date date ) { + return date.toInstant() + .atZone( ZoneId.systemDefault() ) + .toLocalDate(); + } + + /** + * convert local date to date + */ + public static Date convertLocalDateToDate( LocalDate date ) { + return Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()); + } + + /** + * convert local date list to date list + */ + public static List convertListOfLocalDateToListOfDate(List localDateList) { + return localDateList.stream() + .map(CTPDateTimeFormat::convertLocalDateToDate) + .collect(Collectors.toList()); + } + + /** + * + * @param date + * @param startDate + * @param endDate + * @comment check date between range + * @return + */ + public static boolean isDateInRange(LocalDate date, LocalDate startDate, LocalDate endDate) { + return !date.isBefore(startDate) && !date.isAfter(endDate); + } + +} + diff --git a/src/main/java/com/utopiaindustries/util/KeyHolderFunctions.java b/src/main/java/com/utopiaindustries/util/KeyHolderFunctions.java new file mode 100644 index 0000000..65fc517 --- /dev/null +++ b/src/main/java/com/utopiaindustries/util/KeyHolderFunctions.java @@ -0,0 +1,19 @@ +package com.utopiaindustries.util; + +import org.springframework.jdbc.support.KeyHolder; + +import java.math.BigInteger; +import java.util.Objects; + +public class KeyHolderFunctions { + public static long getKey( long entityId, KeyHolder keyHolder ) { + if (keyHolder.getKeyList().isEmpty()) { + return entityId; + } else if ( keyHolder.getKeyList().size() == 1 ) { + return Objects.requireNonNull(keyHolder.getKey()).longValue(); + } else { + BigInteger key = ( BigInteger ) keyHolder.getKeyList().get( 0 ).get( "GENERATED_KEY" ); + return key.longValue(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/util/MySQLUtils.java b/src/main/java/com/utopiaindustries/util/MySQLUtils.java new file mode 100644 index 0000000..6ef1468 --- /dev/null +++ b/src/main/java/com/utopiaindustries/util/MySQLUtils.java @@ -0,0 +1,43 @@ +package com.utopiaindustries.util; + +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class MySQLUtils { + private static final HashMap sqlTokens; + private static Pattern sqlTokenPattern; + + static { + //MySQL escape sequences: http://dev.mysql.com/doc/refman/5.1/en/string-syntax.html + String[][] search_regex_replacement = new String[][] { + //search string search regex sql replacement regex + { "\u0000" , "\\x00" , "\\\\0" }, + { "'" , "'" , "\\\\'" }, + { "\"" , "\"" , "\\\\\"" }, + { "\b" , "\\x08" , "\\\\b" }, + { "\n" , "\\n" , "\\\\n" }, + { "\r" , "\\r" , "\\\\r" }, + { "\t" , "\\t" , "\\\\t" }, + { "\u001A" , "\\x1A" , "\\\\Z" }, + { "\\" , "\\\\" , "\\\\\\\\" } + }; + sqlTokens = new HashMap(); + String patternStr = ""; + for ( String[] srr : search_regex_replacement ) { + sqlTokens.put( srr[0], srr[2] ); + patternStr += ( patternStr.isEmpty() ? "" : "|" ) + srr[1]; + } + sqlTokenPattern = Pattern.compile( '(' + patternStr + ')' ); + } + + public static String escapeString( String s ) { + Matcher matcher = sqlTokenPattern.matcher( s ); + StringBuffer sb = new StringBuffer(); + while ( matcher.find() ) { + matcher.appendReplacement( sb, sqlTokens.get( matcher.group( 1 ) ) ); + } + matcher.appendTail( sb ); + return sb.toString(); + } +} diff --git a/src/main/java/com/utopiaindustries/util/NumberUtils.java b/src/main/java/com/utopiaindustries/util/NumberUtils.java new file mode 100644 index 0000000..115e708 --- /dev/null +++ b/src/main/java/com/utopiaindustries/util/NumberUtils.java @@ -0,0 +1,225 @@ +package com.utopiaindustries.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.ibm.icu.text.RuleBasedNumberFormat; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +public class NumberUtils { + + /** + * add padding of specified size to a number + */ + public static String addPaddingZeros( long num, long paddingSize ) { + return String.format( "%0" + paddingSize + "d", num ); + } + + /** + * add a number into null value + */ + public static Float addToNull( Float num1, float num2 ) { + return ( num1 == null ) ? ( num2 ) : ( num1 + num2 ); + } + + /** + * subtract a number from null value + */ + public static Float subtractFromNull( Float num1, float num2 ) { + return ( num1 == null ) ? ( 0 ) : ( num1 - num2 ); + } + + /** + * check if null or zero + */ + public static boolean isNullOrZero( Long number ) { + return ( number == null || number == 0 ); + } + + public static boolean isNullOrZero( Integer number ) { + return ( number == null || number == 0 ); + } + + /** + * check if any not null or zero + */ + public static boolean isAnyNotNullOrZero( Long... numbers ) { + boolean isAnyNotNullOrZero = false; + for ( Long number : numbers ) { + isAnyNotNullOrZero = isAnyNotNullOrZero || ( ! isNullOrZero( number ) ); + } + return isAnyNotNullOrZero; + } + + /** + * is any null + */ + public static boolean isAnyNull( Long... numbers ) { + // check if any null + for ( Long number : numbers ) { + if ( number == null ) { + return true; + } + } + return false; + } + + /** + * format decimal places upto given places + */ + public static float formatDecimalPlace( double number, int places ) { + int factor = ( int ) Math.pow( 10, places ); + return ( float ) Math.floor( number * factor ) / factor; + } + + /** + * round decimal and format upto given places + */ + public static float roundAndFormatDecimal( double number, int places ) { + int factor = ( int ) Math.pow( 10, places ); + return ( float ) Math.round( number * factor ) / factor; + } + + //check if an object is null or empty + public static boolean isNullOrEmpty(Object obj) { + if (obj == null) { + return true; + } else + return false; + } + + //long to int + public static int longToInt(long number) { + return ( ( int ) number ); + } + + //Long list to Long array + public static Long[] longListToLongArray( List longList ) { + if( longList != null ) { + Long[] longArray = new Long[ longList.size() ]; + return longList.toArray( longArray ); + } + return new Long[0]; + } + + //Long Set to Long array + public static Long[] longSetToLongArray( Set longSet ) { + if( longSet != null ) { + Long[] longArray = new Long[ longSet.size() ]; + return longSet.toArray( longArray ); + } + return new Long[0]; + } + + // number to words + public static String numberToWords( BigDecimal value ) { + RuleBasedNumberFormat ruleBasedNumberFormat = new RuleBasedNumberFormat( new Locale( "EN", "US" ), RuleBasedNumberFormat.SPELLOUT ); + return ruleBasedNumberFormat.format( value ); + } + + /** + * convert JSON to Long list + */ + public static List JsonToLongList( String body ) { + ObjectMapper objectMapper = new ObjectMapper(); + List longList = new ArrayList(); + + //JSON to Long list + try { + longList = objectMapper.readValue( body, new TypeReference>(){} ); + } catch ( JsonProcessingException e ) { + e.printStackTrace(); + } + + return longList; + } + + /** + * String to long + */ + public static long stringToLong( String string ) { + if( !StringUtils.isNullOrEmpty( string ) ) { + try { + return Long.parseLong( string ); + } + catch( Exception e ) { + } + } + return 0; + } + + /** + * String to wrapper long + */ + public static Long stringToWrapperLong( String string ) { + if( !StringUtils.isNullOrEmpty( string ) ) { + try { + return Long.parseLong( string ); + } + catch( Exception e ) { + } + } + return null; + } + + /* + * is Negative number + * */ + public static boolean isNegative (long number){ return number < 0 ; } + + public static String getCommaSeparatedNumberString( float number ) { + String numberString = String.valueOf( number ); + StringBuilder formattedNumber = new StringBuilder( numberString ); + for( int i = numberString.indexOf( "." ) - 3; i > 0; i = i - 3 ) { + formattedNumber.insert( i, "," ); + } + // if string ends with '.0', delete '.0' + if( formattedNumber.length() - 2 > 0 && + formattedNumber.charAt( formattedNumber.length() - 2 ) == '.' && + formattedNumber.charAt( formattedNumber.length() - 1 ) == '0' ) { + formattedNumber.delete( formattedNumber.length() - 2, formattedNumber.length() ); + } + return formattedNumber.toString(); + } + + /** + * is valid long + */ + public static boolean isValidLong( String code ) { + try { + Long.parseLong( code ); + } catch ( NumberFormatException e ) { + return false; + } + return true; + } + + // truncate number upto decimal places + public static float truncateNumber( float value , int places ){ + BigDecimal bd = new BigDecimal( Float.toString( value ) ); + return bd.setScale( places, BigDecimal.ROUND_DOWN ).floatValue(); + } + + public static Float roundOffNumberToTwoPlaces( Float value ){ + if (value >= 0.0f && value < 1.0f && hasMoreThanTwoDecimalPlaces( value )) { + value = 0.0f; + } else { + value = Math.round(value * 100.0f) / 100.0f; + } + if (value != 0.0f && value % 1 == 0) { + value = Math.round(value * 10.0f) / 10.0f; + } + return value; + } + + // Helper to check if the value has more than two decimal places + private static boolean hasMoreThanTwoDecimalPlaces(float value) { + float scaledValue = Math.abs(value) * 100.0f; + return scaledValue != (float) Math.round(scaledValue); + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/util/StringUtils.java b/src/main/java/com/utopiaindustries/util/StringUtils.java new file mode 100644 index 0000000..5a130a5 --- /dev/null +++ b/src/main/java/com/utopiaindustries/util/StringUtils.java @@ -0,0 +1,513 @@ +package com.utopiaindustries.util; + + +import java.util.*; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class StringUtils { + + /** + * is null or empty + */ + public static boolean isNullOrEmpty(String str) { + return str == null || str.isEmpty(); + } + + public static boolean isNotNullAndNotEmpty(String str) { + return str != null && !str.isEmpty(); + } + + public static boolean isAnyNotZero(String... args) { + boolean isAnyNotZero = false; + for (String str : args) { + isAnyNotZero = isAnyNotZero || isNullEmptyOrZero(str); + } + return isAnyNotZero; + } + + /** + * is any string not null or empty + */ + public static boolean isAnyNotNullOrEmpty(String... strings) { + boolean isAnyNotNullOrEmpty = false; + for (String str : strings) { + isAnyNotNullOrEmpty = isAnyNotNullOrEmpty || (!isNullOrEmpty(str)); + } + return isAnyNotNullOrEmpty; + } + + /** + * are all string null or empty + */ + public static boolean areAllNullOrEmpty(String... strings) { + for (String str : strings) { + if (!isNullOrEmpty(str)) { + return false; + } + } + return true; + } + + public static boolean areAllNotNullAndNotEmpty(String... strings) { + boolean flag = false; + for (String str : strings) { + if (isNotNullAndNotEmpty(str)) { + flag = true; + } else { + flag = false; + } + } + return flag; + } + + /** + * replace last instance of "toReplace" with "replacement" + */ + public static String replaceLast(String string, String toReplace, String replacement) { + int pos = string.lastIndexOf(toReplace); + if (pos > -1) { + return string.substring(0, pos) + + replacement + + string.substring(pos + toReplace.length()); + } else { + return string; + } + } + + /** + * reverse string + */ + public static String reverseString(String input) { + StringBuilder backwards = new StringBuilder(); + for (int i = 0; i < input.length(); i++) { + backwards.append(input.charAt(input.length() - 1 - i)); + } + return backwards.toString(); + } + + /** + * format values for MySQL's MATCH/AGAINST phrase + */ + public static String formatAgainstPhraseValues(String vals, String operator) { + // convert to array and prepend "+" + String[] valArr = vals.split(" "); + for (int i = 0; i < valArr.length; i++) { + valArr[i] = operator + valArr[i].trim(); + } + // join by space and return + return String.join(" ", valArr); + } + + /** + * String to float conversion + */ + public static float stringToFloat(String string) { + try { + return Float.parseFloat(string); + } catch (Exception ex) { + return 0.0f; + } + } + + /** + * String to double conversion + */ + public static double strToDouble(String inStr) { + try { + return Double.parseDouble(inStr); + } catch (Exception ex) { + return 0; + } + } + + /** + * String to long conversion + */ + public static long strToLong(String inStr) { + try { + return Long.parseLong(inStr); + } catch (Exception ex) { + return 0; + } + } + + /** + * Compare strings + */ + public static boolean compare(String str1, String str2) { + return str1 != null && str2 != null && str1.equalsIgnoreCase(new String(str2)); + } + + /** + * make like for sql query + */ + public static String makeLikeForSql(String text) { + String likeText = null; + if (!StringUtils.isNullOrEmpty(text)) { + likeText = "%" + text + "%"; + } + return likeText; + } + + /** + * make start date time by date string + */ + public static String makeStartDateTimeByDateString(String startDate) { + String startDateTime = null; + if (!StringUtils.isNullOrEmpty(startDate)) { + startDateTime = startDate + " 00:00:00"; + } + return startDateTime; + } + + /** + * make end date time by date string + */ + public static String makeEndDateTimeByDateString(String endDate) { + String endDateTime = null; + if (!StringUtils.isNullOrEmpty(endDate)) { + endDateTime = endDate + " 23:59:59"; + } + return endDateTime; + } + + /** + * make type empty string for all and default + */ + public static String getWeightScaleType(String weightScaleType) { + if (StringUtils.isNullOrEmpty(weightScaleType)) { + return ""; + } else if (StringUtils.compare(weightScaleType, "ALL")) { + return ""; + } else { + return weightScaleType; + } + } + + public static String getVehicleRequestCode(String vehicleRequestCode) { + if (StringUtils.isNullOrEmpty(vehicleRequestCode)) { + return ""; + } else { + return vehicleRequestCode; + } + } + + + /** + * make end date time by date string + */ + public static String replaceAt(String str, int afterCharNo, String charToReplace) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < str.length(); i++) { + if (i > 0 && (i % afterCharNo == 0)) { + sb.append(charToReplace); + } + sb.append(str.charAt(i)); + } + return sb.toString(); + } + + + // 92333569974 -> 0333 5699744 + public static String getNumberStartWithZero(String number) { + if (isNullOrEmpty(number)) { + return "-"; + } + StringBuilder numberString = new StringBuilder(number); + // if number starts with 9 + if (numberString.charAt(0) == '9') { + + numberString.replace(0, 2, "0"); + + if (numberString.charAt(1) == '-') + numberString.deleteCharAt(1); + if (numberString.charAt(4) == '-') + numberString.deleteCharAt(4); + } + // if number starts with + + else if (numberString.charAt(0) == '+') { + numberString.replace(0, 3, "0"); + if (numberString.charAt(1) == '-') + numberString.deleteCharAt(1); + if (numberString.charAt(4) == '-') + numberString.deleteCharAt(4); + } + numberString.insert(4, " "); + return numberString.toString(); + } + + // 0333 5699744 -> 92333569974 + public static String getNumberStartWithNonZero(String number) { + if (isNullOrEmpty(number)) { + return "-"; + } + number = number.split(",")[0]; + number = number.replaceAll("\\s+", ""); + StringBuilder numberString = new StringBuilder(number); + if (numberString.charAt(0) == '0') { + numberString.replace(0, 1, "92"); + } + if (numberString.length() >= 6 && numberString.charAt(5) == '-') { + numberString.replace(5, 6, ""); + } + return numberString.toString(); + } + + public static String formatNumber(String number) { + if (isNullOrEmpty(number)) { + return "-"; + } + number = number.replaceAll("\\s+", ""); + number = number.replaceAll("-", ""); + StringBuilder numberString = new StringBuilder(number); + if (numberString.charAt(0) == '0') { + numberString.replace(0, 1, "92"); + } else if (numberString.charAt(0) == '+') { + numberString.replace(0, 1, ""); + } + + return numberString.toString(); + } + + public static String padString(String string, int maxLength) { + String str = ""; + int numChar = maxLength - string.length(); + if (numChar > 0) { + for (int i = 0; i < numChar; i++) + str += " "; + str += string.toString().toUpperCase(Locale.ROOT); + return str; + } else { + return string.toString().toUpperCase(Locale.ROOT).substring(0, 45); + } + + } + + /** + * create code from title + */ + public static String createCode(String title) { + return title.trim().toUpperCase().replaceAll("\\s+", "_"); + } + + /** + * get comma separated items array, without spaces + */ + public static String[] getArrayFromCommaSeparatedString(String commaSeparatedItems) { + if (!StringUtils.isNullOrEmpty(commaSeparatedItems)) { + return commaSeparatedItems.split("\\s*,\\s*"); + } + return new String[0]; + } + + public static Set getLongListFromCommaSeparatedString(String commaSeparatedItems) { + if (!StringUtils.isNullOrEmpty(commaSeparatedItems)) { + String[] strs = commaSeparatedItems.split("\\s*,\\s*"); + return Arrays.stream(strs).map(Long::parseLong).collect(Collectors.toSet()); + } + return new HashSet<>(); + } + + + /** + * String array to Long array + */ + public static Long[] stringArrayToLongArray(String[] strArray) { + if (strArray != null) { + Long[] longArray = new Long[strArray.length]; + for (int i = 0; i < strArray.length; i++) { + longArray[i] = strToLong(strArray[i]); + } + return longArray; + } + return new Long[0]; + } + + public static String encodeEmail(String email) { + int length = email.length(); + if (length == 0) { + return ""; + } else { + StringBuilder str = new StringBuilder(email); + int startIndex = 2; + int endIndex = length - 3; + for (int start = startIndex; start < endIndex - startIndex - 1; start++) { + str.insert(start, "*"); + str.deleteCharAt(start + 1); + } + return str.toString(); + } + + } + + /** + * get comma separated string from long list + */ + public static String getCommaSeparatedString(List items) { + StringBuilder stringBuilder = new StringBuilder(); + if (items != null) { + for (int i = 0; i < items.size(); i++) { + if (i < items.size() - 1) { + stringBuilder.append(items.get(i) + ","); + } else { + stringBuilder.append(items.get(i)); + } + } + } + return stringBuilder.toString(); + } + + /** + * get comma separated string from long Set + */ + public static String getCommaSeparatedString(Set items) { + if (items != null) { + return getCommaSeparatedString(new ArrayList(items)); + } + return ""; + } + + /* + * is str is null or 0 + * */ + public static boolean isNullEmptyOrZero(String str) { + return str == null || str.isEmpty() || Long.parseLong(str) == 0; + } + + /** + * get Set from comma separated string + */ + public static Set getSetFromCommaSeparatedString(String string) { + String[] array = getArrayFromCommaSeparatedString(string); + if (array != null) { + return new HashSet(Arrays.asList(array)); + } + return new HashSet<>(); + } + + /** + * String Set to Long Set + */ + public static Set getLongSet(Set stringSet) { + Set longSet = new HashSet<>(); + if (stringSet != null) { + for (String string : stringSet) { + longSet.add(NumberUtils.stringToLong(string)); + } + } + return longSet; + } + + /** + * replace dashes & spaces + */ + public static String replaceDashesSpaces(String str) { + return str.replaceAll("-", "").replaceAll("\\s+", ""); + } + + /** + * is valid email + */ + public static boolean isValidEmail(String email) { + if (isNullOrEmpty(email)) { + return false; + } + Pattern pattern = Pattern.compile("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"); + return pattern.matcher(email).matches(); + } + + public static boolean containsIgnoreCase(CharSequence str, CharSequence searchStr) { + if (str != null && searchStr != null) { + int len = searchStr.length(); + int max = str.length() - len; + + for (int i = 0; i <= max; ++i) { + if (regionMatches(str, true, i, searchStr, 0, len)) { + return true; + } + } + return false; + } else { + return false; + } + } + + private static boolean regionMatches(CharSequence cs, boolean ignoreCase, int thisStart, CharSequence substring, int start, int length) { + if (cs instanceof String && substring instanceof String) { + return ((String) cs).regionMatches(ignoreCase, thisStart, (String) substring, start, length); + } else { + int index1 = thisStart; + int index2 = start; + int tmpLen = length; + int srcLen = cs.length() - thisStart; + int otherLen = substring.length() - start; + if (thisStart >= 0 && start >= 0 && length >= 0) { + if (srcLen >= length && otherLen >= length) { + while (tmpLen-- > 0) { + char c1 = cs.charAt(index1++); + char c2 = substring.charAt(index2++); + if (c1 != c2) { + if (!ignoreCase) { + return false; + } + + if (Character.toUpperCase(c1) != Character.toUpperCase(c2) && Character.toLowerCase(c1) != Character.toLowerCase(c2)) { + return false; + } + } + } + return true; + } else { + return false; + } + } else { + return false; + } + } + } + + public static String getOrdinal(int number) { + if (number <= 0) { + throw new IllegalArgumentException("Number must be greater than zero"); + } + int mod100 = number % 100; + int mod10 = number % 10; + + if (mod100 >= 11 && mod100 <= 13) { + return number + "th"; + } + switch (mod10) { + case 1: + return number + "st"; + case 2: + return number + "nd"; + case 3: + return number + "rd"; + default: + return number + "th"; + } + } + + /* + * check str contains all numbers + * */ + public static boolean isValidCellNumber(String str) { + for (int i = 0; i < str.length(); i++) { + if (!Character.isDigit(str.charAt(i)) && str.charAt(i) != '-') { + return false; + } + } + return true; + } + + /* + * remove trailing zeros from string + * */ + public static String removeTrailingZeros(String merchantId) { + if (!isNullOrEmpty(merchantId)) { + return merchantId.replaceFirst("^0+(?!$)", ""); + } + return merchantId; + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/util/TimePeriodFormatter.java b/src/main/java/com/utopiaindustries/util/TimePeriodFormatter.java new file mode 100644 index 0000000..103b322 --- /dev/null +++ b/src/main/java/com/utopiaindustries/util/TimePeriodFormatter.java @@ -0,0 +1,140 @@ +package com.utopiaindustries.util; + + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + +public class TimePeriodFormatter { + private LocalDateTime from; + private LocalDateTime to; + private long seconds; + private long minutes; + private long hours; + private long days; + private long months; + private long years; + private final String separator = ", "; + private final String lastSeparator = " and "; + + /** + * constructor + */ + public TimePeriodFormatter() {} + + /** + * from + */ + public TimePeriodFormatter from( LocalDateTime from ) { + this.from = from; + return this; + } + + /** + * to + */ + public TimePeriodFormatter to( LocalDateTime to ) { + this.to = to; + // calculate seconds, minutes, hours, days, months and years + this.calculateAll(); + return this; + } + + /** + * calculate seconds, minutes, hours, days, months and years + */ + private void calculateAll() { + this.calculateSeconds(); + this.calculateMinutes(); + this.calculateHours(); + this.calculateDays(); + this.calculateMonths(); + this.calculateYears(); + } + + /** + * calculate seconds + */ + private void calculateSeconds() { + this.seconds = ChronoUnit.SECONDS.between( this.from, this.to ) % 60; + } + + /** + * calculate minutes + */ + private void calculateMinutes() { + this.minutes = ChronoUnit.MINUTES.between( this.from, this.to ) % 60; + } + + /** + * calculate hours + */ + private void calculateHours() { + this.hours = ChronoUnit.HOURS.between( this.from, this.to ) % 24; + } + + /** + * calculate days + */ + private void calculateDays() { + this.days = ChronoUnit.DAYS.between( this.from, this.to ) % 30; + } + + /** + * calculate months + */ + private void calculateMonths() { + this.months = ChronoUnit.MONTHS.between( this.from, this.to ) % 12; + } + + /** + * calculate years + */ + private void calculateYears() { + this.years = ChronoUnit.YEARS.between( this.from, this.to ); + } + + /** + * format human readable string + */ + public String format() { + StringBuilder stringBuilder = new StringBuilder(); + // years + if ( this.years > 0 ) { + stringBuilder.append( String.format( "%s %s", this.years, ( this.years == 1 ? "year" : "years" ) ) ); + stringBuilder.append( this.separator ); + } + // months + if ( this.months > 0 ) { + stringBuilder.append( String.format( "%s %s", this.months, ( this.months == 1 ? "month" : "months" ) ) ); + stringBuilder.append( this.separator ); + } + // days + if ( this.days > 0 ) { + stringBuilder.append( String.format( "%s %s", this.days, ( this.days == 1 ? "day" : "days" ) ) ); + stringBuilder.append( this.separator ); + } + // hours + if ( this.hours > 0 ) { + stringBuilder.append( String.format( "%s %s", this.hours, ( this.hours == 1 ? "hour" : "hours" ) ) ); + stringBuilder.append( this.separator ); + } + // minutes + if ( this.minutes > 0 ) { + stringBuilder.append( String.format( "%s %s", this.minutes, ( this.minutes == 1 ? "minute" : "minutes" ) ) ); + stringBuilder.append( this.separator ); + } + // seconds + if ( this.seconds > 0 ) { + stringBuilder.append( String.format( "%s %s", this.seconds, ( this.seconds == 1 ? "second" : "seconds" ) ) ); + } + // format + String formattedPeriod = stringBuilder.toString(); + // remove ending comma and space + if ( formattedPeriod.endsWith( this.separator ) ) { + formattedPeriod = formattedPeriod.substring( 0, formattedPeriod.lastIndexOf( this.separator ) ); + } + // replace last instance of ", " with "and" + formattedPeriod = StringUtils.replaceLast( formattedPeriod, separator, lastSeparator ); + return formattedPeriod; + } +} \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000..85fee79 --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,70 @@ +application: + title: Cut To Pack Service + version: v1.0 + +spring: + resources: + chain: + cache: false + strategy: + content: + enabled: true + paths: /** + html-application-cache: true + enabled: true + cache: + period: 0 + static-locations: file:./src/main/resources/static/ + thymeleaf: + check-template-location: true + cache: false + prefix: file:./src/main/resources/templates/ + uinddatasource: + jdbcUrl: jdbc:mysql://192.168.90.108:3306/uind_vms + username: utopia + password: Utopia01 + driverClassName: com.mysql.cj.jdbc.Driver + logbackUrl: jdbc:mysql://192.168.90.108:3306/uind_logs?serverTimezone=Asia/Karachi + hikari: + maximum-pool-size: 5 + pool-name: UINDMainPool + leak-detection-threshold: 2000 + cosmosdatasource: + jdbcUrl: jdbc:mysql://192.168.90.108:3307 + username: utopia + password: Utopia01 + driverClassName: com.mysql.cj.jdbc.Driver + hikari: + maximum-pool-size: 5 + pool-name: UINDCosmosPool + leak-detection-threshold: 2000 + localdatasource: + jdbcUrl: jdbc:mysql://192.168.90.108:3306/cut_to_pack + username: utopia + password: Utopia01 + driverClassName: com.mysql.cj.jdbc.Driver + hikari: + maximum-pool-size: 5 + pool-name: CTPPool + leak-detection-threshold: 2000 + +server: + servlet: + context-path: /ctp + tomcat: + remoteip: + remote-ip-header: X-FORWARDED-FOR + max-parameter-count: 50000 + port: 8080 + compression: + enabled: true + mime-types: text/html, text/xml, text/plain, text/css, text/javascript, application/javascript, application/json, application/xml + min-response-size: 2KB + +thymeleaf-layout-dialect: + version: 2.1.1 + +ctp: + cipher: + key: BC87A69BFCEC4A71E73B8DCCC4F14 + seed-value : 7XYXo8Qq6D \ No newline at end of file diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt new file mode 100644 index 0000000..5e7bf3d --- /dev/null +++ b/src/main/resources/banner.txt @@ -0,0 +1,8 @@ + ,-----. ,--. ,--------. ,------. ,--. +' .--./,--.,--.,-' '-. '--. .--',---. | .--. ' ,--,--.,---.| |,-. +| | | || |'-. .-' | | | .-. | | '--' |' ,-. | .--'| / +' '--'\' '' ' | | | | ' '-' ' | | --' \ '-' \ `--.| \ \ + `-----' `----' `--' `--' `---' `--' `--`--'`---'`--'`--' + +${application.title} ${application.version} +Powered by Spring Boot ${spring-boot.version} \ No newline at end of file diff --git a/src/main/resources/static/css/_animate.scss b/src/main/resources/static/css/_animate.scss new file mode 100644 index 0000000..b5a4436 --- /dev/null +++ b/src/main/resources/static/css/_animate.scss @@ -0,0 +1,4072 @@ +@charset "UTF-8";/*! + * animate.css - https://animate.style/ + * Version - 4.1.1 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2020 Animate.css + */ +:root { + --animate-duration: 1s; + --animate-delay: 1s; + --animate-repeat: 1; +} +.animate__animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-duration: var(--animate-duration); + animation-duration: var(--animate-duration); + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.animate__animated.animate__infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} +.animate__animated.animate__repeat-1 { + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + -webkit-animation-iteration-count: var(--animate-repeat); + animation-iteration-count: var(--animate-repeat); +} +.animate__animated.animate__repeat-2 { + -webkit-animation-iteration-count: calc(1 * 2); + animation-iteration-count: calc(1 * 2); + -webkit-animation-iteration-count: calc(var(--animate-repeat) * 2); + animation-iteration-count: calc(var(--animate-repeat) * 2); +} +.animate__animated.animate__repeat-3 { + -webkit-animation-iteration-count: calc(1 * 3); + animation-iteration-count: calc(1 * 3); + -webkit-animation-iteration-count: calc(var(--animate-repeat) * 3); + animation-iteration-count: calc(var(--animate-repeat) * 3); +} +.animate__animated.animate__delay-1s { + -webkit-animation-delay: 1s; + animation-delay: 1s; + -webkit-animation-delay: var(--animate-delay); + animation-delay: var(--animate-delay); +} +.animate__animated.animate__delay-2s { + -webkit-animation-delay: calc(1s * 2); + animation-delay: calc(1s * 2); + -webkit-animation-delay: calc(var(--animate-delay) * 2); + animation-delay: calc(var(--animate-delay) * 2); +} +.animate__animated.animate__delay-3s { + -webkit-animation-delay: calc(1s * 3); + animation-delay: calc(1s * 3); + -webkit-animation-delay: calc(var(--animate-delay) * 3); + animation-delay: calc(var(--animate-delay) * 3); +} +.animate__animated.animate__delay-4s { + -webkit-animation-delay: calc(1s * 4); + animation-delay: calc(1s * 4); + -webkit-animation-delay: calc(var(--animate-delay) * 4); + animation-delay: calc(var(--animate-delay) * 4); +} +.animate__animated.animate__delay-5s { + -webkit-animation-delay: calc(1s * 5); + animation-delay: calc(1s * 5); + -webkit-animation-delay: calc(var(--animate-delay) * 5); + animation-delay: calc(var(--animate-delay) * 5); +} +.animate__animated.animate__faster { + -webkit-animation-duration: calc(1s / 2); + animation-duration: calc(1s / 2); + -webkit-animation-duration: calc(var(--animate-duration) / 2); + animation-duration: calc(var(--animate-duration) / 2); +} +.animate__animated.animate__fast { + -webkit-animation-duration: calc(1s * 0.8); + animation-duration: calc(1s * 0.8); + -webkit-animation-duration: calc(var(--animate-duration) * 0.8); + animation-duration: calc(var(--animate-duration) * 0.8); +} +.animate__animated.animate__slow { + -webkit-animation-duration: calc(1s * 2); + animation-duration: calc(1s * 2); + -webkit-animation-duration: calc(var(--animate-duration) * 2); + animation-duration: calc(var(--animate-duration) * 2); +} +.animate__animated.animate__slower { + -webkit-animation-duration: calc(1s * 3); + animation-duration: calc(1s * 3); + -webkit-animation-duration: calc(var(--animate-duration) * 3); + animation-duration: calc(var(--animate-duration) * 3); +} +@media print, (prefers-reduced-motion: reduce) { + .animate__animated { + -webkit-animation-duration: 1ms !important; + animation-duration: 1ms !important; + -webkit-transition-duration: 1ms !important; + transition-duration: 1ms !important; + -webkit-animation-iteration-count: 1 !important; + animation-iteration-count: 1 !important; + } + + .animate__animated[class*='Out'] { + opacity: 0; + } +} +/* Attention seekers */ +@-webkit-keyframes bounce { + from, + 20%, + 53%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 40%, + 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -30px, 0) scaleY(1.1); + transform: translate3d(0, -30px, 0) scaleY(1.1); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -15px, 0) scaleY(1.05); + transform: translate3d(0, -15px, 0) scaleY(1.05); + } + + 80% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0) scaleY(0.95); + transform: translate3d(0, 0, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, -4px, 0) scaleY(1.02); + transform: translate3d(0, -4px, 0) scaleY(1.02); + } +} +@keyframes bounce { + from, + 20%, + 53%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 40%, + 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -30px, 0) scaleY(1.1); + transform: translate3d(0, -30px, 0) scaleY(1.1); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -15px, 0) scaleY(1.05); + transform: translate3d(0, -15px, 0) scaleY(1.05); + } + + 80% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0) scaleY(0.95); + transform: translate3d(0, 0, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, -4px, 0) scaleY(1.02); + transform: translate3d(0, -4px, 0) scaleY(1.02); + } +} +.animate__bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} +@-webkit-keyframes flash { + from, + 50%, + to { + opacity: 1; + } + + 25%, + 75% { + opacity: 0; + } +} +@keyframes flash { + from, + 50%, + to { + opacity: 1; + } + + 25%, + 75% { + opacity: 0; + } +} +.animate__flash { + -webkit-animation-name: flash; + animation-name: flash; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +@keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +.animate__pulse { + -webkit-animation-name: pulse; + animation-name: pulse; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; +} +@-webkit-keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(0.95, 1.05, 1); + transform: scale3d(0.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, 0.95, 1); + transform: scale3d(1.05, 0.95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +@keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(0.95, 1.05, 1); + transform: scale3d(0.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, 0.95, 1); + transform: scale3d(1.05, 0.95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +.animate__rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} +@-webkit-keyframes shakeX { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} +@keyframes shakeX { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} +.animate__shakeX { + -webkit-animation-name: shakeX; + animation-name: shakeX; +} +@-webkit-keyframes shakeY { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } +} +@keyframes shakeY { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } +} +.animate__shakeY { + -webkit-animation-name: shakeY; + animation-name: shakeY; +} +@-webkit-keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +.animate__headShake { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-name: headShake; + animation-name: headShake; +} +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} +.animate__swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} +@-webkit-keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, + 60%, + 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +@keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, + 60%, + 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +.animate__tada { + -webkit-animation-name: tada; + animation-name: tada; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes wobble { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes wobble { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} +@-webkit-keyframes jello { + from, + 11.1%, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} +@keyframes jello { + from, + 11.1%, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} +.animate__jello { + -webkit-animation-name: jello; + animation-name: jello; + -webkit-transform-origin: center; + transform-origin: center; +} +@-webkit-keyframes heartBeat { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 14% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 28% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 42% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 70% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes heartBeat { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 14% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 28% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 42% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 70% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +.animate__heartBeat { + -webkit-animation-name: heartBeat; + animation-name: heartBeat; + -webkit-animation-duration: calc(1s * 1.3); + animation-duration: calc(1s * 1.3); + -webkit-animation-duration: calc(var(--animate-duration) * 1.3); + animation-duration: calc(var(--animate-duration) * 1.3); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; +} +/* Back entrances */ +@-webkit-keyframes backInDown { + 0% { + -webkit-transform: translateY(-1200px) scale(0.7); + transform: translateY(-1200px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +@keyframes backInDown { + 0% { + -webkit-transform: translateY(-1200px) scale(0.7); + transform: translateY(-1200px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +.animate__backInDown { + -webkit-animation-name: backInDown; + animation-name: backInDown; +} +@-webkit-keyframes backInLeft { + 0% { + -webkit-transform: translateX(-2000px) scale(0.7); + transform: translateX(-2000px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +@keyframes backInLeft { + 0% { + -webkit-transform: translateX(-2000px) scale(0.7); + transform: translateX(-2000px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +.animate__backInLeft { + -webkit-animation-name: backInLeft; + animation-name: backInLeft; +} +@-webkit-keyframes backInRight { + 0% { + -webkit-transform: translateX(2000px) scale(0.7); + transform: translateX(2000px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +@keyframes backInRight { + 0% { + -webkit-transform: translateX(2000px) scale(0.7); + transform: translateX(2000px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +.animate__backInRight { + -webkit-animation-name: backInRight; + animation-name: backInRight; +} +@-webkit-keyframes backInUp { + 0% { + -webkit-transform: translateY(1200px) scale(0.7); + transform: translateY(1200px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +@keyframes backInUp { + 0% { + -webkit-transform: translateY(1200px) scale(0.7); + transform: translateY(1200px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +.animate__backInUp { + -webkit-animation-name: backInUp; + animation-name: backInUp; +} +/* Back exits */ +@-webkit-keyframes backOutDown { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateY(700px) scale(0.7); + transform: translateY(700px) scale(0.7); + opacity: 0.7; + } +} +@keyframes backOutDown { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateY(700px) scale(0.7); + transform: translateY(700px) scale(0.7); + opacity: 0.7; + } +} +.animate__backOutDown { + -webkit-animation-name: backOutDown; + animation-name: backOutDown; +} +@-webkit-keyframes backOutLeft { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateX(-2000px) scale(0.7); + transform: translateX(-2000px) scale(0.7); + opacity: 0.7; + } +} +@keyframes backOutLeft { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateX(-2000px) scale(0.7); + transform: translateX(-2000px) scale(0.7); + opacity: 0.7; + } +} +.animate__backOutLeft { + -webkit-animation-name: backOutLeft; + animation-name: backOutLeft; +} +@-webkit-keyframes backOutRight { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateX(2000px) scale(0.7); + transform: translateX(2000px) scale(0.7); + opacity: 0.7; + } +} +@keyframes backOutRight { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateX(2000px) scale(0.7); + transform: translateX(2000px) scale(0.7); + opacity: 0.7; + } +} +.animate__backOutRight { + -webkit-animation-name: backOutRight; + animation-name: backOutRight; +} +@-webkit-keyframes backOutUp { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateY(-700px) scale(0.7); + transform: translateY(-700px) scale(0.7); + opacity: 0.7; + } +} +@keyframes backOutUp { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateY(-700px) scale(0.7); + transform: translateY(-700px) scale(0.7); + opacity: 0.7; + } +} +.animate__backOutUp { + -webkit-animation-name: backOutUp; + animation-name: backOutUp; +} +/* Bouncing entrances */ +@-webkit-keyframes bounceIn { + from, + 20%, + 40%, + 60%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(0.97, 0.97, 0.97); + transform: scale3d(0.97, 0.97, 0.97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +@keyframes bounceIn { + from, + 20%, + 40%, + 60%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(0.97, 0.97, 0.97); + transform: scale3d(0.97, 0.97, 0.97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +.animate__bounceIn { + -webkit-animation-duration: calc(1s * 0.75); + animation-duration: calc(1s * 0.75); + -webkit-animation-duration: calc(var(--animate-duration) * 0.75); + animation-duration: calc(var(--animate-duration) * 0.75); + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} +@-webkit-keyframes bounceInDown { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0) scaleY(3); + transform: translate3d(0, -3000px, 0) scaleY(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0) scaleY(0.9); + transform: translate3d(0, 25px, 0) scaleY(0.9); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0) scaleY(0.95); + transform: translate3d(0, -10px, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0) scaleY(0.985); + transform: translate3d(0, 5px, 0) scaleY(0.985); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes bounceInDown { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0) scaleY(3); + transform: translate3d(0, -3000px, 0) scaleY(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0) scaleY(0.9); + transform: translate3d(0, 25px, 0) scaleY(0.9); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0) scaleY(0.95); + transform: translate3d(0, -10px, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0) scaleY(0.985); + transform: translate3d(0, 5px, 0) scaleY(0.985); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} +@-webkit-keyframes bounceInLeft { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0) scaleX(3); + transform: translate3d(-3000px, 0, 0) scaleX(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0) scaleX(1); + transform: translate3d(25px, 0, 0) scaleX(1); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0) scaleX(0.98); + transform: translate3d(-10px, 0, 0) scaleX(0.98); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0) scaleX(0.995); + transform: translate3d(5px, 0, 0) scaleX(0.995); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes bounceInLeft { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0) scaleX(3); + transform: translate3d(-3000px, 0, 0) scaleX(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0) scaleX(1); + transform: translate3d(25px, 0, 0) scaleX(1); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0) scaleX(0.98); + transform: translate3d(-10px, 0, 0) scaleX(0.98); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0) scaleX(0.995); + transform: translate3d(5px, 0, 0) scaleX(0.995); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} +@-webkit-keyframes bounceInRight { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0) scaleX(3); + transform: translate3d(3000px, 0, 0) scaleX(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0) scaleX(1); + transform: translate3d(-25px, 0, 0) scaleX(1); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0) scaleX(0.98); + transform: translate3d(10px, 0, 0) scaleX(0.98); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0) scaleX(0.995); + transform: translate3d(-5px, 0, 0) scaleX(0.995); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes bounceInRight { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0) scaleX(3); + transform: translate3d(3000px, 0, 0) scaleX(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0) scaleX(1); + transform: translate3d(-25px, 0, 0) scaleX(1); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0) scaleX(0.98); + transform: translate3d(10px, 0, 0) scaleX(0.98); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0) scaleX(0.995); + transform: translate3d(-5px, 0, 0) scaleX(0.995); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} +@-webkit-keyframes bounceInUp { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0) scaleY(5); + transform: translate3d(0, 3000px, 0) scaleY(5); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); + transform: translate3d(0, -20px, 0) scaleY(0.9); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0) scaleY(0.95); + transform: translate3d(0, 10px, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0) scaleY(0.985); + transform: translate3d(0, -5px, 0) scaleY(0.985); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes bounceInUp { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0) scaleY(5); + transform: translate3d(0, 3000px, 0) scaleY(5); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); + transform: translate3d(0, -20px, 0) scaleY(0.9); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0) scaleY(0.95); + transform: translate3d(0, 10px, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0) scaleY(0.985); + transform: translate3d(0, -5px, 0) scaleY(0.985); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} +/* Bouncing exits */ +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 50%, + 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } +} +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 50%, + 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } +} +.animate__bounceOut { + -webkit-animation-duration: calc(1s * 0.75); + animation-duration: calc(1s * 0.75); + -webkit-animation-duration: calc(var(--animate-duration) * 0.75); + animation-duration: calc(var(--animate-duration) * 0.75); + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0) scaleY(0.985); + transform: translate3d(0, 10px, 0) scaleY(0.985); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); + transform: translate3d(0, -20px, 0) scaleY(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0) scaleY(3); + transform: translate3d(0, 2000px, 0) scaleY(3); + } +} +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0) scaleY(0.985); + transform: translate3d(0, 10px, 0) scaleY(0.985); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); + transform: translate3d(0, -20px, 0) scaleY(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0) scaleY(3); + transform: translate3d(0, 2000px, 0) scaleY(3); + } +} +.animate__bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0) scaleX(0.9); + transform: translate3d(20px, 0, 0) scaleX(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0) scaleX(2); + transform: translate3d(-2000px, 0, 0) scaleX(2); + } +} +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0) scaleX(0.9); + transform: translate3d(20px, 0, 0) scaleX(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0) scaleX(2); + transform: translate3d(-2000px, 0, 0) scaleX(2); + } +} +.animate__bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0) scaleX(0.9); + transform: translate3d(-20px, 0, 0) scaleX(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0) scaleX(2); + transform: translate3d(2000px, 0, 0) scaleX(2); + } +} +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0) scaleX(0.9); + transform: translate3d(-20px, 0, 0) scaleX(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0) scaleX(2); + transform: translate3d(2000px, 0, 0) scaleX(2); + } +} +.animate__bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0) scaleY(0.985); + transform: translate3d(0, -10px, 0) scaleY(0.985); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0) scaleY(0.9); + transform: translate3d(0, 20px, 0) scaleY(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0) scaleY(3); + transform: translate3d(0, -2000px, 0) scaleY(3); + } +} +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0) scaleY(0.985); + transform: translate3d(0, -10px, 0) scaleY(0.985); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0) scaleY(0.9); + transform: translate3d(0, 20px, 0) scaleY(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0) scaleY(3); + transform: translate3d(0, -2000px, 0) scaleY(3); + } +} +.animate__bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} +/* Fading entrances */ +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} +.animate__fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} +@-webkit-keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} +@-webkit-keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} +@-webkit-keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} +@-webkit-keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} +@-webkit-keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} +@-webkit-keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} +@-webkit-keyframes fadeInTopLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, -100%, 0); + transform: translate3d(-100%, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInTopLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, -100%, 0); + transform: translate3d(-100%, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInTopLeft { + -webkit-animation-name: fadeInTopLeft; + animation-name: fadeInTopLeft; +} +@-webkit-keyframes fadeInTopRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, -100%, 0); + transform: translate3d(100%, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInTopRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, -100%, 0); + transform: translate3d(100%, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInTopRight { + -webkit-animation-name: fadeInTopRight; + animation-name: fadeInTopRight; +} +@-webkit-keyframes fadeInBottomLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 100%, 0); + transform: translate3d(-100%, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInBottomLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 100%, 0); + transform: translate3d(-100%, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInBottomLeft { + -webkit-animation-name: fadeInBottomLeft; + animation-name: fadeInBottomLeft; +} +@-webkit-keyframes fadeInBottomRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 100%, 0); + transform: translate3d(100%, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInBottomRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 100%, 0); + transform: translate3d(100%, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInBottomRight { + -webkit-animation-name: fadeInBottomRight; + animation-name: fadeInBottomRight; +} +/* Fading exits */ +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} +.animate__fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +.animate__fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} +@-webkit-keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} +.animate__fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} +@-webkit-keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} +.animate__fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} +@-webkit-keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} +.animate__fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} +@-webkit-keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} +@keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} +.animate__fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} +@-webkit-keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} +.animate__fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} +.animate__fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} +@-webkit-keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} +.animate__fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} +@-webkit-keyframes fadeOutTopLeft { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(-100%, -100%, 0); + transform: translate3d(-100%, -100%, 0); + } +} +@keyframes fadeOutTopLeft { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(-100%, -100%, 0); + transform: translate3d(-100%, -100%, 0); + } +} +.animate__fadeOutTopLeft { + -webkit-animation-name: fadeOutTopLeft; + animation-name: fadeOutTopLeft; +} +@-webkit-keyframes fadeOutTopRight { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, -100%, 0); + transform: translate3d(100%, -100%, 0); + } +} +@keyframes fadeOutTopRight { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, -100%, 0); + transform: translate3d(100%, -100%, 0); + } +} +.animate__fadeOutTopRight { + -webkit-animation-name: fadeOutTopRight; + animation-name: fadeOutTopRight; +} +@-webkit-keyframes fadeOutBottomRight { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, 100%, 0); + transform: translate3d(100%, 100%, 0); + } +} +@keyframes fadeOutBottomRight { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, 100%, 0); + transform: translate3d(100%, 100%, 0); + } +} +.animate__fadeOutBottomRight { + -webkit-animation-name: fadeOutBottomRight; + animation-name: fadeOutBottomRight; +} +@-webkit-keyframes fadeOutBottomLeft { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 100%, 0); + transform: translate3d(-100%, 100%, 0); + } +} +@keyframes fadeOutBottomLeft { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 100%, 0); + transform: translate3d(-100%, 100%, 0); + } +} +.animate__fadeOutBottomLeft { + -webkit-animation-name: fadeOutBottomLeft; + animation-name: fadeOutBottomLeft; +} +/* Flippers */ +@-webkit-keyframes flip { + from { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) + rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) + rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} +@keyframes flip { + from { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) + rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) + rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} +.animate__animated.animate__flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} +@-webkit-keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} +@keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} +.animate__flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} +@-webkit-keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} +@keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} +.animate__flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} +@-webkit-keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} +@keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} +.animate__flipOutX { + -webkit-animation-duration: calc(1s * 0.75); + animation-duration: calc(1s * 0.75); + -webkit-animation-duration: calc(var(--animate-duration) * 0.75); + animation-duration: calc(var(--animate-duration) * 0.75); + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} +@-webkit-keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} +@keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} +.animate__flipOutY { + -webkit-animation-duration: calc(1s * 0.75); + animation-duration: calc(1s * 0.75); + -webkit-animation-duration: calc(var(--animate-duration) * 0.75); + animation-duration: calc(var(--animate-duration) * 0.75); + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} +/* Lightspeed */ +@-webkit-keyframes lightSpeedInRight { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes lightSpeedInRight { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__lightSpeedInRight { + -webkit-animation-name: lightSpeedInRight; + animation-name: lightSpeedInRight; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} +@-webkit-keyframes lightSpeedInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0) skewX(30deg); + transform: translate3d(-100%, 0, 0) skewX(30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(-20deg); + transform: skewX(-20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(5deg); + transform: skewX(5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes lightSpeedInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0) skewX(30deg); + transform: translate3d(-100%, 0, 0) skewX(30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(-20deg); + transform: skewX(-20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(5deg); + transform: skewX(5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__lightSpeedInLeft { + -webkit-animation-name: lightSpeedInLeft; + animation-name: lightSpeedInLeft; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} +@-webkit-keyframes lightSpeedOutRight { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} +@keyframes lightSpeedOutRight { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} +.animate__lightSpeedOutRight { + -webkit-animation-name: lightSpeedOutRight; + animation-name: lightSpeedOutRight; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} +@-webkit-keyframes lightSpeedOutLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(-100%, 0, 0) skewX(-30deg); + transform: translate3d(-100%, 0, 0) skewX(-30deg); + opacity: 0; + } +} +@keyframes lightSpeedOutLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(-100%, 0, 0) skewX(-30deg); + transform: translate3d(-100%, 0, 0) skewX(-30deg); + opacity: 0; + } +} +.animate__lightSpeedOutLeft { + -webkit-animation-name: lightSpeedOutLeft; + animation-name: lightSpeedOutLeft; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} +/* Rotating entrances */ +@-webkit-keyframes rotateIn { + from { + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes rotateIn { + from { + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +.animate__rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; + -webkit-transform-origin: center; + transform-origin: center; +} +@-webkit-keyframes rotateInDownLeft { + from { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes rotateInDownLeft { + from { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +.animate__rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; + -webkit-transform-origin: left bottom; + transform-origin: left bottom; +} +@-webkit-keyframes rotateInDownRight { + from { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes rotateInDownRight { + from { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +.animate__rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; + -webkit-transform-origin: right bottom; + transform-origin: right bottom; +} +@-webkit-keyframes rotateInUpLeft { + from { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes rotateInUpLeft { + from { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +.animate__rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; + -webkit-transform-origin: left bottom; + transform-origin: left bottom; +} +@-webkit-keyframes rotateInUpRight { + from { + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes rotateInUpRight { + from { + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +.animate__rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; + -webkit-transform-origin: right bottom; + transform-origin: right bottom; +} +/* Rotating exits */ +@-webkit-keyframes rotateOut { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} +@keyframes rotateOut { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} +.animate__rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; + -webkit-transform-origin: center; + transform-origin: center; +} +@-webkit-keyframes rotateOutDownLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} +@keyframes rotateOutDownLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} +.animate__rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; + -webkit-transform-origin: left bottom; + transform-origin: left bottom; +} +@-webkit-keyframes rotateOutDownRight { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} +@keyframes rotateOutDownRight { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} +.animate__rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; + -webkit-transform-origin: right bottom; + transform-origin: right bottom; +} +@-webkit-keyframes rotateOutUpLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} +@keyframes rotateOutUpLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} +.animate__rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; + -webkit-transform-origin: left bottom; + transform-origin: left bottom; +} +@-webkit-keyframes rotateOutUpRight { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} +@keyframes rotateOutUpRight { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} +.animate__rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; + -webkit-transform-origin: right bottom; + transform-origin: right bottom; +} +/* Specials */ +@-webkit-keyframes hinge { + 0% { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} +@keyframes hinge { + 0% { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} +.animate__hinge { + -webkit-animation-duration: calc(1s * 2); + animation-duration: calc(1s * 2); + -webkit-animation-duration: calc(var(--animate-duration) * 2); + animation-duration: calc(var(--animate-duration) * 2); + -webkit-animation-name: hinge; + animation-name: hinge; + -webkit-transform-origin: top left; + transform-origin: top left; +} +@-webkit-keyframes jackInTheBox { + from { + opacity: 0; + -webkit-transform: scale(0.1) rotate(30deg); + transform: scale(0.1) rotate(30deg); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + } + + 50% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 70% { + -webkit-transform: rotate(3deg); + transform: rotate(3deg); + } + + to { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes jackInTheBox { + from { + opacity: 0; + -webkit-transform: scale(0.1) rotate(30deg); + transform: scale(0.1) rotate(30deg); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + } + + 50% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 70% { + -webkit-transform: rotate(3deg); + transform: rotate(3deg); + } + + to { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} +.animate__jackInTheBox { + -webkit-animation-name: jackInTheBox; + animation-name: jackInTheBox; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} +@keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} +.animate__rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} +/* Zooming entrances */ +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 50% { + opacity: 1; + } +} +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 50% { + opacity: 1; + } +} +.animate__zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn; +} +@-webkit-keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown; +} +@-webkit-keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft; +} +@-webkit-keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight; +} +@-webkit-keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp; +} +/* Zooming exits */ +@-webkit-keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + to { + opacity: 0; + } +} +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + to { + opacity: 0; + } +} +.animate__zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut; +} +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); + transform: scale(0.1) translate3d(-2000px, 0, 0); + } +} +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); + transform: scale(0.1) translate3d(-2000px, 0, 0); + } +} +.animate__zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft; + -webkit-transform-origin: left center; + transform-origin: left center; +} +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); + transform: scale(0.1) translate3d(2000px, 0, 0); + } +} +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); + transform: scale(0.1) translate3d(2000px, 0, 0); + } +} +.animate__zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight; + -webkit-transform-origin: right center; + transform-origin: right center; +} +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} +/* Sliding entrances */ +@-webkit-keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} +@-webkit-keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} +@-webkit-keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} +@-webkit-keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp; +} +/* Sliding exits */ +@-webkit-keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +@keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +.animate__slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} +@-webkit-keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} +@keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} +.animate__slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} +@-webkit-keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} +@keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} +.animate__slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} +@-webkit-keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} +@keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} +.animate__slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} \ No newline at end of file diff --git a/src/main/resources/static/css/_bootstrap-icons.scss b/src/main/resources/static/css/_bootstrap-icons.scss new file mode 100644 index 0000000..1fa7226 --- /dev/null +++ b/src/main/resources/static/css/_bootstrap-icons.scss @@ -0,0 +1,3739 @@ +$bootstrap-icons-font: "bootstrap-icons" !default; +$bootstrap-icons-font-dir: "./fonts" !default; +$bootstrap-icons-font-file: #{$bootstrap-icons-font-dir}/#{$bootstrap-icons-font} !default; +$bootstrap-icons-font-hash: "8d200481aa7f02a2d63a331fc782cfaf" !default; +$bootstrap-icons-font-src: url("#{$bootstrap-icons-font-file}.woff2?#{$bootstrap-icons-font-hash}") format("woff2"), + url("#{$bootstrap-icons-font-file}.woff?#{$bootstrap-icons-font-hash}") format("woff") !default; + +@font-face { + font-display: block; + font-family: $bootstrap-icons-font; + src: $bootstrap-icons-font-src; +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: $bootstrap-icons-font !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +$bootstrap-icons-map: ( + "123": "\f67f", + "alarm-fill": "\f101", + "alarm": "\f102", + "align-bottom": "\f103", + "align-center": "\f104", + "align-end": "\f105", + "align-middle": "\f106", + "align-start": "\f107", + "align-top": "\f108", + "alt": "\f109", + "app-indicator": "\f10a", + "app": "\f10b", + "archive-fill": "\f10c", + "archive": "\f10d", + "arrow-90deg-down": "\f10e", + "arrow-90deg-left": "\f10f", + "arrow-90deg-right": "\f110", + "arrow-90deg-up": "\f111", + "arrow-bar-down": "\f112", + "arrow-bar-left": "\f113", + "arrow-bar-right": "\f114", + "arrow-bar-up": "\f115", + "arrow-clockwise": "\f116", + "arrow-counterclockwise": "\f117", + "arrow-down-circle-fill": "\f118", + "arrow-down-circle": "\f119", + "arrow-down-left-circle-fill": "\f11a", + "arrow-down-left-circle": "\f11b", + "arrow-down-left-square-fill": "\f11c", + "arrow-down-left-square": "\f11d", + "arrow-down-left": "\f11e", + "arrow-down-right-circle-fill": "\f11f", + "arrow-down-right-circle": "\f120", + "arrow-down-right-square-fill": "\f121", + "arrow-down-right-square": "\f122", + "arrow-down-right": "\f123", + "arrow-down-short": "\f124", + "arrow-down-square-fill": "\f125", + "arrow-down-square": "\f126", + "arrow-down-up": "\f127", + "arrow-down": "\f128", + "arrow-left-circle-fill": "\f129", + "arrow-left-circle": "\f12a", + "arrow-left-right": "\f12b", + "arrow-left-short": "\f12c", + "arrow-left-square-fill": "\f12d", + "arrow-left-square": "\f12e", + "arrow-left": "\f12f", + "arrow-repeat": "\f130", + "arrow-return-left": "\f131", + "arrow-return-right": "\f132", + "arrow-right-circle-fill": "\f133", + "arrow-right-circle": "\f134", + "arrow-right-short": "\f135", + "arrow-right-square-fill": "\f136", + "arrow-right-square": "\f137", + "arrow-right": "\f138", + "arrow-up-circle-fill": "\f139", + "arrow-up-circle": "\f13a", + "arrow-up-left-circle-fill": "\f13b", + "arrow-up-left-circle": "\f13c", + "arrow-up-left-square-fill": "\f13d", + "arrow-up-left-square": "\f13e", + "arrow-up-left": "\f13f", + "arrow-up-right-circle-fill": "\f140", + "arrow-up-right-circle": "\f141", + "arrow-up-right-square-fill": "\f142", + "arrow-up-right-square": "\f143", + "arrow-up-right": "\f144", + "arrow-up-short": "\f145", + "arrow-up-square-fill": "\f146", + "arrow-up-square": "\f147", + "arrow-up": "\f148", + "arrows-angle-contract": "\f149", + "arrows-angle-expand": "\f14a", + "arrows-collapse": "\f14b", + "arrows-expand": "\f14c", + "arrows-fullscreen": "\f14d", + "arrows-move": "\f14e", + "aspect-ratio-fill": "\f14f", + "aspect-ratio": "\f150", + "asterisk": "\f151", + "at": "\f152", + "award-fill": "\f153", + "award": "\f154", + "back": "\f155", + "backspace-fill": "\f156", + "backspace-reverse-fill": "\f157", + "backspace-reverse": "\f158", + "backspace": "\f159", + "badge-3d-fill": "\f15a", + "badge-3d": "\f15b", + "badge-4k-fill": "\f15c", + "badge-4k": "\f15d", + "badge-8k-fill": "\f15e", + "badge-8k": "\f15f", + "badge-ad-fill": "\f160", + "badge-ad": "\f161", + "badge-ar-fill": "\f162", + "badge-ar": "\f163", + "badge-cc-fill": "\f164", + "badge-cc": "\f165", + "badge-hd-fill": "\f166", + "badge-hd": "\f167", + "badge-tm-fill": "\f168", + "badge-tm": "\f169", + "badge-vo-fill": "\f16a", + "badge-vo": "\f16b", + "badge-vr-fill": "\f16c", + "badge-vr": "\f16d", + "badge-wc-fill": "\f16e", + "badge-wc": "\f16f", + "bag-check-fill": "\f170", + "bag-check": "\f171", + "bag-dash-fill": "\f172", + "bag-dash": "\f173", + "bag-fill": "\f174", + "bag-plus-fill": "\f175", + "bag-plus": "\f176", + "bag-x-fill": "\f177", + "bag-x": "\f178", + "bag": "\f179", + "bar-chart-fill": "\f17a", + "bar-chart-line-fill": "\f17b", + "bar-chart-line": "\f17c", + "bar-chart-steps": "\f17d", + "bar-chart": "\f17e", + "basket-fill": "\f17f", + "basket": "\f180", + "basket2-fill": "\f181", + "basket2": "\f182", + "basket3-fill": "\f183", + "basket3": "\f184", + "battery-charging": "\f185", + "battery-full": "\f186", + "battery-half": "\f187", + "battery": "\f188", + "bell-fill": "\f189", + "bell": "\f18a", + "bezier": "\f18b", + "bezier2": "\f18c", + "bicycle": "\f18d", + "binoculars-fill": "\f18e", + "binoculars": "\f18f", + "blockquote-left": "\f190", + "blockquote-right": "\f191", + "book-fill": "\f192", + "book-half": "\f193", + "book": "\f194", + "bookmark-check-fill": "\f195", + "bookmark-check": "\f196", + "bookmark-dash-fill": "\f197", + "bookmark-dash": "\f198", + "bookmark-fill": "\f199", + "bookmark-heart-fill": "\f19a", + "bookmark-heart": "\f19b", + "bookmark-plus-fill": "\f19c", + "bookmark-plus": "\f19d", + "bookmark-star-fill": "\f19e", + "bookmark-star": "\f19f", + "bookmark-x-fill": "\f1a0", + "bookmark-x": "\f1a1", + "bookmark": "\f1a2", + "bookmarks-fill": "\f1a3", + "bookmarks": "\f1a4", + "bookshelf": "\f1a5", + "bootstrap-fill": "\f1a6", + "bootstrap-reboot": "\f1a7", + "bootstrap": "\f1a8", + "border-all": "\f1a9", + "border-bottom": "\f1aa", + "border-center": "\f1ab", + "border-inner": "\f1ac", + "border-left": "\f1ad", + "border-middle": "\f1ae", + "border-outer": "\f1af", + "border-right": "\f1b0", + "border-style": "\f1b1", + "border-top": "\f1b2", + "border-width": "\f1b3", + "border": "\f1b4", + "bounding-box-circles": "\f1b5", + "bounding-box": "\f1b6", + "box-arrow-down-left": "\f1b7", + "box-arrow-down-right": "\f1b8", + "box-arrow-down": "\f1b9", + "box-arrow-in-down-left": "\f1ba", + "box-arrow-in-down-right": "\f1bb", + "box-arrow-in-down": "\f1bc", + "box-arrow-in-left": "\f1bd", + "box-arrow-in-right": "\f1be", + "box-arrow-in-up-left": "\f1bf", + "box-arrow-in-up-right": "\f1c0", + "box-arrow-in-up": "\f1c1", + "box-arrow-left": "\f1c2", + "box-arrow-right": "\f1c3", + "box-arrow-up-left": "\f1c4", + "box-arrow-up-right": "\f1c5", + "box-arrow-up": "\f1c6", + "box-seam": "\f1c7", + "box": "\f1c8", + "braces": "\f1c9", + "bricks": "\f1ca", + "briefcase-fill": "\f1cb", + "briefcase": "\f1cc", + "brightness-alt-high-fill": "\f1cd", + "brightness-alt-high": "\f1ce", + "brightness-alt-low-fill": "\f1cf", + "brightness-alt-low": "\f1d0", + "brightness-high-fill": "\f1d1", + "brightness-high": "\f1d2", + "brightness-low-fill": "\f1d3", + "brightness-low": "\f1d4", + "broadcast-pin": "\f1d5", + "broadcast": "\f1d6", + "brush-fill": "\f1d7", + "brush": "\f1d8", + "bucket-fill": "\f1d9", + "bucket": "\f1da", + "bug-fill": "\f1db", + "bug": "\f1dc", + "building": "\f1dd", + "bullseye": "\f1de", + "calculator-fill": "\f1df", + "calculator": "\f1e0", + "calendar-check-fill": "\f1e1", + "calendar-check": "\f1e2", + "calendar-date-fill": "\f1e3", + "calendar-date": "\f1e4", + "calendar-day-fill": "\f1e5", + "calendar-day": "\f1e6", + "calendar-event-fill": "\f1e7", + "calendar-event": "\f1e8", + "calendar-fill": "\f1e9", + "calendar-minus-fill": "\f1ea", + "calendar-minus": "\f1eb", + "calendar-month-fill": "\f1ec", + "calendar-month": "\f1ed", + "calendar-plus-fill": "\f1ee", + "calendar-plus": "\f1ef", + "calendar-range-fill": "\f1f0", + "calendar-range": "\f1f1", + "calendar-week-fill": "\f1f2", + "calendar-week": "\f1f3", + "calendar-x-fill": "\f1f4", + "calendar-x": "\f1f5", + "calendar": "\f1f6", + "calendar2-check-fill": "\f1f7", + "calendar2-check": "\f1f8", + "calendar2-date-fill": "\f1f9", + "calendar2-date": "\f1fa", + "calendar2-day-fill": "\f1fb", + "calendar2-day": "\f1fc", + "calendar2-event-fill": "\f1fd", + "calendar2-event": "\f1fe", + "calendar2-fill": "\f1ff", + "calendar2-minus-fill": "\f200", + "calendar2-minus": "\f201", + "calendar2-month-fill": "\f202", + "calendar2-month": "\f203", + "calendar2-plus-fill": "\f204", + "calendar2-plus": "\f205", + "calendar2-range-fill": "\f206", + "calendar2-range": "\f207", + "calendar2-week-fill": "\f208", + "calendar2-week": "\f209", + "calendar2-x-fill": "\f20a", + "calendar2-x": "\f20b", + "calendar2": "\f20c", + "calendar3-event-fill": "\f20d", + "calendar3-event": "\f20e", + "calendar3-fill": "\f20f", + "calendar3-range-fill": "\f210", + "calendar3-range": "\f211", + "calendar3-week-fill": "\f212", + "calendar3-week": "\f213", + "calendar3": "\f214", + "calendar4-event": "\f215", + "calendar4-range": "\f216", + "calendar4-week": "\f217", + "calendar4": "\f218", + "camera-fill": "\f219", + "camera-reels-fill": "\f21a", + "camera-reels": "\f21b", + "camera-video-fill": "\f21c", + "camera-video-off-fill": "\f21d", + "camera-video-off": "\f21e", + "camera-video": "\f21f", + "camera": "\f220", + "camera2": "\f221", + "capslock-fill": "\f222", + "capslock": "\f223", + "card-checklist": "\f224", + "card-heading": "\f225", + "card-image": "\f226", + "card-list": "\f227", + "card-text": "\f228", + "caret-down-fill": "\f229", + "caret-down-square-fill": "\f22a", + "caret-down-square": "\f22b", + "caret-down": "\f22c", + "caret-left-fill": "\f22d", + "caret-left-square-fill": "\f22e", + "caret-left-square": "\f22f", + "caret-left": "\f230", + "caret-right-fill": "\f231", + "caret-right-square-fill": "\f232", + "caret-right-square": "\f233", + "caret-right": "\f234", + "caret-up-fill": "\f235", + "caret-up-square-fill": "\f236", + "caret-up-square": "\f237", + "caret-up": "\f238", + "cart-check-fill": "\f239", + "cart-check": "\f23a", + "cart-dash-fill": "\f23b", + "cart-dash": "\f23c", + "cart-fill": "\f23d", + "cart-plus-fill": "\f23e", + "cart-plus": "\f23f", + "cart-x-fill": "\f240", + "cart-x": "\f241", + "cart": "\f242", + "cart2": "\f243", + "cart3": "\f244", + "cart4": "\f245", + "cash-stack": "\f246", + "cash": "\f247", + "cast": "\f248", + "chat-dots-fill": "\f249", + "chat-dots": "\f24a", + "chat-fill": "\f24b", + "chat-left-dots-fill": "\f24c", + "chat-left-dots": "\f24d", + "chat-left-fill": "\f24e", + "chat-left-quote-fill": "\f24f", + "chat-left-quote": "\f250", + "chat-left-text-fill": "\f251", + "chat-left-text": "\f252", + "chat-left": "\f253", + "chat-quote-fill": "\f254", + "chat-quote": "\f255", + "chat-right-dots-fill": "\f256", + "chat-right-dots": "\f257", + "chat-right-fill": "\f258", + "chat-right-quote-fill": "\f259", + "chat-right-quote": "\f25a", + "chat-right-text-fill": "\f25b", + "chat-right-text": "\f25c", + "chat-right": "\f25d", + "chat-square-dots-fill": "\f25e", + "chat-square-dots": "\f25f", + "chat-square-fill": "\f260", + "chat-square-quote-fill": "\f261", + "chat-square-quote": "\f262", + "chat-square-text-fill": "\f263", + "chat-square-text": "\f264", + "chat-square": "\f265", + "chat-text-fill": "\f266", + "chat-text": "\f267", + "chat": "\f268", + "check-all": "\f269", + "check-circle-fill": "\f26a", + "check-circle": "\f26b", + "check-square-fill": "\f26c", + "check-square": "\f26d", + "check": "\f26e", + "check2-all": "\f26f", + "check2-circle": "\f270", + "check2-square": "\f271", + "check2": "\f272", + "chevron-bar-contract": "\f273", + "chevron-bar-down": "\f274", + "chevron-bar-expand": "\f275", + "chevron-bar-left": "\f276", + "chevron-bar-right": "\f277", + "chevron-bar-up": "\f278", + "chevron-compact-down": "\f279", + "chevron-compact-left": "\f27a", + "chevron-compact-right": "\f27b", + "chevron-compact-up": "\f27c", + "chevron-contract": "\f27d", + "chevron-double-down": "\f27e", + "chevron-double-left": "\f27f", + "chevron-double-right": "\f280", + "chevron-double-up": "\f281", + "chevron-down": "\f282", + "chevron-expand": "\f283", + "chevron-left": "\f284", + "chevron-right": "\f285", + "chevron-up": "\f286", + "circle-fill": "\f287", + "circle-half": "\f288", + "circle-square": "\f289", + "circle": "\f28a", + "clipboard-check": "\f28b", + "clipboard-data": "\f28c", + "clipboard-minus": "\f28d", + "clipboard-plus": "\f28e", + "clipboard-x": "\f28f", + "clipboard": "\f290", + "clock-fill": "\f291", + "clock-history": "\f292", + "clock": "\f293", + "cloud-arrow-down-fill": "\f294", + "cloud-arrow-down": "\f295", + "cloud-arrow-up-fill": "\f296", + "cloud-arrow-up": "\f297", + "cloud-check-fill": "\f298", + "cloud-check": "\f299", + "cloud-download-fill": "\f29a", + "cloud-download": "\f29b", + "cloud-drizzle-fill": "\f29c", + "cloud-drizzle": "\f29d", + "cloud-fill": "\f29e", + "cloud-fog-fill": "\f29f", + "cloud-fog": "\f2a0", + "cloud-fog2-fill": "\f2a1", + "cloud-fog2": "\f2a2", + "cloud-hail-fill": "\f2a3", + "cloud-hail": "\f2a4", + "cloud-haze-1": "\f2a5", + "cloud-haze-fill": "\f2a6", + "cloud-haze": "\f2a7", + "cloud-haze2-fill": "\f2a8", + "cloud-lightning-fill": "\f2a9", + "cloud-lightning-rain-fill": "\f2aa", + "cloud-lightning-rain": "\f2ab", + "cloud-lightning": "\f2ac", + "cloud-minus-fill": "\f2ad", + "cloud-minus": "\f2ae", + "cloud-moon-fill": "\f2af", + "cloud-moon": "\f2b0", + "cloud-plus-fill": "\f2b1", + "cloud-plus": "\f2b2", + "cloud-rain-fill": "\f2b3", + "cloud-rain-heavy-fill": "\f2b4", + "cloud-rain-heavy": "\f2b5", + "cloud-rain": "\f2b6", + "cloud-slash-fill": "\f2b7", + "cloud-slash": "\f2b8", + "cloud-sleet-fill": "\f2b9", + "cloud-sleet": "\f2ba", + "cloud-snow-fill": "\f2bb", + "cloud-snow": "\f2bc", + "cloud-sun-fill": "\f2bd", + "cloud-sun": "\f2be", + "cloud-upload-fill": "\f2bf", + "cloud-upload": "\f2c0", + "cloud": "\f2c1", + "clouds-fill": "\f2c2", + "clouds": "\f2c3", + "cloudy-fill": "\f2c4", + "cloudy": "\f2c5", + "code-slash": "\f2c6", + "code-square": "\f2c7", + "code": "\f2c8", + "collection-fill": "\f2c9", + "collection-play-fill": "\f2ca", + "collection-play": "\f2cb", + "collection": "\f2cc", + "columns-gap": "\f2cd", + "columns": "\f2ce", + "command": "\f2cf", + "compass-fill": "\f2d0", + "compass": "\f2d1", + "cone-striped": "\f2d2", + "cone": "\f2d3", + "controller": "\f2d4", + "cpu-fill": "\f2d5", + "cpu": "\f2d6", + "credit-card-2-back-fill": "\f2d7", + "credit-card-2-back": "\f2d8", + "credit-card-2-front-fill": "\f2d9", + "credit-card-2-front": "\f2da", + "credit-card-fill": "\f2db", + "credit-card": "\f2dc", + "crop": "\f2dd", + "cup-fill": "\f2de", + "cup-straw": "\f2df", + "cup": "\f2e0", + "cursor-fill": "\f2e1", + "cursor-text": "\f2e2", + "cursor": "\f2e3", + "dash-circle-dotted": "\f2e4", + "dash-circle-fill": "\f2e5", + "dash-circle": "\f2e6", + "dash-square-dotted": "\f2e7", + "dash-square-fill": "\f2e8", + "dash-square": "\f2e9", + "dash": "\f2ea", + "diagram-2-fill": "\f2eb", + "diagram-2": "\f2ec", + "diagram-3-fill": "\f2ed", + "diagram-3": "\f2ee", + "diamond-fill": "\f2ef", + "diamond-half": "\f2f0", + "diamond": "\f2f1", + "dice-1-fill": "\f2f2", + "dice-1": "\f2f3", + "dice-2-fill": "\f2f4", + "dice-2": "\f2f5", + "dice-3-fill": "\f2f6", + "dice-3": "\f2f7", + "dice-4-fill": "\f2f8", + "dice-4": "\f2f9", + "dice-5-fill": "\f2fa", + "dice-5": "\f2fb", + "dice-6-fill": "\f2fc", + "dice-6": "\f2fd", + "disc-fill": "\f2fe", + "disc": "\f2ff", + "discord": "\f300", + "display-fill": "\f301", + "display": "\f302", + "distribute-horizontal": "\f303", + "distribute-vertical": "\f304", + "door-closed-fill": "\f305", + "door-closed": "\f306", + "door-open-fill": "\f307", + "door-open": "\f308", + "dot": "\f309", + "download": "\f30a", + "droplet-fill": "\f30b", + "droplet-half": "\f30c", + "droplet": "\f30d", + "earbuds": "\f30e", + "easel-fill": "\f30f", + "easel": "\f310", + "egg-fill": "\f311", + "egg-fried": "\f312", + "egg": "\f313", + "eject-fill": "\f314", + "eject": "\f315", + "emoji-angry-fill": "\f316", + "emoji-angry": "\f317", + "emoji-dizzy-fill": "\f318", + "emoji-dizzy": "\f319", + "emoji-expressionless-fill": "\f31a", + "emoji-expressionless": "\f31b", + "emoji-frown-fill": "\f31c", + "emoji-frown": "\f31d", + "emoji-heart-eyes-fill": "\f31e", + "emoji-heart-eyes": "\f31f", + "emoji-laughing-fill": "\f320", + "emoji-laughing": "\f321", + "emoji-neutral-fill": "\f322", + "emoji-neutral": "\f323", + "emoji-smile-fill": "\f324", + "emoji-smile-upside-down-fill": "\f325", + "emoji-smile-upside-down": "\f326", + "emoji-smile": "\f327", + "emoji-sunglasses-fill": "\f328", + "emoji-sunglasses": "\f329", + "emoji-wink-fill": "\f32a", + "emoji-wink": "\f32b", + "envelope-fill": "\f32c", + "envelope-open-fill": "\f32d", + "envelope-open": "\f32e", + "envelope": "\f32f", + "eraser-fill": "\f330", + "eraser": "\f331", + "exclamation-circle-fill": "\f332", + "exclamation-circle": "\f333", + "exclamation-diamond-fill": "\f334", + "exclamation-diamond": "\f335", + "exclamation-octagon-fill": "\f336", + "exclamation-octagon": "\f337", + "exclamation-square-fill": "\f338", + "exclamation-square": "\f339", + "exclamation-triangle-fill": "\f33a", + "exclamation-triangle": "\f33b", + "exclamation": "\f33c", + "exclude": "\f33d", + "eye-fill": "\f33e", + "eye-slash-fill": "\f33f", + "eye-slash": "\f340", + "eye": "\f341", + "eyedropper": "\f342", + "eyeglasses": "\f343", + "facebook": "\f344", + "file-arrow-down-fill": "\f345", + "file-arrow-down": "\f346", + "file-arrow-up-fill": "\f347", + "file-arrow-up": "\f348", + "file-bar-graph-fill": "\f349", + "file-bar-graph": "\f34a", + "file-binary-fill": "\f34b", + "file-binary": "\f34c", + "file-break-fill": "\f34d", + "file-break": "\f34e", + "file-check-fill": "\f34f", + "file-check": "\f350", + "file-code-fill": "\f351", + "file-code": "\f352", + "file-diff-fill": "\f353", + "file-diff": "\f354", + "file-earmark-arrow-down-fill": "\f355", + "file-earmark-arrow-down": "\f356", + "file-earmark-arrow-up-fill": "\f357", + "file-earmark-arrow-up": "\f358", + "file-earmark-bar-graph-fill": "\f359", + "file-earmark-bar-graph": "\f35a", + "file-earmark-binary-fill": "\f35b", + "file-earmark-binary": "\f35c", + "file-earmark-break-fill": "\f35d", + "file-earmark-break": "\f35e", + "file-earmark-check-fill": "\f35f", + "file-earmark-check": "\f360", + "file-earmark-code-fill": "\f361", + "file-earmark-code": "\f362", + "file-earmark-diff-fill": "\f363", + "file-earmark-diff": "\f364", + "file-earmark-easel-fill": "\f365", + "file-earmark-easel": "\f366", + "file-earmark-excel-fill": "\f367", + "file-earmark-excel": "\f368", + "file-earmark-fill": "\f369", + "file-earmark-font-fill": "\f36a", + "file-earmark-font": "\f36b", + "file-earmark-image-fill": "\f36c", + "file-earmark-image": "\f36d", + "file-earmark-lock-fill": "\f36e", + "file-earmark-lock": "\f36f", + "file-earmark-lock2-fill": "\f370", + "file-earmark-lock2": "\f371", + "file-earmark-medical-fill": "\f372", + "file-earmark-medical": "\f373", + "file-earmark-minus-fill": "\f374", + "file-earmark-minus": "\f375", + "file-earmark-music-fill": "\f376", + "file-earmark-music": "\f377", + "file-earmark-person-fill": "\f378", + "file-earmark-person": "\f379", + "file-earmark-play-fill": "\f37a", + "file-earmark-play": "\f37b", + "file-earmark-plus-fill": "\f37c", + "file-earmark-plus": "\f37d", + "file-earmark-post-fill": "\f37e", + "file-earmark-post": "\f37f", + "file-earmark-ppt-fill": "\f380", + "file-earmark-ppt": "\f381", + "file-earmark-richtext-fill": "\f382", + "file-earmark-richtext": "\f383", + "file-earmark-ruled-fill": "\f384", + "file-earmark-ruled": "\f385", + "file-earmark-slides-fill": "\f386", + "file-earmark-slides": "\f387", + "file-earmark-spreadsheet-fill": "\f388", + "file-earmark-spreadsheet": "\f389", + "file-earmark-text-fill": "\f38a", + "file-earmark-text": "\f38b", + "file-earmark-word-fill": "\f38c", + "file-earmark-word": "\f38d", + "file-earmark-x-fill": "\f38e", + "file-earmark-x": "\f38f", + "file-earmark-zip-fill": "\f390", + "file-earmark-zip": "\f391", + "file-earmark": "\f392", + "file-easel-fill": "\f393", + "file-easel": "\f394", + "file-excel-fill": "\f395", + "file-excel": "\f396", + "file-fill": "\f397", + "file-font-fill": "\f398", + "file-font": "\f399", + "file-image-fill": "\f39a", + "file-image": "\f39b", + "file-lock-fill": "\f39c", + "file-lock": "\f39d", + "file-lock2-fill": "\f39e", + "file-lock2": "\f39f", + "file-medical-fill": "\f3a0", + "file-medical": "\f3a1", + "file-minus-fill": "\f3a2", + "file-minus": "\f3a3", + "file-music-fill": "\f3a4", + "file-music": "\f3a5", + "file-person-fill": "\f3a6", + "file-person": "\f3a7", + "file-play-fill": "\f3a8", + "file-play": "\f3a9", + "file-plus-fill": "\f3aa", + "file-plus": "\f3ab", + "file-post-fill": "\f3ac", + "file-post": "\f3ad", + "file-ppt-fill": "\f3ae", + "file-ppt": "\f3af", + "file-richtext-fill": "\f3b0", + "file-richtext": "\f3b1", + "file-ruled-fill": "\f3b2", + "file-ruled": "\f3b3", + "file-slides-fill": "\f3b4", + "file-slides": "\f3b5", + "file-spreadsheet-fill": "\f3b6", + "file-spreadsheet": "\f3b7", + "file-text-fill": "\f3b8", + "file-text": "\f3b9", + "file-word-fill": "\f3ba", + "file-word": "\f3bb", + "file-x-fill": "\f3bc", + "file-x": "\f3bd", + "file-zip-fill": "\f3be", + "file-zip": "\f3bf", + "file": "\f3c0", + "files-alt": "\f3c1", + "files": "\f3c2", + "film": "\f3c3", + "filter-circle-fill": "\f3c4", + "filter-circle": "\f3c5", + "filter-left": "\f3c6", + "filter-right": "\f3c7", + "filter-square-fill": "\f3c8", + "filter-square": "\f3c9", + "filter": "\f3ca", + "flag-fill": "\f3cb", + "flag": "\f3cc", + "flower1": "\f3cd", + "flower2": "\f3ce", + "flower3": "\f3cf", + "folder-check": "\f3d0", + "folder-fill": "\f3d1", + "folder-minus": "\f3d2", + "folder-plus": "\f3d3", + "folder-symlink-fill": "\f3d4", + "folder-symlink": "\f3d5", + "folder-x": "\f3d6", + "folder": "\f3d7", + "folder2-open": "\f3d8", + "folder2": "\f3d9", + "fonts": "\f3da", + "forward-fill": "\f3db", + "forward": "\f3dc", + "front": "\f3dd", + "fullscreen-exit": "\f3de", + "fullscreen": "\f3df", + "funnel-fill": "\f3e0", + "funnel": "\f3e1", + "gear-fill": "\f3e2", + "gear-wide-connected": "\f3e3", + "gear-wide": "\f3e4", + "gear": "\f3e5", + "gem": "\f3e6", + "geo-alt-fill": "\f3e7", + "geo-alt": "\f3e8", + "geo-fill": "\f3e9", + "geo": "\f3ea", + "gift-fill": "\f3eb", + "gift": "\f3ec", + "github": "\f3ed", + "globe": "\f3ee", + "globe2": "\f3ef", + "google": "\f3f0", + "graph-down": "\f3f1", + "graph-up": "\f3f2", + "grid-1x2-fill": "\f3f3", + "grid-1x2": "\f3f4", + "grid-3x2-gap-fill": "\f3f5", + "grid-3x2-gap": "\f3f6", + "grid-3x2": "\f3f7", + "grid-3x3-gap-fill": "\f3f8", + "grid-3x3-gap": "\f3f9", + "grid-3x3": "\f3fa", + "grid-fill": "\f3fb", + "grid": "\f3fc", + "grip-horizontal": "\f3fd", + "grip-vertical": "\f3fe", + "hammer": "\f3ff", + "hand-index-fill": "\f400", + "hand-index-thumb-fill": "\f401", + "hand-index-thumb": "\f402", + "hand-index": "\f403", + "hand-thumbs-down-fill": "\f404", + "hand-thumbs-down": "\f405", + "hand-thumbs-up-fill": "\f406", + "hand-thumbs-up": "\f407", + "handbag-fill": "\f408", + "handbag": "\f409", + "hash": "\f40a", + "hdd-fill": "\f40b", + "hdd-network-fill": "\f40c", + "hdd-network": "\f40d", + "hdd-rack-fill": "\f40e", + "hdd-rack": "\f40f", + "hdd-stack-fill": "\f410", + "hdd-stack": "\f411", + "hdd": "\f412", + "headphones": "\f413", + "headset": "\f414", + "heart-fill": "\f415", + "heart-half": "\f416", + "heart": "\f417", + "heptagon-fill": "\f418", + "heptagon-half": "\f419", + "heptagon": "\f41a", + "hexagon-fill": "\f41b", + "hexagon-half": "\f41c", + "hexagon": "\f41d", + "hourglass-bottom": "\f41e", + "hourglass-split": "\f41f", + "hourglass-top": "\f420", + "hourglass": "\f421", + "house-door-fill": "\f422", + "house-door": "\f423", + "house-fill": "\f424", + "house": "\f425", + "hr": "\f426", + "hurricane": "\f427", + "image-alt": "\f428", + "image-fill": "\f429", + "image": "\f42a", + "images": "\f42b", + "inbox-fill": "\f42c", + "inbox": "\f42d", + "inboxes-fill": "\f42e", + "inboxes": "\f42f", + "info-circle-fill": "\f430", + "info-circle": "\f431", + "info-square-fill": "\f432", + "info-square": "\f433", + "info": "\f434", + "input-cursor-text": "\f435", + "input-cursor": "\f436", + "instagram": "\f437", + "intersect": "\f438", + "journal-album": "\f439", + "journal-arrow-down": "\f43a", + "journal-arrow-up": "\f43b", + "journal-bookmark-fill": "\f43c", + "journal-bookmark": "\f43d", + "journal-check": "\f43e", + "journal-code": "\f43f", + "journal-medical": "\f440", + "journal-minus": "\f441", + "journal-plus": "\f442", + "journal-richtext": "\f443", + "journal-text": "\f444", + "journal-x": "\f445", + "journal": "\f446", + "journals": "\f447", + "joystick": "\f448", + "justify-left": "\f449", + "justify-right": "\f44a", + "justify": "\f44b", + "kanban-fill": "\f44c", + "kanban": "\f44d", + "key-fill": "\f44e", + "key": "\f44f", + "keyboard-fill": "\f450", + "keyboard": "\f451", + "ladder": "\f452", + "lamp-fill": "\f453", + "lamp": "\f454", + "laptop-fill": "\f455", + "laptop": "\f456", + "layer-backward": "\f457", + "layer-forward": "\f458", + "layers-fill": "\f459", + "layers-half": "\f45a", + "layers": "\f45b", + "layout-sidebar-inset-reverse": "\f45c", + "layout-sidebar-inset": "\f45d", + "layout-sidebar-reverse": "\f45e", + "layout-sidebar": "\f45f", + "layout-split": "\f460", + "layout-text-sidebar-reverse": "\f461", + "layout-text-sidebar": "\f462", + "layout-text-window-reverse": "\f463", + "layout-text-window": "\f464", + "layout-three-columns": "\f465", + "layout-wtf": "\f466", + "life-preserver": "\f467", + "lightbulb-fill": "\f468", + "lightbulb-off-fill": "\f469", + "lightbulb-off": "\f46a", + "lightbulb": "\f46b", + "lightning-charge-fill": "\f46c", + "lightning-charge": "\f46d", + "lightning-fill": "\f46e", + "lightning": "\f46f", + "link-45deg": "\f470", + "link": "\f471", + "linkedin": "\f472", + "list-check": "\f473", + "list-nested": "\f474", + "list-ol": "\f475", + "list-stars": "\f476", + "list-task": "\f477", + "list-ul": "\f478", + "list": "\f479", + "lock-fill": "\f47a", + "lock": "\f47b", + "mailbox": "\f47c", + "mailbox2": "\f47d", + "map-fill": "\f47e", + "map": "\f47f", + "markdown-fill": "\f480", + "markdown": "\f481", + "mask": "\f482", + "megaphone-fill": "\f483", + "megaphone": "\f484", + "menu-app-fill": "\f485", + "menu-app": "\f486", + "menu-button-fill": "\f487", + "menu-button-wide-fill": "\f488", + "menu-button-wide": "\f489", + "menu-button": "\f48a", + "menu-down": "\f48b", + "menu-up": "\f48c", + "mic-fill": "\f48d", + "mic-mute-fill": "\f48e", + "mic-mute": "\f48f", + "mic": "\f490", + "minecart-loaded": "\f491", + "minecart": "\f492", + "moisture": "\f493", + "moon-fill": "\f494", + "moon-stars-fill": "\f495", + "moon-stars": "\f496", + "moon": "\f497", + "mouse-fill": "\f498", + "mouse": "\f499", + "mouse2-fill": "\f49a", + "mouse2": "\f49b", + "mouse3-fill": "\f49c", + "mouse3": "\f49d", + "music-note-beamed": "\f49e", + "music-note-list": "\f49f", + "music-note": "\f4a0", + "music-player-fill": "\f4a1", + "music-player": "\f4a2", + "newspaper": "\f4a3", + "node-minus-fill": "\f4a4", + "node-minus": "\f4a5", + "node-plus-fill": "\f4a6", + "node-plus": "\f4a7", + "nut-fill": "\f4a8", + "nut": "\f4a9", + "octagon-fill": "\f4aa", + "octagon-half": "\f4ab", + "octagon": "\f4ac", + "option": "\f4ad", + "outlet": "\f4ae", + "paint-bucket": "\f4af", + "palette-fill": "\f4b0", + "palette": "\f4b1", + "palette2": "\f4b2", + "paperclip": "\f4b3", + "paragraph": "\f4b4", + "patch-check-fill": "\f4b5", + "patch-check": "\f4b6", + "patch-exclamation-fill": "\f4b7", + "patch-exclamation": "\f4b8", + "patch-minus-fill": "\f4b9", + "patch-minus": "\f4ba", + "patch-plus-fill": "\f4bb", + "patch-plus": "\f4bc", + "patch-question-fill": "\f4bd", + "patch-question": "\f4be", + "pause-btn-fill": "\f4bf", + "pause-btn": "\f4c0", + "pause-circle-fill": "\f4c1", + "pause-circle": "\f4c2", + "pause-fill": "\f4c3", + "pause": "\f4c4", + "peace-fill": "\f4c5", + "peace": "\f4c6", + "pen-fill": "\f4c7", + "pen": "\f4c8", + "pencil-fill": "\f4c9", + "pencil-square": "\f4ca", + "pencil": "\f4cb", + "pentagon-fill": "\f4cc", + "pentagon-half": "\f4cd", + "pentagon": "\f4ce", + "people-fill": "\f4cf", + "people": "\f4d0", + "percent": "\f4d1", + "person-badge-fill": "\f4d2", + "person-badge": "\f4d3", + "person-bounding-box": "\f4d4", + "person-check-fill": "\f4d5", + "person-check": "\f4d6", + "person-circle": "\f4d7", + "person-dash-fill": "\f4d8", + "person-dash": "\f4d9", + "person-fill": "\f4da", + "person-lines-fill": "\f4db", + "person-plus-fill": "\f4dc", + "person-plus": "\f4dd", + "person-square": "\f4de", + "person-x-fill": "\f4df", + "person-x": "\f4e0", + "person": "\f4e1", + "phone-fill": "\f4e2", + "phone-landscape-fill": "\f4e3", + "phone-landscape": "\f4e4", + "phone-vibrate-fill": "\f4e5", + "phone-vibrate": "\f4e6", + "phone": "\f4e7", + "pie-chart-fill": "\f4e8", + "pie-chart": "\f4e9", + "pin-angle-fill": "\f4ea", + "pin-angle": "\f4eb", + "pin-fill": "\f4ec", + "pin": "\f4ed", + "pip-fill": "\f4ee", + "pip": "\f4ef", + "play-btn-fill": "\f4f0", + "play-btn": "\f4f1", + "play-circle-fill": "\f4f2", + "play-circle": "\f4f3", + "play-fill": "\f4f4", + "play": "\f4f5", + "plug-fill": "\f4f6", + "plug": "\f4f7", + "plus-circle-dotted": "\f4f8", + "plus-circle-fill": "\f4f9", + "plus-circle": "\f4fa", + "plus-square-dotted": "\f4fb", + "plus-square-fill": "\f4fc", + "plus-square": "\f4fd", + "plus": "\f4fe", + "power": "\f4ff", + "printer-fill": "\f500", + "printer": "\f501", + "puzzle-fill": "\f502", + "puzzle": "\f503", + "question-circle-fill": "\f504", + "question-circle": "\f505", + "question-diamond-fill": "\f506", + "question-diamond": "\f507", + "question-octagon-fill": "\f508", + "question-octagon": "\f509", + "question-square-fill": "\f50a", + "question-square": "\f50b", + "question": "\f50c", + "rainbow": "\f50d", + "receipt-cutoff": "\f50e", + "receipt": "\f50f", + "reception-0": "\f510", + "reception-1": "\f511", + "reception-2": "\f512", + "reception-3": "\f513", + "reception-4": "\f514", + "record-btn-fill": "\f515", + "record-btn": "\f516", + "record-circle-fill": "\f517", + "record-circle": "\f518", + "record-fill": "\f519", + "record": "\f51a", + "record2-fill": "\f51b", + "record2": "\f51c", + "reply-all-fill": "\f51d", + "reply-all": "\f51e", + "reply-fill": "\f51f", + "reply": "\f520", + "rss-fill": "\f521", + "rss": "\f522", + "rulers": "\f523", + "save-fill": "\f524", + "save": "\f525", + "save2-fill": "\f526", + "save2": "\f527", + "scissors": "\f528", + "screwdriver": "\f529", + "search": "\f52a", + "segmented-nav": "\f52b", + "server": "\f52c", + "share-fill": "\f52d", + "share": "\f52e", + "shield-check": "\f52f", + "shield-exclamation": "\f530", + "shield-fill-check": "\f531", + "shield-fill-exclamation": "\f532", + "shield-fill-minus": "\f533", + "shield-fill-plus": "\f534", + "shield-fill-x": "\f535", + "shield-fill": "\f536", + "shield-lock-fill": "\f537", + "shield-lock": "\f538", + "shield-minus": "\f539", + "shield-plus": "\f53a", + "shield-shaded": "\f53b", + "shield-slash-fill": "\f53c", + "shield-slash": "\f53d", + "shield-x": "\f53e", + "shield": "\f53f", + "shift-fill": "\f540", + "shift": "\f541", + "shop-window": "\f542", + "shop": "\f543", + "shuffle": "\f544", + "signpost-2-fill": "\f545", + "signpost-2": "\f546", + "signpost-fill": "\f547", + "signpost-split-fill": "\f548", + "signpost-split": "\f549", + "signpost": "\f54a", + "sim-fill": "\f54b", + "sim": "\f54c", + "skip-backward-btn-fill": "\f54d", + "skip-backward-btn": "\f54e", + "skip-backward-circle-fill": "\f54f", + "skip-backward-circle": "\f550", + "skip-backward-fill": "\f551", + "skip-backward": "\f552", + "skip-end-btn-fill": "\f553", + "skip-end-btn": "\f554", + "skip-end-circle-fill": "\f555", + "skip-end-circle": "\f556", + "skip-end-fill": "\f557", + "skip-end": "\f558", + "skip-forward-btn-fill": "\f559", + "skip-forward-btn": "\f55a", + "skip-forward-circle-fill": "\f55b", + "skip-forward-circle": "\f55c", + "skip-forward-fill": "\f55d", + "skip-forward": "\f55e", + "skip-start-btn-fill": "\f55f", + "skip-start-btn": "\f560", + "skip-start-circle-fill": "\f561", + "skip-start-circle": "\f562", + "skip-start-fill": "\f563", + "skip-start": "\f564", + "slack": "\f565", + "slash-circle-fill": "\f566", + "slash-circle": "\f567", + "slash-square-fill": "\f568", + "slash-square": "\f569", + "slash": "\f56a", + "sliders": "\f56b", + "smartwatch": "\f56c", + "snow": "\f56d", + "snow2": "\f56e", + "snow3": "\f56f", + "sort-alpha-down-alt": "\f570", + "sort-alpha-down": "\f571", + "sort-alpha-up-alt": "\f572", + "sort-alpha-up": "\f573", + "sort-down-alt": "\f574", + "sort-down": "\f575", + "sort-numeric-down-alt": "\f576", + "sort-numeric-down": "\f577", + "sort-numeric-up-alt": "\f578", + "sort-numeric-up": "\f579", + "sort-up-alt": "\f57a", + "sort-up": "\f57b", + "soundwave": "\f57c", + "speaker-fill": "\f57d", + "speaker": "\f57e", + "speedometer": "\f57f", + "speedometer2": "\f580", + "spellcheck": "\f581", + "square-fill": "\f582", + "square-half": "\f583", + "square": "\f584", + "stack": "\f585", + "star-fill": "\f586", + "star-half": "\f587", + "star": "\f588", + "stars": "\f589", + "stickies-fill": "\f58a", + "stickies": "\f58b", + "sticky-fill": "\f58c", + "sticky": "\f58d", + "stop-btn-fill": "\f58e", + "stop-btn": "\f58f", + "stop-circle-fill": "\f590", + "stop-circle": "\f591", + "stop-fill": "\f592", + "stop": "\f593", + "stoplights-fill": "\f594", + "stoplights": "\f595", + "stopwatch-fill": "\f596", + "stopwatch": "\f597", + "subtract": "\f598", + "suit-club-fill": "\f599", + "suit-club": "\f59a", + "suit-diamond-fill": "\f59b", + "suit-diamond": "\f59c", + "suit-heart-fill": "\f59d", + "suit-heart": "\f59e", + "suit-spade-fill": "\f59f", + "suit-spade": "\f5a0", + "sun-fill": "\f5a1", + "sun": "\f5a2", + "sunglasses": "\f5a3", + "sunrise-fill": "\f5a4", + "sunrise": "\f5a5", + "sunset-fill": "\f5a6", + "sunset": "\f5a7", + "symmetry-horizontal": "\f5a8", + "symmetry-vertical": "\f5a9", + "table": "\f5aa", + "tablet-fill": "\f5ab", + "tablet-landscape-fill": "\f5ac", + "tablet-landscape": "\f5ad", + "tablet": "\f5ae", + "tag-fill": "\f5af", + "tag": "\f5b0", + "tags-fill": "\f5b1", + "tags": "\f5b2", + "telegram": "\f5b3", + "telephone-fill": "\f5b4", + "telephone-forward-fill": "\f5b5", + "telephone-forward": "\f5b6", + "telephone-inbound-fill": "\f5b7", + "telephone-inbound": "\f5b8", + "telephone-minus-fill": "\f5b9", + "telephone-minus": "\f5ba", + "telephone-outbound-fill": "\f5bb", + "telephone-outbound": "\f5bc", + "telephone-plus-fill": "\f5bd", + "telephone-plus": "\f5be", + "telephone-x-fill": "\f5bf", + "telephone-x": "\f5c0", + "telephone": "\f5c1", + "terminal-fill": "\f5c2", + "terminal": "\f5c3", + "text-center": "\f5c4", + "text-indent-left": "\f5c5", + "text-indent-right": "\f5c6", + "text-left": "\f5c7", + "text-paragraph": "\f5c8", + "text-right": "\f5c9", + "textarea-resize": "\f5ca", + "textarea-t": "\f5cb", + "textarea": "\f5cc", + "thermometer-half": "\f5cd", + "thermometer-high": "\f5ce", + "thermometer-low": "\f5cf", + "thermometer-snow": "\f5d0", + "thermometer-sun": "\f5d1", + "thermometer": "\f5d2", + "three-dots-vertical": "\f5d3", + "three-dots": "\f5d4", + "toggle-off": "\f5d5", + "toggle-on": "\f5d6", + "toggle2-off": "\f5d7", + "toggle2-on": "\f5d8", + "toggles": "\f5d9", + "toggles2": "\f5da", + "tools": "\f5db", + "tornado": "\f5dc", + "trash-fill": "\f5dd", + "trash": "\f5de", + "trash2-fill": "\f5df", + "trash2": "\f5e0", + "tree-fill": "\f5e1", + "tree": "\f5e2", + "triangle-fill": "\f5e3", + "triangle-half": "\f5e4", + "triangle": "\f5e5", + "trophy-fill": "\f5e6", + "trophy": "\f5e7", + "tropical-storm": "\f5e8", + "truck-flatbed": "\f5e9", + "truck": "\f5ea", + "tsunami": "\f5eb", + "tv-fill": "\f5ec", + "tv": "\f5ed", + "twitch": "\f5ee", + "twitter": "\f5ef", + "type-bold": "\f5f0", + "type-h1": "\f5f1", + "type-h2": "\f5f2", + "type-h3": "\f5f3", + "type-italic": "\f5f4", + "type-strikethrough": "\f5f5", + "type-underline": "\f5f6", + "type": "\f5f7", + "ui-checks-grid": "\f5f8", + "ui-checks": "\f5f9", + "ui-radios-grid": "\f5fa", + "ui-radios": "\f5fb", + "umbrella-fill": "\f5fc", + "umbrella": "\f5fd", + "union": "\f5fe", + "unlock-fill": "\f5ff", + "unlock": "\f600", + "upc-scan": "\f601", + "upc": "\f602", + "upload": "\f603", + "vector-pen": "\f604", + "view-list": "\f605", + "view-stacked": "\f606", + "vinyl-fill": "\f607", + "vinyl": "\f608", + "voicemail": "\f609", + "volume-down-fill": "\f60a", + "volume-down": "\f60b", + "volume-mute-fill": "\f60c", + "volume-mute": "\f60d", + "volume-off-fill": "\f60e", + "volume-off": "\f60f", + "volume-up-fill": "\f610", + "volume-up": "\f611", + "vr": "\f612", + "wallet-fill": "\f613", + "wallet": "\f614", + "wallet2": "\f615", + "watch": "\f616", + "water": "\f617", + "whatsapp": "\f618", + "wifi-1": "\f619", + "wifi-2": "\f61a", + "wifi-off": "\f61b", + "wifi": "\f61c", + "wind": "\f61d", + "window-dock": "\f61e", + "window-sidebar": "\f61f", + "window": "\f620", + "wrench": "\f621", + "x-circle-fill": "\f622", + "x-circle": "\f623", + "x-diamond-fill": "\f624", + "x-diamond": "\f625", + "x-octagon-fill": "\f626", + "x-octagon": "\f627", + "x-square-fill": "\f628", + "x-square": "\f629", + "x": "\f62a", + "youtube": "\f62b", + "zoom-in": "\f62c", + "zoom-out": "\f62d", + "bank": "\f62e", + "bank2": "\f62f", + "bell-slash-fill": "\f630", + "bell-slash": "\f631", + "cash-coin": "\f632", + "check-lg": "\f633", + "coin": "\f634", + "currency-bitcoin": "\f635", + "currency-dollar": "\f636", + "currency-euro": "\f637", + "currency-exchange": "\f638", + "currency-pound": "\f639", + "currency-yen": "\f63a", + "dash-lg": "\f63b", + "exclamation-lg": "\f63c", + "file-earmark-pdf-fill": "\f63d", + "file-earmark-pdf": "\f63e", + "file-pdf-fill": "\f63f", + "file-pdf": "\f640", + "gender-ambiguous": "\f641", + "gender-female": "\f642", + "gender-male": "\f643", + "gender-trans": "\f644", + "headset-vr": "\f645", + "info-lg": "\f646", + "mastodon": "\f647", + "messenger": "\f648", + "piggy-bank-fill": "\f649", + "piggy-bank": "\f64a", + "pin-map-fill": "\f64b", + "pin-map": "\f64c", + "plus-lg": "\f64d", + "question-lg": "\f64e", + "recycle": "\f64f", + "reddit": "\f650", + "safe-fill": "\f651", + "safe2-fill": "\f652", + "safe2": "\f653", + "sd-card-fill": "\f654", + "sd-card": "\f655", + "skype": "\f656", + "slash-lg": "\f657", + "translate": "\f658", + "x-lg": "\f659", + "safe": "\f65a", + "apple": "\f65b", + "microsoft": "\f65d", + "windows": "\f65e", + "behance": "\f65c", + "dribbble": "\f65f", + "line": "\f660", + "medium": "\f661", + "paypal": "\f662", + "pinterest": "\f663", + "signal": "\f664", + "snapchat": "\f665", + "spotify": "\f666", + "stack-overflow": "\f667", + "strava": "\f668", + "wordpress": "\f669", + "vimeo": "\f66a", + "activity": "\f66b", + "easel2-fill": "\f66c", + "easel2": "\f66d", + "easel3-fill": "\f66e", + "easel3": "\f66f", + "fan": "\f670", + "fingerprint": "\f671", + "graph-down-arrow": "\f672", + "graph-up-arrow": "\f673", + "hypnotize": "\f674", + "magic": "\f675", + "person-rolodex": "\f676", + "person-video": "\f677", + "person-video2": "\f678", + "person-video3": "\f679", + "person-workspace": "\f67a", + "radioactive": "\f67b", + "webcam-fill": "\f67c", + "webcam": "\f67d", + "yin-yang": "\f67e", + "bandaid-fill": "\f680", + "bandaid": "\f681", + "bluetooth": "\f682", + "body-text": "\f683", + "boombox": "\f684", + "boxes": "\f685", + "dpad-fill": "\f686", + "dpad": "\f687", + "ear-fill": "\f688", + "ear": "\f689", + "envelope-check-1": "\f68a", + "envelope-check-fill": "\f68b", + "envelope-check": "\f68c", + "envelope-dash-1": "\f68d", + "envelope-dash-fill": "\f68e", + "envelope-dash": "\f68f", + "envelope-exclamation-1": "\f690", + "envelope-exclamation-fill": "\f691", + "envelope-exclamation": "\f692", + "envelope-plus-fill": "\f693", + "envelope-plus": "\f694", + "envelope-slash-1": "\f695", + "envelope-slash-fill": "\f696", + "envelope-slash": "\f697", + "envelope-x-1": "\f698", + "envelope-x-fill": "\f699", + "envelope-x": "\f69a", + "explicit-fill": "\f69b", + "explicit": "\f69c", + "git": "\f69d", + "infinity": "\f69e", + "list-columns-reverse": "\f69f", + "list-columns": "\f6a0", + "meta": "\f6a1", + "mortorboard-fill": "\f6a2", + "mortorboard": "\f6a3", + "nintendo-switch": "\f6a4", + "pc-display-horizontal": "\f6a5", + "pc-display": "\f6a6", + "pc-horizontal": "\f6a7", + "pc": "\f6a8", + "playstation": "\f6a9", + "plus-slash-minus": "\f6aa", + "projector-fill": "\f6ab", + "projector": "\f6ac", + "qr-code-scan": "\f6ad", + "qr-code": "\f6ae", + "quora": "\f6af", + "quote": "\f6b0", + "robot": "\f6b1", + "send-check-fill": "\f6b2", + "send-check": "\f6b3", + "send-dash-fill": "\f6b4", + "send-dash": "\f6b5", + "send-exclamation-1": "\f6b6", + "send-exclamation-fill": "\f6b7", + "send-exclamation": "\f6b8", + "send-fill": "\f6b9", + "send-plus-fill": "\f6ba", + "send-plus": "\f6bb", + "send-slash-fill": "\f6bc", + "send-slash": "\f6bd", + "send-x-fill": "\f6be", + "send-x": "\f6bf", + "send": "\f6c0", + "steam": "\f6c1", + "terminal-dash-1": "\f6c2", + "terminal-dash": "\f6c3", + "terminal-plus": "\f6c4", + "terminal-split": "\f6c5", + "ticket-detailed-fill": "\f6c6", + "ticket-detailed": "\f6c7", + "ticket-fill": "\f6c8", + "ticket-perforated-fill": "\f6c9", + "ticket-perforated": "\f6ca", + "ticket": "\f6cb", + "tiktok": "\f6cc", + "window-dash": "\f6cd", + "window-desktop": "\f6ce", + "window-fullscreen": "\f6cf", + "window-plus": "\f6d0", + "window-split": "\f6d1", + "window-stack": "\f6d2", + "window-x": "\f6d3", + "xbox": "\f6d4", + "ethernet": "\f6d5", + "hdmi-fill": "\f6d6", + "hdmi": "\f6d7", + "usb-c-fill": "\f6d8", + "usb-c": "\f6d9", + "usb-fill": "\f6da", + "usb-plug-fill": "\f6db", + "usb-plug": "\f6dc", + "usb-symbol": "\f6dd", + "usb": "\f6de", + "boombox-fill": "\f6df", + "displayport-1": "\f6e0", + "displayport": "\f6e1", + "gpu-card": "\f6e2", + "memory": "\f6e3", + "modem-fill": "\f6e4", + "modem": "\f6e5", + "motherboard-fill": "\f6e6", + "motherboard": "\f6e7", + "optical-audio-fill": "\f6e8", + "optical-audio": "\f6e9", + "pci-card": "\f6ea", + "router-fill": "\f6eb", + "router": "\f6ec", + "ssd-fill": "\f6ed", + "ssd": "\f6ee", + "thunderbolt-fill": "\f6ef", + "thunderbolt": "\f6f0", + "usb-drive-fill": "\f6f1", + "usb-drive": "\f6f2", + "usb-micro-fill": "\f6f3", + "usb-micro": "\f6f4", + "usb-mini-fill": "\f6f5", + "usb-mini": "\f6f6", + "cloud-haze2": "\f6f7", + "device-hdd-fill": "\f6f8", + "device-hdd": "\f6f9", + "device-ssd-fill": "\f6fa", + "device-ssd": "\f6fb", + "displayport-fill": "\f6fc", + "mortarboard-fill": "\f6fd", + "mortarboard": "\f6fe", + "terminal-x": "\f6ff", + "arrow-through-heart-fill": "\f700", + "arrow-through-heart": "\f701", + "badge-sd-fill": "\f702", + "badge-sd": "\f703", + "bag-heart-fill": "\f704", + "bag-heart": "\f705", + "balloon-fill": "\f706", + "balloon-heart-fill": "\f707", + "balloon-heart": "\f708", + "balloon": "\f709", + "box2-fill": "\f70a", + "box2-heart-fill": "\f70b", + "box2-heart": "\f70c", + "box2": "\f70d", + "braces-asterisk": "\f70e", + "calendar-heart-fill": "\f70f", + "calendar-heart": "\f710", + "calendar2-heart-fill": "\f711", + "calendar2-heart": "\f712", + "chat-heart-fill": "\f713", + "chat-heart": "\f714", + "chat-left-heart-fill": "\f715", + "chat-left-heart": "\f716", + "chat-right-heart-fill": "\f717", + "chat-right-heart": "\f718", + "chat-square-heart-fill": "\f719", + "chat-square-heart": "\f71a", + "clipboard-check-fill": "\f71b", + "clipboard-data-fill": "\f71c", + "clipboard-fill": "\f71d", + "clipboard-heart-fill": "\f71e", + "clipboard-heart": "\f71f", + "clipboard-minus-fill": "\f720", + "clipboard-plus-fill": "\f721", + "clipboard-pulse": "\f722", + "clipboard-x-fill": "\f723", + "clipboard2-check-fill": "\f724", + "clipboard2-check": "\f725", + "clipboard2-data-fill": "\f726", + "clipboard2-data": "\f727", + "clipboard2-fill": "\f728", + "clipboard2-heart-fill": "\f729", + "clipboard2-heart": "\f72a", + "clipboard2-minus-fill": "\f72b", + "clipboard2-minus": "\f72c", + "clipboard2-plus-fill": "\f72d", + "clipboard2-plus": "\f72e", + "clipboard2-pulse-fill": "\f72f", + "clipboard2-pulse": "\f730", + "clipboard2-x-fill": "\f731", + "clipboard2-x": "\f732", + "clipboard2": "\f733", + "emoji-kiss-fill": "\f734", + "emoji-kiss": "\f735", + "envelope-heart-fill": "\f736", + "envelope-heart": "\f737", + "envelope-open-heart-fill": "\f738", + "envelope-open-heart": "\f739", + "envelope-paper-fill": "\f73a", + "envelope-paper-heart-fill": "\f73b", + "envelope-paper-heart": "\f73c", + "envelope-paper": "\f73d", + "filetype-aac": "\f73e", + "filetype-ai": "\f73f", + "filetype-bmp": "\f740", + "filetype-cs": "\f741", + "filetype-css": "\f742", + "filetype-csv": "\f743", + "filetype-doc": "\f744", + "filetype-docx": "\f745", + "filetype-exe": "\f746", + "filetype-gif": "\f747", + "filetype-heic": "\f748", + "filetype-html": "\f749", + "filetype-java": "\f74a", + "filetype-jpg": "\f74b", + "filetype-js": "\f74c", + "filetype-jsx": "\f74d", + "filetype-key": "\f74e", + "filetype-m4p": "\f74f", + "filetype-md": "\f750", + "filetype-mdx": "\f751", + "filetype-mov": "\f752", + "filetype-mp3": "\f753", + "filetype-mp4": "\f754", + "filetype-otf": "\f755", + "filetype-pdf": "\f756", + "filetype-php": "\f757", + "filetype-png": "\f758", + "filetype-ppt-1": "\f759", + "filetype-ppt": "\f75a", + "filetype-psd": "\f75b", + "filetype-py": "\f75c", + "filetype-raw": "\f75d", + "filetype-rb": "\f75e", + "filetype-sass": "\f75f", + "filetype-scss": "\f760", + "filetype-sh": "\f761", + "filetype-svg": "\f762", + "filetype-tiff": "\f763", + "filetype-tsx": "\f764", + "filetype-ttf": "\f765", + "filetype-txt": "\f766", + "filetype-wav": "\f767", + "filetype-woff": "\f768", + "filetype-xls-1": "\f769", + "filetype-xls": "\f76a", + "filetype-xml": "\f76b", + "filetype-yml": "\f76c", + "heart-arrow": "\f76d", + "heart-pulse-fill": "\f76e", + "heart-pulse": "\f76f", + "heartbreak-fill": "\f770", + "heartbreak": "\f771", + "hearts": "\f772", + "hospital-fill": "\f773", + "hospital": "\f774", + "house-heart-fill": "\f775", + "house-heart": "\f776", + "incognito": "\f777", + "magnet-fill": "\f778", + "magnet": "\f779", + "person-heart": "\f77a", + "person-hearts": "\f77b", + "phone-flip": "\f77c", + "plugin": "\f77d", + "postage-fill": "\f77e", + "postage-heart-fill": "\f77f", + "postage-heart": "\f780", + "postage": "\f781", + "postcard-fill": "\f782", + "postcard-heart-fill": "\f783", + "postcard-heart": "\f784", + "postcard": "\f785", + "search-heart-fill": "\f786", + "search-heart": "\f787", + "sliders2-vertical": "\f788", + "sliders2": "\f789", + "trash3-fill": "\f78a", + "trash3": "\f78b", + "valentine": "\f78c", + "valentine2": "\f78d", + "wrench-adjustable-circle-fill": "\f78e", + "wrench-adjustable-circle": "\f78f", + "wrench-adjustable": "\f790", + "filetype-json": "\f791", + "filetype-pptx": "\f792", + "filetype-xlsx": "\f793", + "1-circle-1": "\f794", + "1-circle-fill-1": "\f795", + "1-circle-fill": "\f796", + "1-circle": "\f797", + "1-square-fill": "\f798", + "1-square": "\f799", + "2-circle-1": "\f79a", + "2-circle-fill-1": "\f79b", + "2-circle-fill": "\f79c", + "2-circle": "\f79d", + "2-square-fill": "\f79e", + "2-square": "\f79f", + "3-circle-1": "\f7a0", + "3-circle-fill-1": "\f7a1", + "3-circle-fill": "\f7a2", + "3-circle": "\f7a3", + "3-square-fill": "\f7a4", + "3-square": "\f7a5", + "4-circle-1": "\f7a6", + "4-circle-fill-1": "\f7a7", + "4-circle-fill": "\f7a8", + "4-circle": "\f7a9", + "4-square-fill": "\f7aa", + "4-square": "\f7ab", + "5-circle-1": "\f7ac", + "5-circle-fill-1": "\f7ad", + "5-circle-fill": "\f7ae", + "5-circle": "\f7af", + "5-square-fill": "\f7b0", + "5-square": "\f7b1", + "6-circle-1": "\f7b2", + "6-circle-fill-1": "\f7b3", + "6-circle-fill": "\f7b4", + "6-circle": "\f7b5", + "6-square-fill": "\f7b6", + "6-square": "\f7b7", + "7-circle-1": "\f7b8", + "7-circle-fill-1": "\f7b9", + "7-circle-fill": "\f7ba", + "7-circle": "\f7bb", + "7-square-fill": "\f7bc", + "7-square": "\f7bd", + "8-circle-1": "\f7be", + "8-circle-fill-1": "\f7bf", + "8-circle-fill": "\f7c0", + "8-circle": "\f7c1", + "8-square-fill": "\f7c2", + "8-square": "\f7c3", + "9-circle-1": "\f7c4", + "9-circle-fill-1": "\f7c5", + "9-circle-fill": "\f7c6", + "9-circle": "\f7c7", + "9-square-fill": "\f7c8", + "9-square": "\f7c9", + "airplane-engines-fill": "\f7ca", + "airplane-engines": "\f7cb", + "airplane-fill": "\f7cc", + "airplane": "\f7cd", + "alexa": "\f7ce", + "alipay": "\f7cf", + "android": "\f7d0", + "android2": "\f7d1", + "box-fill": "\f7d2", + "box-seam-fill": "\f7d3", + "browser-chrome": "\f7d4", + "browser-edge": "\f7d5", + "browser-firefox": "\f7d6", + "browser-safari": "\f7d7", + "c-circle-1": "\f7d8", + "c-circle-fill-1": "\f7d9", + "c-circle-fill": "\f7da", + "c-circle": "\f7db", + "c-square-fill": "\f7dc", + "c-square": "\f7dd", + "capsule-pill": "\f7de", + "capsule": "\f7df", + "car-front-fill": "\f7e0", + "car-front": "\f7e1", + "cassette-fill": "\f7e2", + "cassette": "\f7e3", + "cc-circle-1": "\f7e4", + "cc-circle-fill-1": "\f7e5", + "cc-circle-fill": "\f7e6", + "cc-circle": "\f7e7", + "cc-square-fill": "\f7e8", + "cc-square": "\f7e9", + "cup-hot-fill": "\f7ea", + "cup-hot": "\f7eb", + "currency-rupee": "\f7ec", + "dropbox": "\f7ed", + "escape": "\f7ee", + "fast-forward-btn-fill": "\f7ef", + "fast-forward-btn": "\f7f0", + "fast-forward-circle-fill": "\f7f1", + "fast-forward-circle": "\f7f2", + "fast-forward-fill": "\f7f3", + "fast-forward": "\f7f4", + "filetype-sql": "\f7f5", + "fire": "\f7f6", + "google-play": "\f7f7", + "h-circle-1": "\f7f8", + "h-circle-fill-1": "\f7f9", + "h-circle-fill": "\f7fa", + "h-circle": "\f7fb", + "h-square-fill": "\f7fc", + "h-square": "\f7fd", + "indent": "\f7fe", + "lungs-fill": "\f7ff", + "lungs": "\f800", + "microsoft-teams": "\f801", + "p-circle-1": "\f802", + "p-circle-fill-1": "\f803", + "p-circle-fill": "\f804", + "p-circle": "\f805", + "p-square-fill": "\f806", + "p-square": "\f807", + "pass-fill": "\f808", + "pass": "\f809", + "prescription": "\f80a", + "prescription2": "\f80b", + "r-circle-1": "\f80c", + "r-circle-fill-1": "\f80d", + "r-circle-fill": "\f80e", + "r-circle": "\f80f", + "r-square-fill": "\f810", + "r-square": "\f811", + "repeat-1": "\f812", + "repeat": "\f813", + "rewind-btn-fill": "\f814", + "rewind-btn": "\f815", + "rewind-circle-fill": "\f816", + "rewind-circle": "\f817", + "rewind-fill": "\f818", + "rewind": "\f819", + "train-freight-front-fill": "\f81a", + "train-freight-front": "\f81b", + "train-front-fill": "\f81c", + "train-front": "\f81d", + "train-lightrail-front-fill": "\f81e", + "train-lightrail-front": "\f81f", + "truck-front-fill": "\f820", + "truck-front": "\f821", + "ubuntu": "\f822", + "unindent": "\f823", + "unity": "\f824", + "universal-access-circle": "\f825", + "universal-access": "\f826", + "virus": "\f827", + "virus2": "\f828", + "wechat": "\f829", + "yelp": "\f82a", + "sign-stop-fill": "\f82b", + "sign-stop-lights-fill": "\f82c", + "sign-stop-lights": "\f82d", + "sign-stop": "\f82e", + "sign-turn-left-fill": "\f82f", + "sign-turn-left": "\f830", + "sign-turn-right-fill": "\f831", + "sign-turn-right": "\f832", + "sign-turn-slight-left-fill": "\f833", + "sign-turn-slight-left": "\f834", + "sign-turn-slight-right-fill": "\f835", + "sign-turn-slight-right": "\f836", + "sign-yield-fill": "\f837", + "sign-yield": "\f838", + "ev-station-fill": "\f839", + "ev-station": "\f83a", + "fuel-pump-diesel-fill": "\f83b", + "fuel-pump-diesel": "\f83c", + "fuel-pump-fill": "\f83d", + "fuel-pump": "\f83e", +); + +.bi-123::before { content: map-get($bootstrap-icons-map, "123"); } +.bi-alarm-fill::before { content: map-get($bootstrap-icons-map, "alarm-fill"); } +.bi-alarm::before { content: map-get($bootstrap-icons-map, "alarm"); } +.bi-align-bottom::before { content: map-get($bootstrap-icons-map, "align-bottom"); } +.bi-align-center::before { content: map-get($bootstrap-icons-map, "align-center"); } +.bi-align-end::before { content: map-get($bootstrap-icons-map, "align-end"); } +.bi-align-middle::before { content: map-get($bootstrap-icons-map, "align-middle"); } +.bi-align-start::before { content: map-get($bootstrap-icons-map, "align-start"); } +.bi-align-top::before { content: map-get($bootstrap-icons-map, "align-top"); } +.bi-alt::before { content: map-get($bootstrap-icons-map, "alt"); } +.bi-app-indicator::before { content: map-get($bootstrap-icons-map, "app-indicator"); } +.bi-app::before { content: map-get($bootstrap-icons-map, "app"); } +.bi-archive-fill::before { content: map-get($bootstrap-icons-map, "archive-fill"); } +.bi-archive::before { content: map-get($bootstrap-icons-map, "archive"); } +.bi-arrow-90deg-down::before { content: map-get($bootstrap-icons-map, "arrow-90deg-down"); } +.bi-arrow-90deg-left::before { content: map-get($bootstrap-icons-map, "arrow-90deg-left"); } +.bi-arrow-90deg-right::before { content: map-get($bootstrap-icons-map, "arrow-90deg-right"); } +.bi-arrow-90deg-up::before { content: map-get($bootstrap-icons-map, "arrow-90deg-up"); } +.bi-arrow-bar-down::before { content: map-get($bootstrap-icons-map, "arrow-bar-down"); } +.bi-arrow-bar-left::before { content: map-get($bootstrap-icons-map, "arrow-bar-left"); } +.bi-arrow-bar-right::before { content: map-get($bootstrap-icons-map, "arrow-bar-right"); } +.bi-arrow-bar-up::before { content: map-get($bootstrap-icons-map, "arrow-bar-up"); } +.bi-arrow-clockwise::before { content: map-get($bootstrap-icons-map, "arrow-clockwise"); } +.bi-arrow-counterclockwise::before { content: map-get($bootstrap-icons-map, "arrow-counterclockwise"); } +.bi-arrow-down-circle-fill::before { content: map-get($bootstrap-icons-map, "arrow-down-circle-fill"); } +.bi-arrow-down-circle::before { content: map-get($bootstrap-icons-map, "arrow-down-circle"); } +.bi-arrow-down-left-circle-fill::before { content: map-get($bootstrap-icons-map, "arrow-down-left-circle-fill"); } +.bi-arrow-down-left-circle::before { content: map-get($bootstrap-icons-map, "arrow-down-left-circle"); } +.bi-arrow-down-left-square-fill::before { content: map-get($bootstrap-icons-map, "arrow-down-left-square-fill"); } +.bi-arrow-down-left-square::before { content: map-get($bootstrap-icons-map, "arrow-down-left-square"); } +.bi-arrow-down-left::before { content: map-get($bootstrap-icons-map, "arrow-down-left"); } +.bi-arrow-down-right-circle-fill::before { content: map-get($bootstrap-icons-map, "arrow-down-right-circle-fill"); } +.bi-arrow-down-right-circle::before { content: map-get($bootstrap-icons-map, "arrow-down-right-circle"); } +.bi-arrow-down-right-square-fill::before { content: map-get($bootstrap-icons-map, "arrow-down-right-square-fill"); } +.bi-arrow-down-right-square::before { content: map-get($bootstrap-icons-map, "arrow-down-right-square"); } +.bi-arrow-down-right::before { content: map-get($bootstrap-icons-map, "arrow-down-right"); } +.bi-arrow-down-short::before { content: map-get($bootstrap-icons-map, "arrow-down-short"); } +.bi-arrow-down-square-fill::before { content: map-get($bootstrap-icons-map, "arrow-down-square-fill"); } +.bi-arrow-down-square::before { content: map-get($bootstrap-icons-map, "arrow-down-square"); } +.bi-arrow-down-up::before { content: map-get($bootstrap-icons-map, "arrow-down-up"); } +.bi-arrow-down::before { content: map-get($bootstrap-icons-map, "arrow-down"); } +.bi-arrow-left-circle-fill::before { content: map-get($bootstrap-icons-map, "arrow-left-circle-fill"); } +.bi-arrow-left-circle::before { content: map-get($bootstrap-icons-map, "arrow-left-circle"); } +.bi-arrow-left-right::before { content: map-get($bootstrap-icons-map, "arrow-left-right"); } +.bi-arrow-left-short::before { content: map-get($bootstrap-icons-map, "arrow-left-short"); } +.bi-arrow-left-square-fill::before { content: map-get($bootstrap-icons-map, "arrow-left-square-fill"); } +.bi-arrow-left-square::before { content: map-get($bootstrap-icons-map, "arrow-left-square"); } +.bi-arrow-left::before { content: map-get($bootstrap-icons-map, "arrow-left"); } +.bi-arrow-repeat::before { content: map-get($bootstrap-icons-map, "arrow-repeat"); } +.bi-arrow-return-left::before { content: map-get($bootstrap-icons-map, "arrow-return-left"); } +.bi-arrow-return-right::before { content: map-get($bootstrap-icons-map, "arrow-return-right"); } +.bi-arrow-right-circle-fill::before { content: map-get($bootstrap-icons-map, "arrow-right-circle-fill"); } +.bi-arrow-right-circle::before { content: map-get($bootstrap-icons-map, "arrow-right-circle"); } +.bi-arrow-right-short::before { content: map-get($bootstrap-icons-map, "arrow-right-short"); } +.bi-arrow-right-square-fill::before { content: map-get($bootstrap-icons-map, "arrow-right-square-fill"); } +.bi-arrow-right-square::before { content: map-get($bootstrap-icons-map, "arrow-right-square"); } +.bi-arrow-right::before { content: map-get($bootstrap-icons-map, "arrow-right"); } +.bi-arrow-up-circle-fill::before { content: map-get($bootstrap-icons-map, "arrow-up-circle-fill"); } +.bi-arrow-up-circle::before { content: map-get($bootstrap-icons-map, "arrow-up-circle"); } +.bi-arrow-up-left-circle-fill::before { content: map-get($bootstrap-icons-map, "arrow-up-left-circle-fill"); } +.bi-arrow-up-left-circle::before { content: map-get($bootstrap-icons-map, "arrow-up-left-circle"); } +.bi-arrow-up-left-square-fill::before { content: map-get($bootstrap-icons-map, "arrow-up-left-square-fill"); } +.bi-arrow-up-left-square::before { content: map-get($bootstrap-icons-map, "arrow-up-left-square"); } +.bi-arrow-up-left::before { content: map-get($bootstrap-icons-map, "arrow-up-left"); } +.bi-arrow-up-right-circle-fill::before { content: map-get($bootstrap-icons-map, "arrow-up-right-circle-fill"); } +.bi-arrow-up-right-circle::before { content: map-get($bootstrap-icons-map, "arrow-up-right-circle"); } +.bi-arrow-up-right-square-fill::before { content: map-get($bootstrap-icons-map, "arrow-up-right-square-fill"); } +.bi-arrow-up-right-square::before { content: map-get($bootstrap-icons-map, "arrow-up-right-square"); } +.bi-arrow-up-right::before { content: map-get($bootstrap-icons-map, "arrow-up-right"); } +.bi-arrow-up-short::before { content: map-get($bootstrap-icons-map, "arrow-up-short"); } +.bi-arrow-up-square-fill::before { content: map-get($bootstrap-icons-map, "arrow-up-square-fill"); } +.bi-arrow-up-square::before { content: map-get($bootstrap-icons-map, "arrow-up-square"); } +.bi-arrow-up::before { content: map-get($bootstrap-icons-map, "arrow-up"); } +.bi-arrows-angle-contract::before { content: map-get($bootstrap-icons-map, "arrows-angle-contract"); } +.bi-arrows-angle-expand::before { content: map-get($bootstrap-icons-map, "arrows-angle-expand"); } +.bi-arrows-collapse::before { content: map-get($bootstrap-icons-map, "arrows-collapse"); } +.bi-arrows-expand::before { content: map-get($bootstrap-icons-map, "arrows-expand"); } +.bi-arrows-fullscreen::before { content: map-get($bootstrap-icons-map, "arrows-fullscreen"); } +.bi-arrows-move::before { content: map-get($bootstrap-icons-map, "arrows-move"); } +.bi-aspect-ratio-fill::before { content: map-get($bootstrap-icons-map, "aspect-ratio-fill"); } +.bi-aspect-ratio::before { content: map-get($bootstrap-icons-map, "aspect-ratio"); } +.bi-asterisk::before { content: map-get($bootstrap-icons-map, "asterisk"); } +.bi-at::before { content: map-get($bootstrap-icons-map, "at"); } +.bi-award-fill::before { content: map-get($bootstrap-icons-map, "award-fill"); } +.bi-award::before { content: map-get($bootstrap-icons-map, "award"); } +.bi-back::before { content: map-get($bootstrap-icons-map, "back"); } +.bi-backspace-fill::before { content: map-get($bootstrap-icons-map, "backspace-fill"); } +.bi-backspace-reverse-fill::before { content: map-get($bootstrap-icons-map, "backspace-reverse-fill"); } +.bi-backspace-reverse::before { content: map-get($bootstrap-icons-map, "backspace-reverse"); } +.bi-backspace::before { content: map-get($bootstrap-icons-map, "backspace"); } +.bi-badge-3d-fill::before { content: map-get($bootstrap-icons-map, "badge-3d-fill"); } +.bi-badge-3d::before { content: map-get($bootstrap-icons-map, "badge-3d"); } +.bi-badge-4k-fill::before { content: map-get($bootstrap-icons-map, "badge-4k-fill"); } +.bi-badge-4k::before { content: map-get($bootstrap-icons-map, "badge-4k"); } +.bi-badge-8k-fill::before { content: map-get($bootstrap-icons-map, "badge-8k-fill"); } +.bi-badge-8k::before { content: map-get($bootstrap-icons-map, "badge-8k"); } +.bi-badge-ad-fill::before { content: map-get($bootstrap-icons-map, "badge-ad-fill"); } +.bi-badge-ad::before { content: map-get($bootstrap-icons-map, "badge-ad"); } +.bi-badge-ar-fill::before { content: map-get($bootstrap-icons-map, "badge-ar-fill"); } +.bi-badge-ar::before { content: map-get($bootstrap-icons-map, "badge-ar"); } +.bi-badge-cc-fill::before { content: map-get($bootstrap-icons-map, "badge-cc-fill"); } +.bi-badge-cc::before { content: map-get($bootstrap-icons-map, "badge-cc"); } +.bi-badge-hd-fill::before { content: map-get($bootstrap-icons-map, "badge-hd-fill"); } +.bi-badge-hd::before { content: map-get($bootstrap-icons-map, "badge-hd"); } +.bi-badge-tm-fill::before { content: map-get($bootstrap-icons-map, "badge-tm-fill"); } +.bi-badge-tm::before { content: map-get($bootstrap-icons-map, "badge-tm"); } +.bi-badge-vo-fill::before { content: map-get($bootstrap-icons-map, "badge-vo-fill"); } +.bi-badge-vo::before { content: map-get($bootstrap-icons-map, "badge-vo"); } +.bi-badge-vr-fill::before { content: map-get($bootstrap-icons-map, "badge-vr-fill"); } +.bi-badge-vr::before { content: map-get($bootstrap-icons-map, "badge-vr"); } +.bi-badge-wc-fill::before { content: map-get($bootstrap-icons-map, "badge-wc-fill"); } +.bi-badge-wc::before { content: map-get($bootstrap-icons-map, "badge-wc"); } +.bi-bag-check-fill::before { content: map-get($bootstrap-icons-map, "bag-check-fill"); } +.bi-bag-check::before { content: map-get($bootstrap-icons-map, "bag-check"); } +.bi-bag-dash-fill::before { content: map-get($bootstrap-icons-map, "bag-dash-fill"); } +.bi-bag-dash::before { content: map-get($bootstrap-icons-map, "bag-dash"); } +.bi-bag-fill::before { content: map-get($bootstrap-icons-map, "bag-fill"); } +.bi-bag-plus-fill::before { content: map-get($bootstrap-icons-map, "bag-plus-fill"); } +.bi-bag-plus::before { content: map-get($bootstrap-icons-map, "bag-plus"); } +.bi-bag-x-fill::before { content: map-get($bootstrap-icons-map, "bag-x-fill"); } +.bi-bag-x::before { content: map-get($bootstrap-icons-map, "bag-x"); } +.bi-bag::before { content: map-get($bootstrap-icons-map, "bag"); } +.bi-bar-chart-fill::before { content: map-get($bootstrap-icons-map, "bar-chart-fill"); } +.bi-bar-chart-line-fill::before { content: map-get($bootstrap-icons-map, "bar-chart-line-fill"); } +.bi-bar-chart-line::before { content: map-get($bootstrap-icons-map, "bar-chart-line"); } +.bi-bar-chart-steps::before { content: map-get($bootstrap-icons-map, "bar-chart-steps"); } +.bi-bar-chart::before { content: map-get($bootstrap-icons-map, "bar-chart"); } +.bi-basket-fill::before { content: map-get($bootstrap-icons-map, "basket-fill"); } +.bi-basket::before { content: map-get($bootstrap-icons-map, "basket"); } +.bi-basket2-fill::before { content: map-get($bootstrap-icons-map, "basket2-fill"); } +.bi-basket2::before { content: map-get($bootstrap-icons-map, "basket2"); } +.bi-basket3-fill::before { content: map-get($bootstrap-icons-map, "basket3-fill"); } +.bi-basket3::before { content: map-get($bootstrap-icons-map, "basket3"); } +.bi-battery-charging::before { content: map-get($bootstrap-icons-map, "battery-charging"); } +.bi-battery-full::before { content: map-get($bootstrap-icons-map, "battery-full"); } +.bi-battery-half::before { content: map-get($bootstrap-icons-map, "battery-half"); } +.bi-battery::before { content: map-get($bootstrap-icons-map, "battery"); } +.bi-bell-fill::before { content: map-get($bootstrap-icons-map, "bell-fill"); } +.bi-bell::before { content: map-get($bootstrap-icons-map, "bell"); } +.bi-bezier::before { content: map-get($bootstrap-icons-map, "bezier"); } +.bi-bezier2::before { content: map-get($bootstrap-icons-map, "bezier2"); } +.bi-bicycle::before { content: map-get($bootstrap-icons-map, "bicycle"); } +.bi-binoculars-fill::before { content: map-get($bootstrap-icons-map, "binoculars-fill"); } +.bi-binoculars::before { content: map-get($bootstrap-icons-map, "binoculars"); } +.bi-blockquote-left::before { content: map-get($bootstrap-icons-map, "blockquote-left"); } +.bi-blockquote-right::before { content: map-get($bootstrap-icons-map, "blockquote-right"); } +.bi-book-fill::before { content: map-get($bootstrap-icons-map, "book-fill"); } +.bi-book-half::before { content: map-get($bootstrap-icons-map, "book-half"); } +.bi-book::before { content: map-get($bootstrap-icons-map, "book"); } +.bi-bookmark-check-fill::before { content: map-get($bootstrap-icons-map, "bookmark-check-fill"); } +.bi-bookmark-check::before { content: map-get($bootstrap-icons-map, "bookmark-check"); } +.bi-bookmark-dash-fill::before { content: map-get($bootstrap-icons-map, "bookmark-dash-fill"); } +.bi-bookmark-dash::before { content: map-get($bootstrap-icons-map, "bookmark-dash"); } +.bi-bookmark-fill::before { content: map-get($bootstrap-icons-map, "bookmark-fill"); } +.bi-bookmark-heart-fill::before { content: map-get($bootstrap-icons-map, "bookmark-heart-fill"); } +.bi-bookmark-heart::before { content: map-get($bootstrap-icons-map, "bookmark-heart"); } +.bi-bookmark-plus-fill::before { content: map-get($bootstrap-icons-map, "bookmark-plus-fill"); } +.bi-bookmark-plus::before { content: map-get($bootstrap-icons-map, "bookmark-plus"); } +.bi-bookmark-star-fill::before { content: map-get($bootstrap-icons-map, "bookmark-star-fill"); } +.bi-bookmark-star::before { content: map-get($bootstrap-icons-map, "bookmark-star"); } +.bi-bookmark-x-fill::before { content: map-get($bootstrap-icons-map, "bookmark-x-fill"); } +.bi-bookmark-x::before { content: map-get($bootstrap-icons-map, "bookmark-x"); } +.bi-bookmark::before { content: map-get($bootstrap-icons-map, "bookmark"); } +.bi-bookmarks-fill::before { content: map-get($bootstrap-icons-map, "bookmarks-fill"); } +.bi-bookmarks::before { content: map-get($bootstrap-icons-map, "bookmarks"); } +.bi-bookshelf::before { content: map-get($bootstrap-icons-map, "bookshelf"); } +.bi-bootstrap-fill::before { content: map-get($bootstrap-icons-map, "bootstrap-fill"); } +.bi-bootstrap-reboot::before { content: map-get($bootstrap-icons-map, "bootstrap-reboot"); } +.bi-bootstrap::before { content: map-get($bootstrap-icons-map, "bootstrap"); } +.bi-border-all::before { content: map-get($bootstrap-icons-map, "border-all"); } +.bi-border-bottom::before { content: map-get($bootstrap-icons-map, "border-bottom"); } +.bi-border-center::before { content: map-get($bootstrap-icons-map, "border-center"); } +.bi-border-inner::before { content: map-get($bootstrap-icons-map, "border-inner"); } +.bi-border-left::before { content: map-get($bootstrap-icons-map, "border-left"); } +.bi-border-middle::before { content: map-get($bootstrap-icons-map, "border-middle"); } +.bi-border-outer::before { content: map-get($bootstrap-icons-map, "border-outer"); } +.bi-border-right::before { content: map-get($bootstrap-icons-map, "border-right"); } +.bi-border-style::before { content: map-get($bootstrap-icons-map, "border-style"); } +.bi-border-top::before { content: map-get($bootstrap-icons-map, "border-top"); } +.bi-border-width::before { content: map-get($bootstrap-icons-map, "border-width"); } +.bi-border::before { content: map-get($bootstrap-icons-map, "border"); } +.bi-bounding-box-circles::before { content: map-get($bootstrap-icons-map, "bounding-box-circles"); } +.bi-bounding-box::before { content: map-get($bootstrap-icons-map, "bounding-box"); } +.bi-box-arrow-down-left::before { content: map-get($bootstrap-icons-map, "box-arrow-down-left"); } +.bi-box-arrow-down-right::before { content: map-get($bootstrap-icons-map, "box-arrow-down-right"); } +.bi-box-arrow-down::before { content: map-get($bootstrap-icons-map, "box-arrow-down"); } +.bi-box-arrow-in-down-left::before { content: map-get($bootstrap-icons-map, "box-arrow-in-down-left"); } +.bi-box-arrow-in-down-right::before { content: map-get($bootstrap-icons-map, "box-arrow-in-down-right"); } +.bi-box-arrow-in-down::before { content: map-get($bootstrap-icons-map, "box-arrow-in-down"); } +.bi-box-arrow-in-left::before { content: map-get($bootstrap-icons-map, "box-arrow-in-left"); } +.bi-box-arrow-in-right::before { content: map-get($bootstrap-icons-map, "box-arrow-in-right"); } +.bi-box-arrow-in-up-left::before { content: map-get($bootstrap-icons-map, "box-arrow-in-up-left"); } +.bi-box-arrow-in-up-right::before { content: map-get($bootstrap-icons-map, "box-arrow-in-up-right"); } +.bi-box-arrow-in-up::before { content: map-get($bootstrap-icons-map, "box-arrow-in-up"); } +.bi-box-arrow-left::before { content: map-get($bootstrap-icons-map, "box-arrow-left"); } +.bi-box-arrow-right::before { content: map-get($bootstrap-icons-map, "box-arrow-right"); } +.bi-box-arrow-up-left::before { content: map-get($bootstrap-icons-map, "box-arrow-up-left"); } +.bi-box-arrow-up-right::before { content: map-get($bootstrap-icons-map, "box-arrow-up-right"); } +.bi-box-arrow-up::before { content: map-get($bootstrap-icons-map, "box-arrow-up"); } +.bi-box-seam::before { content: map-get($bootstrap-icons-map, "box-seam"); } +.bi-box::before { content: map-get($bootstrap-icons-map, "box"); } +.bi-braces::before { content: map-get($bootstrap-icons-map, "braces"); } +.bi-bricks::before { content: map-get($bootstrap-icons-map, "bricks"); } +.bi-briefcase-fill::before { content: map-get($bootstrap-icons-map, "briefcase-fill"); } +.bi-briefcase::before { content: map-get($bootstrap-icons-map, "briefcase"); } +.bi-brightness-alt-high-fill::before { content: map-get($bootstrap-icons-map, "brightness-alt-high-fill"); } +.bi-brightness-alt-high::before { content: map-get($bootstrap-icons-map, "brightness-alt-high"); } +.bi-brightness-alt-low-fill::before { content: map-get($bootstrap-icons-map, "brightness-alt-low-fill"); } +.bi-brightness-alt-low::before { content: map-get($bootstrap-icons-map, "brightness-alt-low"); } +.bi-brightness-high-fill::before { content: map-get($bootstrap-icons-map, "brightness-high-fill"); } +.bi-brightness-high::before { content: map-get($bootstrap-icons-map, "brightness-high"); } +.bi-brightness-low-fill::before { content: map-get($bootstrap-icons-map, "brightness-low-fill"); } +.bi-brightness-low::before { content: map-get($bootstrap-icons-map, "brightness-low"); } +.bi-broadcast-pin::before { content: map-get($bootstrap-icons-map, "broadcast-pin"); } +.bi-broadcast::before { content: map-get($bootstrap-icons-map, "broadcast"); } +.bi-brush-fill::before { content: map-get($bootstrap-icons-map, "brush-fill"); } +.bi-brush::before { content: map-get($bootstrap-icons-map, "brush"); } +.bi-bucket-fill::before { content: map-get($bootstrap-icons-map, "bucket-fill"); } +.bi-bucket::before { content: map-get($bootstrap-icons-map, "bucket"); } +.bi-bug-fill::before { content: map-get($bootstrap-icons-map, "bug-fill"); } +.bi-bug::before { content: map-get($bootstrap-icons-map, "bug"); } +.bi-building::before { content: map-get($bootstrap-icons-map, "building"); } +.bi-bullseye::before { content: map-get($bootstrap-icons-map, "bullseye"); } +.bi-calculator-fill::before { content: map-get($bootstrap-icons-map, "calculator-fill"); } +.bi-calculator::before { content: map-get($bootstrap-icons-map, "calculator"); } +.bi-calendar-check-fill::before { content: map-get($bootstrap-icons-map, "calendar-check-fill"); } +.bi-calendar-check::before { content: map-get($bootstrap-icons-map, "calendar-check"); } +.bi-calendar-date-fill::before { content: map-get($bootstrap-icons-map, "calendar-date-fill"); } +.bi-calendar-date::before { content: map-get($bootstrap-icons-map, "calendar-date"); } +.bi-calendar-day-fill::before { content: map-get($bootstrap-icons-map, "calendar-day-fill"); } +.bi-calendar-day::before { content: map-get($bootstrap-icons-map, "calendar-day"); } +.bi-calendar-event-fill::before { content: map-get($bootstrap-icons-map, "calendar-event-fill"); } +.bi-calendar-event::before { content: map-get($bootstrap-icons-map, "calendar-event"); } +.bi-calendar-fill::before { content: map-get($bootstrap-icons-map, "calendar-fill"); } +.bi-calendar-minus-fill::before { content: map-get($bootstrap-icons-map, "calendar-minus-fill"); } +.bi-calendar-minus::before { content: map-get($bootstrap-icons-map, "calendar-minus"); } +.bi-calendar-month-fill::before { content: map-get($bootstrap-icons-map, "calendar-month-fill"); } +.bi-calendar-month::before { content: map-get($bootstrap-icons-map, "calendar-month"); } +.bi-calendar-plus-fill::before { content: map-get($bootstrap-icons-map, "calendar-plus-fill"); } +.bi-calendar-plus::before { content: map-get($bootstrap-icons-map, "calendar-plus"); } +.bi-calendar-range-fill::before { content: map-get($bootstrap-icons-map, "calendar-range-fill"); } +.bi-calendar-range::before { content: map-get($bootstrap-icons-map, "calendar-range"); } +.bi-calendar-week-fill::before { content: map-get($bootstrap-icons-map, "calendar-week-fill"); } +.bi-calendar-week::before { content: map-get($bootstrap-icons-map, "calendar-week"); } +.bi-calendar-x-fill::before { content: map-get($bootstrap-icons-map, "calendar-x-fill"); } +.bi-calendar-x::before { content: map-get($bootstrap-icons-map, "calendar-x"); } +.bi-calendar::before { content: map-get($bootstrap-icons-map, "calendar"); } +.bi-calendar2-check-fill::before { content: map-get($bootstrap-icons-map, "calendar2-check-fill"); } +.bi-calendar2-check::before { content: map-get($bootstrap-icons-map, "calendar2-check"); } +.bi-calendar2-date-fill::before { content: map-get($bootstrap-icons-map, "calendar2-date-fill"); } +.bi-calendar2-date::before { content: map-get($bootstrap-icons-map, "calendar2-date"); } +.bi-calendar2-day-fill::before { content: map-get($bootstrap-icons-map, "calendar2-day-fill"); } +.bi-calendar2-day::before { content: map-get($bootstrap-icons-map, "calendar2-day"); } +.bi-calendar2-event-fill::before { content: map-get($bootstrap-icons-map, "calendar2-event-fill"); } +.bi-calendar2-event::before { content: map-get($bootstrap-icons-map, "calendar2-event"); } +.bi-calendar2-fill::before { content: map-get($bootstrap-icons-map, "calendar2-fill"); } +.bi-calendar2-minus-fill::before { content: map-get($bootstrap-icons-map, "calendar2-minus-fill"); } +.bi-calendar2-minus::before { content: map-get($bootstrap-icons-map, "calendar2-minus"); } +.bi-calendar2-month-fill::before { content: map-get($bootstrap-icons-map, "calendar2-month-fill"); } +.bi-calendar2-month::before { content: map-get($bootstrap-icons-map, "calendar2-month"); } +.bi-calendar2-plus-fill::before { content: map-get($bootstrap-icons-map, "calendar2-plus-fill"); } +.bi-calendar2-plus::before { content: map-get($bootstrap-icons-map, "calendar2-plus"); } +.bi-calendar2-range-fill::before { content: map-get($bootstrap-icons-map, "calendar2-range-fill"); } +.bi-calendar2-range::before { content: map-get($bootstrap-icons-map, "calendar2-range"); } +.bi-calendar2-week-fill::before { content: map-get($bootstrap-icons-map, "calendar2-week-fill"); } +.bi-calendar2-week::before { content: map-get($bootstrap-icons-map, "calendar2-week"); } +.bi-calendar2-x-fill::before { content: map-get($bootstrap-icons-map, "calendar2-x-fill"); } +.bi-calendar2-x::before { content: map-get($bootstrap-icons-map, "calendar2-x"); } +.bi-calendar2::before { content: map-get($bootstrap-icons-map, "calendar2"); } +.bi-calendar3-event-fill::before { content: map-get($bootstrap-icons-map, "calendar3-event-fill"); } +.bi-calendar3-event::before { content: map-get($bootstrap-icons-map, "calendar3-event"); } +.bi-calendar3-fill::before { content: map-get($bootstrap-icons-map, "calendar3-fill"); } +.bi-calendar3-range-fill::before { content: map-get($bootstrap-icons-map, "calendar3-range-fill"); } +.bi-calendar3-range::before { content: map-get($bootstrap-icons-map, "calendar3-range"); } +.bi-calendar3-week-fill::before { content: map-get($bootstrap-icons-map, "calendar3-week-fill"); } +.bi-calendar3-week::before { content: map-get($bootstrap-icons-map, "calendar3-week"); } +.bi-calendar3::before { content: map-get($bootstrap-icons-map, "calendar3"); } +.bi-calendar4-event::before { content: map-get($bootstrap-icons-map, "calendar4-event"); } +.bi-calendar4-range::before { content: map-get($bootstrap-icons-map, "calendar4-range"); } +.bi-calendar4-week::before { content: map-get($bootstrap-icons-map, "calendar4-week"); } +.bi-calendar4::before { content: map-get($bootstrap-icons-map, "calendar4"); } +.bi-camera-fill::before { content: map-get($bootstrap-icons-map, "camera-fill"); } +.bi-camera-reels-fill::before { content: map-get($bootstrap-icons-map, "camera-reels-fill"); } +.bi-camera-reels::before { content: map-get($bootstrap-icons-map, "camera-reels"); } +.bi-camera-video-fill::before { content: map-get($bootstrap-icons-map, "camera-video-fill"); } +.bi-camera-video-off-fill::before { content: map-get($bootstrap-icons-map, "camera-video-off-fill"); } +.bi-camera-video-off::before { content: map-get($bootstrap-icons-map, "camera-video-off"); } +.bi-camera-video::before { content: map-get($bootstrap-icons-map, "camera-video"); } +.bi-camera::before { content: map-get($bootstrap-icons-map, "camera"); } +.bi-camera2::before { content: map-get($bootstrap-icons-map, "camera2"); } +.bi-capslock-fill::before { content: map-get($bootstrap-icons-map, "capslock-fill"); } +.bi-capslock::before { content: map-get($bootstrap-icons-map, "capslock"); } +.bi-card-checklist::before { content: map-get($bootstrap-icons-map, "card-checklist"); } +.bi-card-heading::before { content: map-get($bootstrap-icons-map, "card-heading"); } +.bi-card-image::before { content: map-get($bootstrap-icons-map, "card-image"); } +.bi-card-list::before { content: map-get($bootstrap-icons-map, "card-list"); } +.bi-card-text::before { content: map-get($bootstrap-icons-map, "card-text"); } +.bi-caret-down-fill::before { content: map-get($bootstrap-icons-map, "caret-down-fill"); } +.bi-caret-down-square-fill::before { content: map-get($bootstrap-icons-map, "caret-down-square-fill"); } +.bi-caret-down-square::before { content: map-get($bootstrap-icons-map, "caret-down-square"); } +.bi-caret-down::before { content: map-get($bootstrap-icons-map, "caret-down"); } +.bi-caret-left-fill::before { content: map-get($bootstrap-icons-map, "caret-left-fill"); } +.bi-caret-left-square-fill::before { content: map-get($bootstrap-icons-map, "caret-left-square-fill"); } +.bi-caret-left-square::before { content: map-get($bootstrap-icons-map, "caret-left-square"); } +.bi-caret-left::before { content: map-get($bootstrap-icons-map, "caret-left"); } +.bi-caret-right-fill::before { content: map-get($bootstrap-icons-map, "caret-right-fill"); } +.bi-caret-right-square-fill::before { content: map-get($bootstrap-icons-map, "caret-right-square-fill"); } +.bi-caret-right-square::before { content: map-get($bootstrap-icons-map, "caret-right-square"); } +.bi-caret-right::before { content: map-get($bootstrap-icons-map, "caret-right"); } +.bi-caret-up-fill::before { content: map-get($bootstrap-icons-map, "caret-up-fill"); } +.bi-caret-up-square-fill::before { content: map-get($bootstrap-icons-map, "caret-up-square-fill"); } +.bi-caret-up-square::before { content: map-get($bootstrap-icons-map, "caret-up-square"); } +.bi-caret-up::before { content: map-get($bootstrap-icons-map, "caret-up"); } +.bi-cart-check-fill::before { content: map-get($bootstrap-icons-map, "cart-check-fill"); } +.bi-cart-check::before { content: map-get($bootstrap-icons-map, "cart-check"); } +.bi-cart-dash-fill::before { content: map-get($bootstrap-icons-map, "cart-dash-fill"); } +.bi-cart-dash::before { content: map-get($bootstrap-icons-map, "cart-dash"); } +.bi-cart-fill::before { content: map-get($bootstrap-icons-map, "cart-fill"); } +.bi-cart-plus-fill::before { content: map-get($bootstrap-icons-map, "cart-plus-fill"); } +.bi-cart-plus::before { content: map-get($bootstrap-icons-map, "cart-plus"); } +.bi-cart-x-fill::before { content: map-get($bootstrap-icons-map, "cart-x-fill"); } +.bi-cart-x::before { content: map-get($bootstrap-icons-map, "cart-x"); } +.bi-cart::before { content: map-get($bootstrap-icons-map, "cart"); } +.bi-cart2::before { content: map-get($bootstrap-icons-map, "cart2"); } +.bi-cart3::before { content: map-get($bootstrap-icons-map, "cart3"); } +.bi-cart4::before { content: map-get($bootstrap-icons-map, "cart4"); } +.bi-cash-stack::before { content: map-get($bootstrap-icons-map, "cash-stack"); } +.bi-cash::before { content: map-get($bootstrap-icons-map, "cash"); } +.bi-cast::before { content: map-get($bootstrap-icons-map, "cast"); } +.bi-chat-dots-fill::before { content: map-get($bootstrap-icons-map, "chat-dots-fill"); } +.bi-chat-dots::before { content: map-get($bootstrap-icons-map, "chat-dots"); } +.bi-chat-fill::before { content: map-get($bootstrap-icons-map, "chat-fill"); } +.bi-chat-left-dots-fill::before { content: map-get($bootstrap-icons-map, "chat-left-dots-fill"); } +.bi-chat-left-dots::before { content: map-get($bootstrap-icons-map, "chat-left-dots"); } +.bi-chat-left-fill::before { content: map-get($bootstrap-icons-map, "chat-left-fill"); } +.bi-chat-left-quote-fill::before { content: map-get($bootstrap-icons-map, "chat-left-quote-fill"); } +.bi-chat-left-quote::before { content: map-get($bootstrap-icons-map, "chat-left-quote"); } +.bi-chat-left-text-fill::before { content: map-get($bootstrap-icons-map, "chat-left-text-fill"); } +.bi-chat-left-text::before { content: map-get($bootstrap-icons-map, "chat-left-text"); } +.bi-chat-left::before { content: map-get($bootstrap-icons-map, "chat-left"); } +.bi-chat-quote-fill::before { content: map-get($bootstrap-icons-map, "chat-quote-fill"); } +.bi-chat-quote::before { content: map-get($bootstrap-icons-map, "chat-quote"); } +.bi-chat-right-dots-fill::before { content: map-get($bootstrap-icons-map, "chat-right-dots-fill"); } +.bi-chat-right-dots::before { content: map-get($bootstrap-icons-map, "chat-right-dots"); } +.bi-chat-right-fill::before { content: map-get($bootstrap-icons-map, "chat-right-fill"); } +.bi-chat-right-quote-fill::before { content: map-get($bootstrap-icons-map, "chat-right-quote-fill"); } +.bi-chat-right-quote::before { content: map-get($bootstrap-icons-map, "chat-right-quote"); } +.bi-chat-right-text-fill::before { content: map-get($bootstrap-icons-map, "chat-right-text-fill"); } +.bi-chat-right-text::before { content: map-get($bootstrap-icons-map, "chat-right-text"); } +.bi-chat-right::before { content: map-get($bootstrap-icons-map, "chat-right"); } +.bi-chat-square-dots-fill::before { content: map-get($bootstrap-icons-map, "chat-square-dots-fill"); } +.bi-chat-square-dots::before { content: map-get($bootstrap-icons-map, "chat-square-dots"); } +.bi-chat-square-fill::before { content: map-get($bootstrap-icons-map, "chat-square-fill"); } +.bi-chat-square-quote-fill::before { content: map-get($bootstrap-icons-map, "chat-square-quote-fill"); } +.bi-chat-square-quote::before { content: map-get($bootstrap-icons-map, "chat-square-quote"); } +.bi-chat-square-text-fill::before { content: map-get($bootstrap-icons-map, "chat-square-text-fill"); } +.bi-chat-square-text::before { content: map-get($bootstrap-icons-map, "chat-square-text"); } +.bi-chat-square::before { content: map-get($bootstrap-icons-map, "chat-square"); } +.bi-chat-text-fill::before { content: map-get($bootstrap-icons-map, "chat-text-fill"); } +.bi-chat-text::before { content: map-get($bootstrap-icons-map, "chat-text"); } +.bi-chat::before { content: map-get($bootstrap-icons-map, "chat"); } +.bi-check-all::before { content: map-get($bootstrap-icons-map, "check-all"); } +.bi-check-circle-fill::before { content: map-get($bootstrap-icons-map, "check-circle-fill"); } +.bi-check-circle::before { content: map-get($bootstrap-icons-map, "check-circle"); } +.bi-check-square-fill::before { content: map-get($bootstrap-icons-map, "check-square-fill"); } +.bi-check-square::before { content: map-get($bootstrap-icons-map, "check-square"); } +.bi-check::before { content: map-get($bootstrap-icons-map, "check"); } +.bi-check2-all::before { content: map-get($bootstrap-icons-map, "check2-all"); } +.bi-check2-circle::before { content: map-get($bootstrap-icons-map, "check2-circle"); } +.bi-check2-square::before { content: map-get($bootstrap-icons-map, "check2-square"); } +.bi-check2::before { content: map-get($bootstrap-icons-map, "check2"); } +.bi-chevron-bar-contract::before { content: map-get($bootstrap-icons-map, "chevron-bar-contract"); } +.bi-chevron-bar-down::before { content: map-get($bootstrap-icons-map, "chevron-bar-down"); } +.bi-chevron-bar-expand::before { content: map-get($bootstrap-icons-map, "chevron-bar-expand"); } +.bi-chevron-bar-left::before { content: map-get($bootstrap-icons-map, "chevron-bar-left"); } +.bi-chevron-bar-right::before { content: map-get($bootstrap-icons-map, "chevron-bar-right"); } +.bi-chevron-bar-up::before { content: map-get($bootstrap-icons-map, "chevron-bar-up"); } +.bi-chevron-compact-down::before { content: map-get($bootstrap-icons-map, "chevron-compact-down"); } +.bi-chevron-compact-left::before { content: map-get($bootstrap-icons-map, "chevron-compact-left"); } +.bi-chevron-compact-right::before { content: map-get($bootstrap-icons-map, "chevron-compact-right"); } +.bi-chevron-compact-up::before { content: map-get($bootstrap-icons-map, "chevron-compact-up"); } +.bi-chevron-contract::before { content: map-get($bootstrap-icons-map, "chevron-contract"); } +.bi-chevron-double-down::before { content: map-get($bootstrap-icons-map, "chevron-double-down"); } +.bi-chevron-double-left::before { content: map-get($bootstrap-icons-map, "chevron-double-left"); } +.bi-chevron-double-right::before { content: map-get($bootstrap-icons-map, "chevron-double-right"); } +.bi-chevron-double-up::before { content: map-get($bootstrap-icons-map, "chevron-double-up"); } +.bi-chevron-down::before { content: map-get($bootstrap-icons-map, "chevron-down"); } +.bi-chevron-expand::before { content: map-get($bootstrap-icons-map, "chevron-expand"); } +.bi-chevron-left::before { content: map-get($bootstrap-icons-map, "chevron-left"); } +.bi-chevron-right::before { content: map-get($bootstrap-icons-map, "chevron-right"); } +.bi-chevron-up::before { content: map-get($bootstrap-icons-map, "chevron-up"); } +.bi-circle-fill::before { content: map-get($bootstrap-icons-map, "circle-fill"); } +.bi-circle-half::before { content: map-get($bootstrap-icons-map, "circle-half"); } +.bi-circle-square::before { content: map-get($bootstrap-icons-map, "circle-square"); } +.bi-circle::before { content: map-get($bootstrap-icons-map, "circle"); } +.bi-clipboard-check::before { content: map-get($bootstrap-icons-map, "clipboard-check"); } +.bi-clipboard-data::before { content: map-get($bootstrap-icons-map, "clipboard-data"); } +.bi-clipboard-minus::before { content: map-get($bootstrap-icons-map, "clipboard-minus"); } +.bi-clipboard-plus::before { content: map-get($bootstrap-icons-map, "clipboard-plus"); } +.bi-clipboard-x::before { content: map-get($bootstrap-icons-map, "clipboard-x"); } +.bi-clipboard::before { content: map-get($bootstrap-icons-map, "clipboard"); } +.bi-clock-fill::before { content: map-get($bootstrap-icons-map, "clock-fill"); } +.bi-clock-history::before { content: map-get($bootstrap-icons-map, "clock-history"); } +.bi-clock::before { content: map-get($bootstrap-icons-map, "clock"); } +.bi-cloud-arrow-down-fill::before { content: map-get($bootstrap-icons-map, "cloud-arrow-down-fill"); } +.bi-cloud-arrow-down::before { content: map-get($bootstrap-icons-map, "cloud-arrow-down"); } +.bi-cloud-arrow-up-fill::before { content: map-get($bootstrap-icons-map, "cloud-arrow-up-fill"); } +.bi-cloud-arrow-up::before { content: map-get($bootstrap-icons-map, "cloud-arrow-up"); } +.bi-cloud-check-fill::before { content: map-get($bootstrap-icons-map, "cloud-check-fill"); } +.bi-cloud-check::before { content: map-get($bootstrap-icons-map, "cloud-check"); } +.bi-cloud-download-fill::before { content: map-get($bootstrap-icons-map, "cloud-download-fill"); } +.bi-cloud-download::before { content: map-get($bootstrap-icons-map, "cloud-download"); } +.bi-cloud-drizzle-fill::before { content: map-get($bootstrap-icons-map, "cloud-drizzle-fill"); } +.bi-cloud-drizzle::before { content: map-get($bootstrap-icons-map, "cloud-drizzle"); } +.bi-cloud-fill::before { content: map-get($bootstrap-icons-map, "cloud-fill"); } +.bi-cloud-fog-fill::before { content: map-get($bootstrap-icons-map, "cloud-fog-fill"); } +.bi-cloud-fog::before { content: map-get($bootstrap-icons-map, "cloud-fog"); } +.bi-cloud-fog2-fill::before { content: map-get($bootstrap-icons-map, "cloud-fog2-fill"); } +.bi-cloud-fog2::before { content: map-get($bootstrap-icons-map, "cloud-fog2"); } +.bi-cloud-hail-fill::before { content: map-get($bootstrap-icons-map, "cloud-hail-fill"); } +.bi-cloud-hail::before { content: map-get($bootstrap-icons-map, "cloud-hail"); } +.bi-cloud-haze-1::before { content: map-get($bootstrap-icons-map, "cloud-haze-1"); } +.bi-cloud-haze-fill::before { content: map-get($bootstrap-icons-map, "cloud-haze-fill"); } +.bi-cloud-haze::before { content: map-get($bootstrap-icons-map, "cloud-haze"); } +.bi-cloud-haze2-fill::before { content: map-get($bootstrap-icons-map, "cloud-haze2-fill"); } +.bi-cloud-lightning-fill::before { content: map-get($bootstrap-icons-map, "cloud-lightning-fill"); } +.bi-cloud-lightning-rain-fill::before { content: map-get($bootstrap-icons-map, "cloud-lightning-rain-fill"); } +.bi-cloud-lightning-rain::before { content: map-get($bootstrap-icons-map, "cloud-lightning-rain"); } +.bi-cloud-lightning::before { content: map-get($bootstrap-icons-map, "cloud-lightning"); } +.bi-cloud-minus-fill::before { content: map-get($bootstrap-icons-map, "cloud-minus-fill"); } +.bi-cloud-minus::before { content: map-get($bootstrap-icons-map, "cloud-minus"); } +.bi-cloud-moon-fill::before { content: map-get($bootstrap-icons-map, "cloud-moon-fill"); } +.bi-cloud-moon::before { content: map-get($bootstrap-icons-map, "cloud-moon"); } +.bi-cloud-plus-fill::before { content: map-get($bootstrap-icons-map, "cloud-plus-fill"); } +.bi-cloud-plus::before { content: map-get($bootstrap-icons-map, "cloud-plus"); } +.bi-cloud-rain-fill::before { content: map-get($bootstrap-icons-map, "cloud-rain-fill"); } +.bi-cloud-rain-heavy-fill::before { content: map-get($bootstrap-icons-map, "cloud-rain-heavy-fill"); } +.bi-cloud-rain-heavy::before { content: map-get($bootstrap-icons-map, "cloud-rain-heavy"); } +.bi-cloud-rain::before { content: map-get($bootstrap-icons-map, "cloud-rain"); } +.bi-cloud-slash-fill::before { content: map-get($bootstrap-icons-map, "cloud-slash-fill"); } +.bi-cloud-slash::before { content: map-get($bootstrap-icons-map, "cloud-slash"); } +.bi-cloud-sleet-fill::before { content: map-get($bootstrap-icons-map, "cloud-sleet-fill"); } +.bi-cloud-sleet::before { content: map-get($bootstrap-icons-map, "cloud-sleet"); } +.bi-cloud-snow-fill::before { content: map-get($bootstrap-icons-map, "cloud-snow-fill"); } +.bi-cloud-snow::before { content: map-get($bootstrap-icons-map, "cloud-snow"); } +.bi-cloud-sun-fill::before { content: map-get($bootstrap-icons-map, "cloud-sun-fill"); } +.bi-cloud-sun::before { content: map-get($bootstrap-icons-map, "cloud-sun"); } +.bi-cloud-upload-fill::before { content: map-get($bootstrap-icons-map, "cloud-upload-fill"); } +.bi-cloud-upload::before { content: map-get($bootstrap-icons-map, "cloud-upload"); } +.bi-cloud::before { content: map-get($bootstrap-icons-map, "cloud"); } +.bi-clouds-fill::before { content: map-get($bootstrap-icons-map, "clouds-fill"); } +.bi-clouds::before { content: map-get($bootstrap-icons-map, "clouds"); } +.bi-cloudy-fill::before { content: map-get($bootstrap-icons-map, "cloudy-fill"); } +.bi-cloudy::before { content: map-get($bootstrap-icons-map, "cloudy"); } +.bi-code-slash::before { content: map-get($bootstrap-icons-map, "code-slash"); } +.bi-code-square::before { content: map-get($bootstrap-icons-map, "code-square"); } +.bi-code::before { content: map-get($bootstrap-icons-map, "code"); } +.bi-collection-fill::before { content: map-get($bootstrap-icons-map, "collection-fill"); } +.bi-collection-play-fill::before { content: map-get($bootstrap-icons-map, "collection-play-fill"); } +.bi-collection-play::before { content: map-get($bootstrap-icons-map, "collection-play"); } +.bi-collection::before { content: map-get($bootstrap-icons-map, "collection"); } +.bi-columns-gap::before { content: map-get($bootstrap-icons-map, "columns-gap"); } +.bi-columns::before { content: map-get($bootstrap-icons-map, "columns"); } +.bi-command::before { content: map-get($bootstrap-icons-map, "command"); } +.bi-compass-fill::before { content: map-get($bootstrap-icons-map, "compass-fill"); } +.bi-compass::before { content: map-get($bootstrap-icons-map, "compass"); } +.bi-cone-striped::before { content: map-get($bootstrap-icons-map, "cone-striped"); } +.bi-cone::before { content: map-get($bootstrap-icons-map, "cone"); } +.bi-controller::before { content: map-get($bootstrap-icons-map, "controller"); } +.bi-cpu-fill::before { content: map-get($bootstrap-icons-map, "cpu-fill"); } +.bi-cpu::before { content: map-get($bootstrap-icons-map, "cpu"); } +.bi-credit-card-2-back-fill::before { content: map-get($bootstrap-icons-map, "credit-card-2-back-fill"); } +.bi-credit-card-2-back::before { content: map-get($bootstrap-icons-map, "credit-card-2-back"); } +.bi-credit-card-2-front-fill::before { content: map-get($bootstrap-icons-map, "credit-card-2-front-fill"); } +.bi-credit-card-2-front::before { content: map-get($bootstrap-icons-map, "credit-card-2-front"); } +.bi-credit-card-fill::before { content: map-get($bootstrap-icons-map, "credit-card-fill"); } +.bi-credit-card::before { content: map-get($bootstrap-icons-map, "credit-card"); } +.bi-crop::before { content: map-get($bootstrap-icons-map, "crop"); } +.bi-cup-fill::before { content: map-get($bootstrap-icons-map, "cup-fill"); } +.bi-cup-straw::before { content: map-get($bootstrap-icons-map, "cup-straw"); } +.bi-cup::before { content: map-get($bootstrap-icons-map, "cup"); } +.bi-cursor-fill::before { content: map-get($bootstrap-icons-map, "cursor-fill"); } +.bi-cursor-text::before { content: map-get($bootstrap-icons-map, "cursor-text"); } +.bi-cursor::before { content: map-get($bootstrap-icons-map, "cursor"); } +.bi-dash-circle-dotted::before { content: map-get($bootstrap-icons-map, "dash-circle-dotted"); } +.bi-dash-circle-fill::before { content: map-get($bootstrap-icons-map, "dash-circle-fill"); } +.bi-dash-circle::before { content: map-get($bootstrap-icons-map, "dash-circle"); } +.bi-dash-square-dotted::before { content: map-get($bootstrap-icons-map, "dash-square-dotted"); } +.bi-dash-square-fill::before { content: map-get($bootstrap-icons-map, "dash-square-fill"); } +.bi-dash-square::before { content: map-get($bootstrap-icons-map, "dash-square"); } +.bi-dash::before { content: map-get($bootstrap-icons-map, "dash"); } +.bi-diagram-2-fill::before { content: map-get($bootstrap-icons-map, "diagram-2-fill"); } +.bi-diagram-2::before { content: map-get($bootstrap-icons-map, "diagram-2"); } +.bi-diagram-3-fill::before { content: map-get($bootstrap-icons-map, "diagram-3-fill"); } +.bi-diagram-3::before { content: map-get($bootstrap-icons-map, "diagram-3"); } +.bi-diamond-fill::before { content: map-get($bootstrap-icons-map, "diamond-fill"); } +.bi-diamond-half::before { content: map-get($bootstrap-icons-map, "diamond-half"); } +.bi-diamond::before { content: map-get($bootstrap-icons-map, "diamond"); } +.bi-dice-1-fill::before { content: map-get($bootstrap-icons-map, "dice-1-fill"); } +.bi-dice-1::before { content: map-get($bootstrap-icons-map, "dice-1"); } +.bi-dice-2-fill::before { content: map-get($bootstrap-icons-map, "dice-2-fill"); } +.bi-dice-2::before { content: map-get($bootstrap-icons-map, "dice-2"); } +.bi-dice-3-fill::before { content: map-get($bootstrap-icons-map, "dice-3-fill"); } +.bi-dice-3::before { content: map-get($bootstrap-icons-map, "dice-3"); } +.bi-dice-4-fill::before { content: map-get($bootstrap-icons-map, "dice-4-fill"); } +.bi-dice-4::before { content: map-get($bootstrap-icons-map, "dice-4"); } +.bi-dice-5-fill::before { content: map-get($bootstrap-icons-map, "dice-5-fill"); } +.bi-dice-5::before { content: map-get($bootstrap-icons-map, "dice-5"); } +.bi-dice-6-fill::before { content: map-get($bootstrap-icons-map, "dice-6-fill"); } +.bi-dice-6::before { content: map-get($bootstrap-icons-map, "dice-6"); } +.bi-disc-fill::before { content: map-get($bootstrap-icons-map, "disc-fill"); } +.bi-disc::before { content: map-get($bootstrap-icons-map, "disc"); } +.bi-discord::before { content: map-get($bootstrap-icons-map, "discord"); } +.bi-display-fill::before { content: map-get($bootstrap-icons-map, "display-fill"); } +.bi-display::before { content: map-get($bootstrap-icons-map, "display"); } +.bi-distribute-horizontal::before { content: map-get($bootstrap-icons-map, "distribute-horizontal"); } +.bi-distribute-vertical::before { content: map-get($bootstrap-icons-map, "distribute-vertical"); } +.bi-door-closed-fill::before { content: map-get($bootstrap-icons-map, "door-closed-fill"); } +.bi-door-closed::before { content: map-get($bootstrap-icons-map, "door-closed"); } +.bi-door-open-fill::before { content: map-get($bootstrap-icons-map, "door-open-fill"); } +.bi-door-open::before { content: map-get($bootstrap-icons-map, "door-open"); } +.bi-dot::before { content: map-get($bootstrap-icons-map, "dot"); } +.bi-download::before { content: map-get($bootstrap-icons-map, "download"); } +.bi-droplet-fill::before { content: map-get($bootstrap-icons-map, "droplet-fill"); } +.bi-droplet-half::before { content: map-get($bootstrap-icons-map, "droplet-half"); } +.bi-droplet::before { content: map-get($bootstrap-icons-map, "droplet"); } +.bi-earbuds::before { content: map-get($bootstrap-icons-map, "earbuds"); } +.bi-easel-fill::before { content: map-get($bootstrap-icons-map, "easel-fill"); } +.bi-easel::before { content: map-get($bootstrap-icons-map, "easel"); } +.bi-egg-fill::before { content: map-get($bootstrap-icons-map, "egg-fill"); } +.bi-egg-fried::before { content: map-get($bootstrap-icons-map, "egg-fried"); } +.bi-egg::before { content: map-get($bootstrap-icons-map, "egg"); } +.bi-eject-fill::before { content: map-get($bootstrap-icons-map, "eject-fill"); } +.bi-eject::before { content: map-get($bootstrap-icons-map, "eject"); } +.bi-emoji-angry-fill::before { content: map-get($bootstrap-icons-map, "emoji-angry-fill"); } +.bi-emoji-angry::before { content: map-get($bootstrap-icons-map, "emoji-angry"); } +.bi-emoji-dizzy-fill::before { content: map-get($bootstrap-icons-map, "emoji-dizzy-fill"); } +.bi-emoji-dizzy::before { content: map-get($bootstrap-icons-map, "emoji-dizzy"); } +.bi-emoji-expressionless-fill::before { content: map-get($bootstrap-icons-map, "emoji-expressionless-fill"); } +.bi-emoji-expressionless::before { content: map-get($bootstrap-icons-map, "emoji-expressionless"); } +.bi-emoji-frown-fill::before { content: map-get($bootstrap-icons-map, "emoji-frown-fill"); } +.bi-emoji-frown::before { content: map-get($bootstrap-icons-map, "emoji-frown"); } +.bi-emoji-heart-eyes-fill::before { content: map-get($bootstrap-icons-map, "emoji-heart-eyes-fill"); } +.bi-emoji-heart-eyes::before { content: map-get($bootstrap-icons-map, "emoji-heart-eyes"); } +.bi-emoji-laughing-fill::before { content: map-get($bootstrap-icons-map, "emoji-laughing-fill"); } +.bi-emoji-laughing::before { content: map-get($bootstrap-icons-map, "emoji-laughing"); } +.bi-emoji-neutral-fill::before { content: map-get($bootstrap-icons-map, "emoji-neutral-fill"); } +.bi-emoji-neutral::before { content: map-get($bootstrap-icons-map, "emoji-neutral"); } +.bi-emoji-smile-fill::before { content: map-get($bootstrap-icons-map, "emoji-smile-fill"); } +.bi-emoji-smile-upside-down-fill::before { content: map-get($bootstrap-icons-map, "emoji-smile-upside-down-fill"); } +.bi-emoji-smile-upside-down::before { content: map-get($bootstrap-icons-map, "emoji-smile-upside-down"); } +.bi-emoji-smile::before { content: map-get($bootstrap-icons-map, "emoji-smile"); } +.bi-emoji-sunglasses-fill::before { content: map-get($bootstrap-icons-map, "emoji-sunglasses-fill"); } +.bi-emoji-sunglasses::before { content: map-get($bootstrap-icons-map, "emoji-sunglasses"); } +.bi-emoji-wink-fill::before { content: map-get($bootstrap-icons-map, "emoji-wink-fill"); } +.bi-emoji-wink::before { content: map-get($bootstrap-icons-map, "emoji-wink"); } +.bi-envelope-fill::before { content: map-get($bootstrap-icons-map, "envelope-fill"); } +.bi-envelope-open-fill::before { content: map-get($bootstrap-icons-map, "envelope-open-fill"); } +.bi-envelope-open::before { content: map-get($bootstrap-icons-map, "envelope-open"); } +.bi-envelope::before { content: map-get($bootstrap-icons-map, "envelope"); } +.bi-eraser-fill::before { content: map-get($bootstrap-icons-map, "eraser-fill"); } +.bi-eraser::before { content: map-get($bootstrap-icons-map, "eraser"); } +.bi-exclamation-circle-fill::before { content: map-get($bootstrap-icons-map, "exclamation-circle-fill"); } +.bi-exclamation-circle::before { content: map-get($bootstrap-icons-map, "exclamation-circle"); } +.bi-exclamation-diamond-fill::before { content: map-get($bootstrap-icons-map, "exclamation-diamond-fill"); } +.bi-exclamation-diamond::before { content: map-get($bootstrap-icons-map, "exclamation-diamond"); } +.bi-exclamation-octagon-fill::before { content: map-get($bootstrap-icons-map, "exclamation-octagon-fill"); } +.bi-exclamation-octagon::before { content: map-get($bootstrap-icons-map, "exclamation-octagon"); } +.bi-exclamation-square-fill::before { content: map-get($bootstrap-icons-map, "exclamation-square-fill"); } +.bi-exclamation-square::before { content: map-get($bootstrap-icons-map, "exclamation-square"); } +.bi-exclamation-triangle-fill::before { content: map-get($bootstrap-icons-map, "exclamation-triangle-fill"); } +.bi-exclamation-triangle::before { content: map-get($bootstrap-icons-map, "exclamation-triangle"); } +.bi-exclamation::before { content: map-get($bootstrap-icons-map, "exclamation"); } +.bi-exclude::before { content: map-get($bootstrap-icons-map, "exclude"); } +.bi-eye-fill::before { content: map-get($bootstrap-icons-map, "eye-fill"); } +.bi-eye-slash-fill::before { content: map-get($bootstrap-icons-map, "eye-slash-fill"); } +.bi-eye-slash::before { content: map-get($bootstrap-icons-map, "eye-slash"); } +.bi-eye::before { content: map-get($bootstrap-icons-map, "eye"); } +.bi-eyedropper::before { content: map-get($bootstrap-icons-map, "eyedropper"); } +.bi-eyeglasses::before { content: map-get($bootstrap-icons-map, "eyeglasses"); } +.bi-facebook::before { content: map-get($bootstrap-icons-map, "facebook"); } +.bi-file-arrow-down-fill::before { content: map-get($bootstrap-icons-map, "file-arrow-down-fill"); } +.bi-file-arrow-down::before { content: map-get($bootstrap-icons-map, "file-arrow-down"); } +.bi-file-arrow-up-fill::before { content: map-get($bootstrap-icons-map, "file-arrow-up-fill"); } +.bi-file-arrow-up::before { content: map-get($bootstrap-icons-map, "file-arrow-up"); } +.bi-file-bar-graph-fill::before { content: map-get($bootstrap-icons-map, "file-bar-graph-fill"); } +.bi-file-bar-graph::before { content: map-get($bootstrap-icons-map, "file-bar-graph"); } +.bi-file-binary-fill::before { content: map-get($bootstrap-icons-map, "file-binary-fill"); } +.bi-file-binary::before { content: map-get($bootstrap-icons-map, "file-binary"); } +.bi-file-break-fill::before { content: map-get($bootstrap-icons-map, "file-break-fill"); } +.bi-file-break::before { content: map-get($bootstrap-icons-map, "file-break"); } +.bi-file-check-fill::before { content: map-get($bootstrap-icons-map, "file-check-fill"); } +.bi-file-check::before { content: map-get($bootstrap-icons-map, "file-check"); } +.bi-file-code-fill::before { content: map-get($bootstrap-icons-map, "file-code-fill"); } +.bi-file-code::before { content: map-get($bootstrap-icons-map, "file-code"); } +.bi-file-diff-fill::before { content: map-get($bootstrap-icons-map, "file-diff-fill"); } +.bi-file-diff::before { content: map-get($bootstrap-icons-map, "file-diff"); } +.bi-file-earmark-arrow-down-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-arrow-down-fill"); } +.bi-file-earmark-arrow-down::before { content: map-get($bootstrap-icons-map, "file-earmark-arrow-down"); } +.bi-file-earmark-arrow-up-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-arrow-up-fill"); } +.bi-file-earmark-arrow-up::before { content: map-get($bootstrap-icons-map, "file-earmark-arrow-up"); } +.bi-file-earmark-bar-graph-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-bar-graph-fill"); } +.bi-file-earmark-bar-graph::before { content: map-get($bootstrap-icons-map, "file-earmark-bar-graph"); } +.bi-file-earmark-binary-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-binary-fill"); } +.bi-file-earmark-binary::before { content: map-get($bootstrap-icons-map, "file-earmark-binary"); } +.bi-file-earmark-break-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-break-fill"); } +.bi-file-earmark-break::before { content: map-get($bootstrap-icons-map, "file-earmark-break"); } +.bi-file-earmark-check-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-check-fill"); } +.bi-file-earmark-check::before { content: map-get($bootstrap-icons-map, "file-earmark-check"); } +.bi-file-earmark-code-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-code-fill"); } +.bi-file-earmark-code::before { content: map-get($bootstrap-icons-map, "file-earmark-code"); } +.bi-file-earmark-diff-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-diff-fill"); } +.bi-file-earmark-diff::before { content: map-get($bootstrap-icons-map, "file-earmark-diff"); } +.bi-file-earmark-easel-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-easel-fill"); } +.bi-file-earmark-easel::before { content: map-get($bootstrap-icons-map, "file-earmark-easel"); } +.bi-file-earmark-excel-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-excel-fill"); } +.bi-file-earmark-excel::before { content: map-get($bootstrap-icons-map, "file-earmark-excel"); } +.bi-file-earmark-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-fill"); } +.bi-file-earmark-font-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-font-fill"); } +.bi-file-earmark-font::before { content: map-get($bootstrap-icons-map, "file-earmark-font"); } +.bi-file-earmark-image-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-image-fill"); } +.bi-file-earmark-image::before { content: map-get($bootstrap-icons-map, "file-earmark-image"); } +.bi-file-earmark-lock-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-lock-fill"); } +.bi-file-earmark-lock::before { content: map-get($bootstrap-icons-map, "file-earmark-lock"); } +.bi-file-earmark-lock2-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-lock2-fill"); } +.bi-file-earmark-lock2::before { content: map-get($bootstrap-icons-map, "file-earmark-lock2"); } +.bi-file-earmark-medical-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-medical-fill"); } +.bi-file-earmark-medical::before { content: map-get($bootstrap-icons-map, "file-earmark-medical"); } +.bi-file-earmark-minus-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-minus-fill"); } +.bi-file-earmark-minus::before { content: map-get($bootstrap-icons-map, "file-earmark-minus"); } +.bi-file-earmark-music-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-music-fill"); } +.bi-file-earmark-music::before { content: map-get($bootstrap-icons-map, "file-earmark-music"); } +.bi-file-earmark-person-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-person-fill"); } +.bi-file-earmark-person::before { content: map-get($bootstrap-icons-map, "file-earmark-person"); } +.bi-file-earmark-play-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-play-fill"); } +.bi-file-earmark-play::before { content: map-get($bootstrap-icons-map, "file-earmark-play"); } +.bi-file-earmark-plus-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-plus-fill"); } +.bi-file-earmark-plus::before { content: map-get($bootstrap-icons-map, "file-earmark-plus"); } +.bi-file-earmark-post-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-post-fill"); } +.bi-file-earmark-post::before { content: map-get($bootstrap-icons-map, "file-earmark-post"); } +.bi-file-earmark-ppt-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-ppt-fill"); } +.bi-file-earmark-ppt::before { content: map-get($bootstrap-icons-map, "file-earmark-ppt"); } +.bi-file-earmark-richtext-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-richtext-fill"); } +.bi-file-earmark-richtext::before { content: map-get($bootstrap-icons-map, "file-earmark-richtext"); } +.bi-file-earmark-ruled-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-ruled-fill"); } +.bi-file-earmark-ruled::before { content: map-get($bootstrap-icons-map, "file-earmark-ruled"); } +.bi-file-earmark-slides-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-slides-fill"); } +.bi-file-earmark-slides::before { content: map-get($bootstrap-icons-map, "file-earmark-slides"); } +.bi-file-earmark-spreadsheet-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-spreadsheet-fill"); } +.bi-file-earmark-spreadsheet::before { content: map-get($bootstrap-icons-map, "file-earmark-spreadsheet"); } +.bi-file-earmark-text-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-text-fill"); } +.bi-file-earmark-text::before { content: map-get($bootstrap-icons-map, "file-earmark-text"); } +.bi-file-earmark-word-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-word-fill"); } +.bi-file-earmark-word::before { content: map-get($bootstrap-icons-map, "file-earmark-word"); } +.bi-file-earmark-x-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-x-fill"); } +.bi-file-earmark-x::before { content: map-get($bootstrap-icons-map, "file-earmark-x"); } +.bi-file-earmark-zip-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-zip-fill"); } +.bi-file-earmark-zip::before { content: map-get($bootstrap-icons-map, "file-earmark-zip"); } +.bi-file-earmark::before { content: map-get($bootstrap-icons-map, "file-earmark"); } +.bi-file-easel-fill::before { content: map-get($bootstrap-icons-map, "file-easel-fill"); } +.bi-file-easel::before { content: map-get($bootstrap-icons-map, "file-easel"); } +.bi-file-excel-fill::before { content: map-get($bootstrap-icons-map, "file-excel-fill"); } +.bi-file-excel::before { content: map-get($bootstrap-icons-map, "file-excel"); } +.bi-file-fill::before { content: map-get($bootstrap-icons-map, "file-fill"); } +.bi-file-font-fill::before { content: map-get($bootstrap-icons-map, "file-font-fill"); } +.bi-file-font::before { content: map-get($bootstrap-icons-map, "file-font"); } +.bi-file-image-fill::before { content: map-get($bootstrap-icons-map, "file-image-fill"); } +.bi-file-image::before { content: map-get($bootstrap-icons-map, "file-image"); } +.bi-file-lock-fill::before { content: map-get($bootstrap-icons-map, "file-lock-fill"); } +.bi-file-lock::before { content: map-get($bootstrap-icons-map, "file-lock"); } +.bi-file-lock2-fill::before { content: map-get($bootstrap-icons-map, "file-lock2-fill"); } +.bi-file-lock2::before { content: map-get($bootstrap-icons-map, "file-lock2"); } +.bi-file-medical-fill::before { content: map-get($bootstrap-icons-map, "file-medical-fill"); } +.bi-file-medical::before { content: map-get($bootstrap-icons-map, "file-medical"); } +.bi-file-minus-fill::before { content: map-get($bootstrap-icons-map, "file-minus-fill"); } +.bi-file-minus::before { content: map-get($bootstrap-icons-map, "file-minus"); } +.bi-file-music-fill::before { content: map-get($bootstrap-icons-map, "file-music-fill"); } +.bi-file-music::before { content: map-get($bootstrap-icons-map, "file-music"); } +.bi-file-person-fill::before { content: map-get($bootstrap-icons-map, "file-person-fill"); } +.bi-file-person::before { content: map-get($bootstrap-icons-map, "file-person"); } +.bi-file-play-fill::before { content: map-get($bootstrap-icons-map, "file-play-fill"); } +.bi-file-play::before { content: map-get($bootstrap-icons-map, "file-play"); } +.bi-file-plus-fill::before { content: map-get($bootstrap-icons-map, "file-plus-fill"); } +.bi-file-plus::before { content: map-get($bootstrap-icons-map, "file-plus"); } +.bi-file-post-fill::before { content: map-get($bootstrap-icons-map, "file-post-fill"); } +.bi-file-post::before { content: map-get($bootstrap-icons-map, "file-post"); } +.bi-file-ppt-fill::before { content: map-get($bootstrap-icons-map, "file-ppt-fill"); } +.bi-file-ppt::before { content: map-get($bootstrap-icons-map, "file-ppt"); } +.bi-file-richtext-fill::before { content: map-get($bootstrap-icons-map, "file-richtext-fill"); } +.bi-file-richtext::before { content: map-get($bootstrap-icons-map, "file-richtext"); } +.bi-file-ruled-fill::before { content: map-get($bootstrap-icons-map, "file-ruled-fill"); } +.bi-file-ruled::before { content: map-get($bootstrap-icons-map, "file-ruled"); } +.bi-file-slides-fill::before { content: map-get($bootstrap-icons-map, "file-slides-fill"); } +.bi-file-slides::before { content: map-get($bootstrap-icons-map, "file-slides"); } +.bi-file-spreadsheet-fill::before { content: map-get($bootstrap-icons-map, "file-spreadsheet-fill"); } +.bi-file-spreadsheet::before { content: map-get($bootstrap-icons-map, "file-spreadsheet"); } +.bi-file-text-fill::before { content: map-get($bootstrap-icons-map, "file-text-fill"); } +.bi-file-text::before { content: map-get($bootstrap-icons-map, "file-text"); } +.bi-file-word-fill::before { content: map-get($bootstrap-icons-map, "file-word-fill"); } +.bi-file-word::before { content: map-get($bootstrap-icons-map, "file-word"); } +.bi-file-x-fill::before { content: map-get($bootstrap-icons-map, "file-x-fill"); } +.bi-file-x::before { content: map-get($bootstrap-icons-map, "file-x"); } +.bi-file-zip-fill::before { content: map-get($bootstrap-icons-map, "file-zip-fill"); } +.bi-file-zip::before { content: map-get($bootstrap-icons-map, "file-zip"); } +.bi-file::before { content: map-get($bootstrap-icons-map, "file"); } +.bi-files-alt::before { content: map-get($bootstrap-icons-map, "files-alt"); } +.bi-files::before { content: map-get($bootstrap-icons-map, "files"); } +.bi-film::before { content: map-get($bootstrap-icons-map, "film"); } +.bi-filter-circle-fill::before { content: map-get($bootstrap-icons-map, "filter-circle-fill"); } +.bi-filter-circle::before { content: map-get($bootstrap-icons-map, "filter-circle"); } +.bi-filter-left::before { content: map-get($bootstrap-icons-map, "filter-left"); } +.bi-filter-right::before { content: map-get($bootstrap-icons-map, "filter-right"); } +.bi-filter-square-fill::before { content: map-get($bootstrap-icons-map, "filter-square-fill"); } +.bi-filter-square::before { content: map-get($bootstrap-icons-map, "filter-square"); } +.bi-filter::before { content: map-get($bootstrap-icons-map, "filter"); } +.bi-flag-fill::before { content: map-get($bootstrap-icons-map, "flag-fill"); } +.bi-flag::before { content: map-get($bootstrap-icons-map, "flag"); } +.bi-flower1::before { content: map-get($bootstrap-icons-map, "flower1"); } +.bi-flower2::before { content: map-get($bootstrap-icons-map, "flower2"); } +.bi-flower3::before { content: map-get($bootstrap-icons-map, "flower3"); } +.bi-folder-check::before { content: map-get($bootstrap-icons-map, "folder-check"); } +.bi-folder-fill::before { content: map-get($bootstrap-icons-map, "folder-fill"); } +.bi-folder-minus::before { content: map-get($bootstrap-icons-map, "folder-minus"); } +.bi-folder-plus::before { content: map-get($bootstrap-icons-map, "folder-plus"); } +.bi-folder-symlink-fill::before { content: map-get($bootstrap-icons-map, "folder-symlink-fill"); } +.bi-folder-symlink::before { content: map-get($bootstrap-icons-map, "folder-symlink"); } +.bi-folder-x::before { content: map-get($bootstrap-icons-map, "folder-x"); } +.bi-folder::before { content: map-get($bootstrap-icons-map, "folder"); } +.bi-folder2-open::before { content: map-get($bootstrap-icons-map, "folder2-open"); } +.bi-folder2::before { content: map-get($bootstrap-icons-map, "folder2"); } +.bi-fonts::before { content: map-get($bootstrap-icons-map, "fonts"); } +.bi-forward-fill::before { content: map-get($bootstrap-icons-map, "forward-fill"); } +.bi-forward::before { content: map-get($bootstrap-icons-map, "forward"); } +.bi-front::before { content: map-get($bootstrap-icons-map, "front"); } +.bi-fullscreen-exit::before { content: map-get($bootstrap-icons-map, "fullscreen-exit"); } +.bi-fullscreen::before { content: map-get($bootstrap-icons-map, "fullscreen"); } +.bi-funnel-fill::before { content: map-get($bootstrap-icons-map, "funnel-fill"); } +.bi-funnel::before { content: map-get($bootstrap-icons-map, "funnel"); } +.bi-gear-fill::before { content: map-get($bootstrap-icons-map, "gear-fill"); } +.bi-gear-wide-connected::before { content: map-get($bootstrap-icons-map, "gear-wide-connected"); } +.bi-gear-wide::before { content: map-get($bootstrap-icons-map, "gear-wide"); } +.bi-gear::before { content: map-get($bootstrap-icons-map, "gear"); } +.bi-gem::before { content: map-get($bootstrap-icons-map, "gem"); } +.bi-geo-alt-fill::before { content: map-get($bootstrap-icons-map, "geo-alt-fill"); } +.bi-geo-alt::before { content: map-get($bootstrap-icons-map, "geo-alt"); } +.bi-geo-fill::before { content: map-get($bootstrap-icons-map, "geo-fill"); } +.bi-geo::before { content: map-get($bootstrap-icons-map, "geo"); } +.bi-gift-fill::before { content: map-get($bootstrap-icons-map, "gift-fill"); } +.bi-gift::before { content: map-get($bootstrap-icons-map, "gift"); } +.bi-github::before { content: map-get($bootstrap-icons-map, "github"); } +.bi-globe::before { content: map-get($bootstrap-icons-map, "globe"); } +.bi-globe2::before { content: map-get($bootstrap-icons-map, "globe2"); } +.bi-google::before { content: map-get($bootstrap-icons-map, "google"); } +.bi-graph-down::before { content: map-get($bootstrap-icons-map, "graph-down"); } +.bi-graph-up::before { content: map-get($bootstrap-icons-map, "graph-up"); } +.bi-grid-1x2-fill::before { content: map-get($bootstrap-icons-map, "grid-1x2-fill"); } +.bi-grid-1x2::before { content: map-get($bootstrap-icons-map, "grid-1x2"); } +.bi-grid-3x2-gap-fill::before { content: map-get($bootstrap-icons-map, "grid-3x2-gap-fill"); } +.bi-grid-3x2-gap::before { content: map-get($bootstrap-icons-map, "grid-3x2-gap"); } +.bi-grid-3x2::before { content: map-get($bootstrap-icons-map, "grid-3x2"); } +.bi-grid-3x3-gap-fill::before { content: map-get($bootstrap-icons-map, "grid-3x3-gap-fill"); } +.bi-grid-3x3-gap::before { content: map-get($bootstrap-icons-map, "grid-3x3-gap"); } +.bi-grid-3x3::before { content: map-get($bootstrap-icons-map, "grid-3x3"); } +.bi-grid-fill::before { content: map-get($bootstrap-icons-map, "grid-fill"); } +.bi-grid::before { content: map-get($bootstrap-icons-map, "grid"); } +.bi-grip-horizontal::before { content: map-get($bootstrap-icons-map, "grip-horizontal"); } +.bi-grip-vertical::before { content: map-get($bootstrap-icons-map, "grip-vertical"); } +.bi-hammer::before { content: map-get($bootstrap-icons-map, "hammer"); } +.bi-hand-index-fill::before { content: map-get($bootstrap-icons-map, "hand-index-fill"); } +.bi-hand-index-thumb-fill::before { content: map-get($bootstrap-icons-map, "hand-index-thumb-fill"); } +.bi-hand-index-thumb::before { content: map-get($bootstrap-icons-map, "hand-index-thumb"); } +.bi-hand-index::before { content: map-get($bootstrap-icons-map, "hand-index"); } +.bi-hand-thumbs-down-fill::before { content: map-get($bootstrap-icons-map, "hand-thumbs-down-fill"); } +.bi-hand-thumbs-down::before { content: map-get($bootstrap-icons-map, "hand-thumbs-down"); } +.bi-hand-thumbs-up-fill::before { content: map-get($bootstrap-icons-map, "hand-thumbs-up-fill"); } +.bi-hand-thumbs-up::before { content: map-get($bootstrap-icons-map, "hand-thumbs-up"); } +.bi-handbag-fill::before { content: map-get($bootstrap-icons-map, "handbag-fill"); } +.bi-handbag::before { content: map-get($bootstrap-icons-map, "handbag"); } +.bi-hash::before { content: map-get($bootstrap-icons-map, "hash"); } +.bi-hdd-fill::before { content: map-get($bootstrap-icons-map, "hdd-fill"); } +.bi-hdd-network-fill::before { content: map-get($bootstrap-icons-map, "hdd-network-fill"); } +.bi-hdd-network::before { content: map-get($bootstrap-icons-map, "hdd-network"); } +.bi-hdd-rack-fill::before { content: map-get($bootstrap-icons-map, "hdd-rack-fill"); } +.bi-hdd-rack::before { content: map-get($bootstrap-icons-map, "hdd-rack"); } +.bi-hdd-stack-fill::before { content: map-get($bootstrap-icons-map, "hdd-stack-fill"); } +.bi-hdd-stack::before { content: map-get($bootstrap-icons-map, "hdd-stack"); } +.bi-hdd::before { content: map-get($bootstrap-icons-map, "hdd"); } +.bi-headphones::before { content: map-get($bootstrap-icons-map, "headphones"); } +.bi-headset::before { content: map-get($bootstrap-icons-map, "headset"); } +.bi-heart-fill::before { content: map-get($bootstrap-icons-map, "heart-fill"); } +.bi-heart-half::before { content: map-get($bootstrap-icons-map, "heart-half"); } +.bi-heart::before { content: map-get($bootstrap-icons-map, "heart"); } +.bi-heptagon-fill::before { content: map-get($bootstrap-icons-map, "heptagon-fill"); } +.bi-heptagon-half::before { content: map-get($bootstrap-icons-map, "heptagon-half"); } +.bi-heptagon::before { content: map-get($bootstrap-icons-map, "heptagon"); } +.bi-hexagon-fill::before { content: map-get($bootstrap-icons-map, "hexagon-fill"); } +.bi-hexagon-half::before { content: map-get($bootstrap-icons-map, "hexagon-half"); } +.bi-hexagon::before { content: map-get($bootstrap-icons-map, "hexagon"); } +.bi-hourglass-bottom::before { content: map-get($bootstrap-icons-map, "hourglass-bottom"); } +.bi-hourglass-split::before { content: map-get($bootstrap-icons-map, "hourglass-split"); } +.bi-hourglass-top::before { content: map-get($bootstrap-icons-map, "hourglass-top"); } +.bi-hourglass::before { content: map-get($bootstrap-icons-map, "hourglass"); } +.bi-house-door-fill::before { content: map-get($bootstrap-icons-map, "house-door-fill"); } +.bi-house-door::before { content: map-get($bootstrap-icons-map, "house-door"); } +.bi-house-fill::before { content: map-get($bootstrap-icons-map, "house-fill"); } +.bi-house::before { content: map-get($bootstrap-icons-map, "house"); } +.bi-hr::before { content: map-get($bootstrap-icons-map, "hr"); } +.bi-hurricane::before { content: map-get($bootstrap-icons-map, "hurricane"); } +.bi-image-alt::before { content: map-get($bootstrap-icons-map, "image-alt"); } +.bi-image-fill::before { content: map-get($bootstrap-icons-map, "image-fill"); } +.bi-image::before { content: map-get($bootstrap-icons-map, "image"); } +.bi-images::before { content: map-get($bootstrap-icons-map, "images"); } +.bi-inbox-fill::before { content: map-get($bootstrap-icons-map, "inbox-fill"); } +.bi-inbox::before { content: map-get($bootstrap-icons-map, "inbox"); } +.bi-inboxes-fill::before { content: map-get($bootstrap-icons-map, "inboxes-fill"); } +.bi-inboxes::before { content: map-get($bootstrap-icons-map, "inboxes"); } +.bi-info-circle-fill::before { content: map-get($bootstrap-icons-map, "info-circle-fill"); } +.bi-info-circle::before { content: map-get($bootstrap-icons-map, "info-circle"); } +.bi-info-square-fill::before { content: map-get($bootstrap-icons-map, "info-square-fill"); } +.bi-info-square::before { content: map-get($bootstrap-icons-map, "info-square"); } +.bi-info::before { content: map-get($bootstrap-icons-map, "info"); } +.bi-input-cursor-text::before { content: map-get($bootstrap-icons-map, "input-cursor-text"); } +.bi-input-cursor::before { content: map-get($bootstrap-icons-map, "input-cursor"); } +.bi-instagram::before { content: map-get($bootstrap-icons-map, "instagram"); } +.bi-intersect::before { content: map-get($bootstrap-icons-map, "intersect"); } +.bi-journal-album::before { content: map-get($bootstrap-icons-map, "journal-album"); } +.bi-journal-arrow-down::before { content: map-get($bootstrap-icons-map, "journal-arrow-down"); } +.bi-journal-arrow-up::before { content: map-get($bootstrap-icons-map, "journal-arrow-up"); } +.bi-journal-bookmark-fill::before { content: map-get($bootstrap-icons-map, "journal-bookmark-fill"); } +.bi-journal-bookmark::before { content: map-get($bootstrap-icons-map, "journal-bookmark"); } +.bi-journal-check::before { content: map-get($bootstrap-icons-map, "journal-check"); } +.bi-journal-code::before { content: map-get($bootstrap-icons-map, "journal-code"); } +.bi-journal-medical::before { content: map-get($bootstrap-icons-map, "journal-medical"); } +.bi-journal-minus::before { content: map-get($bootstrap-icons-map, "journal-minus"); } +.bi-journal-plus::before { content: map-get($bootstrap-icons-map, "journal-plus"); } +.bi-journal-richtext::before { content: map-get($bootstrap-icons-map, "journal-richtext"); } +.bi-journal-text::before { content: map-get($bootstrap-icons-map, "journal-text"); } +.bi-journal-x::before { content: map-get($bootstrap-icons-map, "journal-x"); } +.bi-journal::before { content: map-get($bootstrap-icons-map, "journal"); } +.bi-journals::before { content: map-get($bootstrap-icons-map, "journals"); } +.bi-joystick::before { content: map-get($bootstrap-icons-map, "joystick"); } +.bi-justify-left::before { content: map-get($bootstrap-icons-map, "justify-left"); } +.bi-justify-right::before { content: map-get($bootstrap-icons-map, "justify-right"); } +.bi-justify::before { content: map-get($bootstrap-icons-map, "justify"); } +.bi-kanban-fill::before { content: map-get($bootstrap-icons-map, "kanban-fill"); } +.bi-kanban::before { content: map-get($bootstrap-icons-map, "kanban"); } +.bi-key-fill::before { content: map-get($bootstrap-icons-map, "key-fill"); } +.bi-key::before { content: map-get($bootstrap-icons-map, "key"); } +.bi-keyboard-fill::before { content: map-get($bootstrap-icons-map, "keyboard-fill"); } +.bi-keyboard::before { content: map-get($bootstrap-icons-map, "keyboard"); } +.bi-ladder::before { content: map-get($bootstrap-icons-map, "ladder"); } +.bi-lamp-fill::before { content: map-get($bootstrap-icons-map, "lamp-fill"); } +.bi-lamp::before { content: map-get($bootstrap-icons-map, "lamp"); } +.bi-laptop-fill::before { content: map-get($bootstrap-icons-map, "laptop-fill"); } +.bi-laptop::before { content: map-get($bootstrap-icons-map, "laptop"); } +.bi-layer-backward::before { content: map-get($bootstrap-icons-map, "layer-backward"); } +.bi-layer-forward::before { content: map-get($bootstrap-icons-map, "layer-forward"); } +.bi-layers-fill::before { content: map-get($bootstrap-icons-map, "layers-fill"); } +.bi-layers-half::before { content: map-get($bootstrap-icons-map, "layers-half"); } +.bi-layers::before { content: map-get($bootstrap-icons-map, "layers"); } +.bi-layout-sidebar-inset-reverse::before { content: map-get($bootstrap-icons-map, "layout-sidebar-inset-reverse"); } +.bi-layout-sidebar-inset::before { content: map-get($bootstrap-icons-map, "layout-sidebar-inset"); } +.bi-layout-sidebar-reverse::before { content: map-get($bootstrap-icons-map, "layout-sidebar-reverse"); } +.bi-layout-sidebar::before { content: map-get($bootstrap-icons-map, "layout-sidebar"); } +.bi-layout-split::before { content: map-get($bootstrap-icons-map, "layout-split"); } +.bi-layout-text-sidebar-reverse::before { content: map-get($bootstrap-icons-map, "layout-text-sidebar-reverse"); } +.bi-layout-text-sidebar::before { content: map-get($bootstrap-icons-map, "layout-text-sidebar"); } +.bi-layout-text-window-reverse::before { content: map-get($bootstrap-icons-map, "layout-text-window-reverse"); } +.bi-layout-text-window::before { content: map-get($bootstrap-icons-map, "layout-text-window"); } +.bi-layout-three-columns::before { content: map-get($bootstrap-icons-map, "layout-three-columns"); } +.bi-layout-wtf::before { content: map-get($bootstrap-icons-map, "layout-wtf"); } +.bi-life-preserver::before { content: map-get($bootstrap-icons-map, "life-preserver"); } +.bi-lightbulb-fill::before { content: map-get($bootstrap-icons-map, "lightbulb-fill"); } +.bi-lightbulb-off-fill::before { content: map-get($bootstrap-icons-map, "lightbulb-off-fill"); } +.bi-lightbulb-off::before { content: map-get($bootstrap-icons-map, "lightbulb-off"); } +.bi-lightbulb::before { content: map-get($bootstrap-icons-map, "lightbulb"); } +.bi-lightning-charge-fill::before { content: map-get($bootstrap-icons-map, "lightning-charge-fill"); } +.bi-lightning-charge::before { content: map-get($bootstrap-icons-map, "lightning-charge"); } +.bi-lightning-fill::before { content: map-get($bootstrap-icons-map, "lightning-fill"); } +.bi-lightning::before { content: map-get($bootstrap-icons-map, "lightning"); } +.bi-link-45deg::before { content: map-get($bootstrap-icons-map, "link-45deg"); } +.bi-link::before { content: map-get($bootstrap-icons-map, "link"); } +.bi-linkedin::before { content: map-get($bootstrap-icons-map, "linkedin"); } +.bi-list-check::before { content: map-get($bootstrap-icons-map, "list-check"); } +.bi-list-nested::before { content: map-get($bootstrap-icons-map, "list-nested"); } +.bi-list-ol::before { content: map-get($bootstrap-icons-map, "list-ol"); } +.bi-list-stars::before { content: map-get($bootstrap-icons-map, "list-stars"); } +.bi-list-task::before { content: map-get($bootstrap-icons-map, "list-task"); } +.bi-list-ul::before { content: map-get($bootstrap-icons-map, "list-ul"); } +.bi-list::before { content: map-get($bootstrap-icons-map, "list"); } +.bi-lock-fill::before { content: map-get($bootstrap-icons-map, "lock-fill"); } +.bi-lock::before { content: map-get($bootstrap-icons-map, "lock"); } +.bi-mailbox::before { content: map-get($bootstrap-icons-map, "mailbox"); } +.bi-mailbox2::before { content: map-get($bootstrap-icons-map, "mailbox2"); } +.bi-map-fill::before { content: map-get($bootstrap-icons-map, "map-fill"); } +.bi-map::before { content: map-get($bootstrap-icons-map, "map"); } +.bi-markdown-fill::before { content: map-get($bootstrap-icons-map, "markdown-fill"); } +.bi-markdown::before { content: map-get($bootstrap-icons-map, "markdown"); } +.bi-mask::before { content: map-get($bootstrap-icons-map, "mask"); } +.bi-megaphone-fill::before { content: map-get($bootstrap-icons-map, "megaphone-fill"); } +.bi-megaphone::before { content: map-get($bootstrap-icons-map, "megaphone"); } +.bi-menu-app-fill::before { content: map-get($bootstrap-icons-map, "menu-app-fill"); } +.bi-menu-app::before { content: map-get($bootstrap-icons-map, "menu-app"); } +.bi-menu-button-fill::before { content: map-get($bootstrap-icons-map, "menu-button-fill"); } +.bi-menu-button-wide-fill::before { content: map-get($bootstrap-icons-map, "menu-button-wide-fill"); } +.bi-menu-button-wide::before { content: map-get($bootstrap-icons-map, "menu-button-wide"); } +.bi-menu-button::before { content: map-get($bootstrap-icons-map, "menu-button"); } +.bi-menu-down::before { content: map-get($bootstrap-icons-map, "menu-down"); } +.bi-menu-up::before { content: map-get($bootstrap-icons-map, "menu-up"); } +.bi-mic-fill::before { content: map-get($bootstrap-icons-map, "mic-fill"); } +.bi-mic-mute-fill::before { content: map-get($bootstrap-icons-map, "mic-mute-fill"); } +.bi-mic-mute::before { content: map-get($bootstrap-icons-map, "mic-mute"); } +.bi-mic::before { content: map-get($bootstrap-icons-map, "mic"); } +.bi-minecart-loaded::before { content: map-get($bootstrap-icons-map, "minecart-loaded"); } +.bi-minecart::before { content: map-get($bootstrap-icons-map, "minecart"); } +.bi-moisture::before { content: map-get($bootstrap-icons-map, "moisture"); } +.bi-moon-fill::before { content: map-get($bootstrap-icons-map, "moon-fill"); } +.bi-moon-stars-fill::before { content: map-get($bootstrap-icons-map, "moon-stars-fill"); } +.bi-moon-stars::before { content: map-get($bootstrap-icons-map, "moon-stars"); } +.bi-moon::before { content: map-get($bootstrap-icons-map, "moon"); } +.bi-mouse-fill::before { content: map-get($bootstrap-icons-map, "mouse-fill"); } +.bi-mouse::before { content: map-get($bootstrap-icons-map, "mouse"); } +.bi-mouse2-fill::before { content: map-get($bootstrap-icons-map, "mouse2-fill"); } +.bi-mouse2::before { content: map-get($bootstrap-icons-map, "mouse2"); } +.bi-mouse3-fill::before { content: map-get($bootstrap-icons-map, "mouse3-fill"); } +.bi-mouse3::before { content: map-get($bootstrap-icons-map, "mouse3"); } +.bi-music-note-beamed::before { content: map-get($bootstrap-icons-map, "music-note-beamed"); } +.bi-music-note-list::before { content: map-get($bootstrap-icons-map, "music-note-list"); } +.bi-music-note::before { content: map-get($bootstrap-icons-map, "music-note"); } +.bi-music-player-fill::before { content: map-get($bootstrap-icons-map, "music-player-fill"); } +.bi-music-player::before { content: map-get($bootstrap-icons-map, "music-player"); } +.bi-newspaper::before { content: map-get($bootstrap-icons-map, "newspaper"); } +.bi-node-minus-fill::before { content: map-get($bootstrap-icons-map, "node-minus-fill"); } +.bi-node-minus::before { content: map-get($bootstrap-icons-map, "node-minus"); } +.bi-node-plus-fill::before { content: map-get($bootstrap-icons-map, "node-plus-fill"); } +.bi-node-plus::before { content: map-get($bootstrap-icons-map, "node-plus"); } +.bi-nut-fill::before { content: map-get($bootstrap-icons-map, "nut-fill"); } +.bi-nut::before { content: map-get($bootstrap-icons-map, "nut"); } +.bi-octagon-fill::before { content: map-get($bootstrap-icons-map, "octagon-fill"); } +.bi-octagon-half::before { content: map-get($bootstrap-icons-map, "octagon-half"); } +.bi-octagon::before { content: map-get($bootstrap-icons-map, "octagon"); } +.bi-option::before { content: map-get($bootstrap-icons-map, "option"); } +.bi-outlet::before { content: map-get($bootstrap-icons-map, "outlet"); } +.bi-paint-bucket::before { content: map-get($bootstrap-icons-map, "paint-bucket"); } +.bi-palette-fill::before { content: map-get($bootstrap-icons-map, "palette-fill"); } +.bi-palette::before { content: map-get($bootstrap-icons-map, "palette"); } +.bi-palette2::before { content: map-get($bootstrap-icons-map, "palette2"); } +.bi-paperclip::before { content: map-get($bootstrap-icons-map, "paperclip"); } +.bi-paragraph::before { content: map-get($bootstrap-icons-map, "paragraph"); } +.bi-patch-check-fill::before { content: map-get($bootstrap-icons-map, "patch-check-fill"); } +.bi-patch-check::before { content: map-get($bootstrap-icons-map, "patch-check"); } +.bi-patch-exclamation-fill::before { content: map-get($bootstrap-icons-map, "patch-exclamation-fill"); } +.bi-patch-exclamation::before { content: map-get($bootstrap-icons-map, "patch-exclamation"); } +.bi-patch-minus-fill::before { content: map-get($bootstrap-icons-map, "patch-minus-fill"); } +.bi-patch-minus::before { content: map-get($bootstrap-icons-map, "patch-minus"); } +.bi-patch-plus-fill::before { content: map-get($bootstrap-icons-map, "patch-plus-fill"); } +.bi-patch-plus::before { content: map-get($bootstrap-icons-map, "patch-plus"); } +.bi-patch-question-fill::before { content: map-get($bootstrap-icons-map, "patch-question-fill"); } +.bi-patch-question::before { content: map-get($bootstrap-icons-map, "patch-question"); } +.bi-pause-btn-fill::before { content: map-get($bootstrap-icons-map, "pause-btn-fill"); } +.bi-pause-btn::before { content: map-get($bootstrap-icons-map, "pause-btn"); } +.bi-pause-circle-fill::before { content: map-get($bootstrap-icons-map, "pause-circle-fill"); } +.bi-pause-circle::before { content: map-get($bootstrap-icons-map, "pause-circle"); } +.bi-pause-fill::before { content: map-get($bootstrap-icons-map, "pause-fill"); } +.bi-pause::before { content: map-get($bootstrap-icons-map, "pause"); } +.bi-peace-fill::before { content: map-get($bootstrap-icons-map, "peace-fill"); } +.bi-peace::before { content: map-get($bootstrap-icons-map, "peace"); } +.bi-pen-fill::before { content: map-get($bootstrap-icons-map, "pen-fill"); } +.bi-pen::before { content: map-get($bootstrap-icons-map, "pen"); } +.bi-pencil-fill::before { content: map-get($bootstrap-icons-map, "pencil-fill"); } +.bi-pencil-square::before { content: map-get($bootstrap-icons-map, "pencil-square"); } +.bi-pencil::before { content: map-get($bootstrap-icons-map, "pencil"); } +.bi-pentagon-fill::before { content: map-get($bootstrap-icons-map, "pentagon-fill"); } +.bi-pentagon-half::before { content: map-get($bootstrap-icons-map, "pentagon-half"); } +.bi-pentagon::before { content: map-get($bootstrap-icons-map, "pentagon"); } +.bi-people-fill::before { content: map-get($bootstrap-icons-map, "people-fill"); } +.bi-people::before { content: map-get($bootstrap-icons-map, "people"); } +.bi-percent::before { content: map-get($bootstrap-icons-map, "percent"); } +.bi-person-badge-fill::before { content: map-get($bootstrap-icons-map, "person-badge-fill"); } +.bi-person-badge::before { content: map-get($bootstrap-icons-map, "person-badge"); } +.bi-person-bounding-box::before { content: map-get($bootstrap-icons-map, "person-bounding-box"); } +.bi-person-check-fill::before { content: map-get($bootstrap-icons-map, "person-check-fill"); } +.bi-person-check::before { content: map-get($bootstrap-icons-map, "person-check"); } +.bi-person-circle::before { content: map-get($bootstrap-icons-map, "person-circle"); } +.bi-person-dash-fill::before { content: map-get($bootstrap-icons-map, "person-dash-fill"); } +.bi-person-dash::before { content: map-get($bootstrap-icons-map, "person-dash"); } +.bi-person-fill::before { content: map-get($bootstrap-icons-map, "person-fill"); } +.bi-person-lines-fill::before { content: map-get($bootstrap-icons-map, "person-lines-fill"); } +.bi-person-plus-fill::before { content: map-get($bootstrap-icons-map, "person-plus-fill"); } +.bi-person-plus::before { content: map-get($bootstrap-icons-map, "person-plus"); } +.bi-person-square::before { content: map-get($bootstrap-icons-map, "person-square"); } +.bi-person-x-fill::before { content: map-get($bootstrap-icons-map, "person-x-fill"); } +.bi-person-x::before { content: map-get($bootstrap-icons-map, "person-x"); } +.bi-person::before { content: map-get($bootstrap-icons-map, "person"); } +.bi-phone-fill::before { content: map-get($bootstrap-icons-map, "phone-fill"); } +.bi-phone-landscape-fill::before { content: map-get($bootstrap-icons-map, "phone-landscape-fill"); } +.bi-phone-landscape::before { content: map-get($bootstrap-icons-map, "phone-landscape"); } +.bi-phone-vibrate-fill::before { content: map-get($bootstrap-icons-map, "phone-vibrate-fill"); } +.bi-phone-vibrate::before { content: map-get($bootstrap-icons-map, "phone-vibrate"); } +.bi-phone::before { content: map-get($bootstrap-icons-map, "phone"); } +.bi-pie-chart-fill::before { content: map-get($bootstrap-icons-map, "pie-chart-fill"); } +.bi-pie-chart::before { content: map-get($bootstrap-icons-map, "pie-chart"); } +.bi-pin-angle-fill::before { content: map-get($bootstrap-icons-map, "pin-angle-fill"); } +.bi-pin-angle::before { content: map-get($bootstrap-icons-map, "pin-angle"); } +.bi-pin-fill::before { content: map-get($bootstrap-icons-map, "pin-fill"); } +.bi-pin::before { content: map-get($bootstrap-icons-map, "pin"); } +.bi-pip-fill::before { content: map-get($bootstrap-icons-map, "pip-fill"); } +.bi-pip::before { content: map-get($bootstrap-icons-map, "pip"); } +.bi-play-btn-fill::before { content: map-get($bootstrap-icons-map, "play-btn-fill"); } +.bi-play-btn::before { content: map-get($bootstrap-icons-map, "play-btn"); } +.bi-play-circle-fill::before { content: map-get($bootstrap-icons-map, "play-circle-fill"); } +.bi-play-circle::before { content: map-get($bootstrap-icons-map, "play-circle"); } +.bi-play-fill::before { content: map-get($bootstrap-icons-map, "play-fill"); } +.bi-play::before { content: map-get($bootstrap-icons-map, "play"); } +.bi-plug-fill::before { content: map-get($bootstrap-icons-map, "plug-fill"); } +.bi-plug::before { content: map-get($bootstrap-icons-map, "plug"); } +.bi-plus-circle-dotted::before { content: map-get($bootstrap-icons-map, "plus-circle-dotted"); } +.bi-plus-circle-fill::before { content: map-get($bootstrap-icons-map, "plus-circle-fill"); } +.bi-plus-circle::before { content: map-get($bootstrap-icons-map, "plus-circle"); } +.bi-plus-square-dotted::before { content: map-get($bootstrap-icons-map, "plus-square-dotted"); } +.bi-plus-square-fill::before { content: map-get($bootstrap-icons-map, "plus-square-fill"); } +.bi-plus-square::before { content: map-get($bootstrap-icons-map, "plus-square"); } +.bi-plus::before { content: map-get($bootstrap-icons-map, "plus"); } +.bi-power::before { content: map-get($bootstrap-icons-map, "power"); } +.bi-printer-fill::before { content: map-get($bootstrap-icons-map, "printer-fill"); } +.bi-printer::before { content: map-get($bootstrap-icons-map, "printer"); } +.bi-puzzle-fill::before { content: map-get($bootstrap-icons-map, "puzzle-fill"); } +.bi-puzzle::before { content: map-get($bootstrap-icons-map, "puzzle"); } +.bi-question-circle-fill::before { content: map-get($bootstrap-icons-map, "question-circle-fill"); } +.bi-question-circle::before { content: map-get($bootstrap-icons-map, "question-circle"); } +.bi-question-diamond-fill::before { content: map-get($bootstrap-icons-map, "question-diamond-fill"); } +.bi-question-diamond::before { content: map-get($bootstrap-icons-map, "question-diamond"); } +.bi-question-octagon-fill::before { content: map-get($bootstrap-icons-map, "question-octagon-fill"); } +.bi-question-octagon::before { content: map-get($bootstrap-icons-map, "question-octagon"); } +.bi-question-square-fill::before { content: map-get($bootstrap-icons-map, "question-square-fill"); } +.bi-question-square::before { content: map-get($bootstrap-icons-map, "question-square"); } +.bi-question::before { content: map-get($bootstrap-icons-map, "question"); } +.bi-rainbow::before { content: map-get($bootstrap-icons-map, "rainbow"); } +.bi-receipt-cutoff::before { content: map-get($bootstrap-icons-map, "receipt-cutoff"); } +.bi-receipt::before { content: map-get($bootstrap-icons-map, "receipt"); } +.bi-reception-0::before { content: map-get($bootstrap-icons-map, "reception-0"); } +.bi-reception-1::before { content: map-get($bootstrap-icons-map, "reception-1"); } +.bi-reception-2::before { content: map-get($bootstrap-icons-map, "reception-2"); } +.bi-reception-3::before { content: map-get($bootstrap-icons-map, "reception-3"); } +.bi-reception-4::before { content: map-get($bootstrap-icons-map, "reception-4"); } +.bi-record-btn-fill::before { content: map-get($bootstrap-icons-map, "record-btn-fill"); } +.bi-record-btn::before { content: map-get($bootstrap-icons-map, "record-btn"); } +.bi-record-circle-fill::before { content: map-get($bootstrap-icons-map, "record-circle-fill"); } +.bi-record-circle::before { content: map-get($bootstrap-icons-map, "record-circle"); } +.bi-record-fill::before { content: map-get($bootstrap-icons-map, "record-fill"); } +.bi-record::before { content: map-get($bootstrap-icons-map, "record"); } +.bi-record2-fill::before { content: map-get($bootstrap-icons-map, "record2-fill"); } +.bi-record2::before { content: map-get($bootstrap-icons-map, "record2"); } +.bi-reply-all-fill::before { content: map-get($bootstrap-icons-map, "reply-all-fill"); } +.bi-reply-all::before { content: map-get($bootstrap-icons-map, "reply-all"); } +.bi-reply-fill::before { content: map-get($bootstrap-icons-map, "reply-fill"); } +.bi-reply::before { content: map-get($bootstrap-icons-map, "reply"); } +.bi-rss-fill::before { content: map-get($bootstrap-icons-map, "rss-fill"); } +.bi-rss::before { content: map-get($bootstrap-icons-map, "rss"); } +.bi-rulers::before { content: map-get($bootstrap-icons-map, "rulers"); } +.bi-save-fill::before { content: map-get($bootstrap-icons-map, "save-fill"); } +.bi-save::before { content: map-get($bootstrap-icons-map, "save"); } +.bi-save2-fill::before { content: map-get($bootstrap-icons-map, "save2-fill"); } +.bi-save2::before { content: map-get($bootstrap-icons-map, "save2"); } +.bi-scissors::before { content: map-get($bootstrap-icons-map, "scissors"); } +.bi-screwdriver::before { content: map-get($bootstrap-icons-map, "screwdriver"); } +.bi-search::before { content: map-get($bootstrap-icons-map, "search"); } +.bi-segmented-nav::before { content: map-get($bootstrap-icons-map, "segmented-nav"); } +.bi-server::before { content: map-get($bootstrap-icons-map, "server"); } +.bi-share-fill::before { content: map-get($bootstrap-icons-map, "share-fill"); } +.bi-share::before { content: map-get($bootstrap-icons-map, "share"); } +.bi-shield-check::before { content: map-get($bootstrap-icons-map, "shield-check"); } +.bi-shield-exclamation::before { content: map-get($bootstrap-icons-map, "shield-exclamation"); } +.bi-shield-fill-check::before { content: map-get($bootstrap-icons-map, "shield-fill-check"); } +.bi-shield-fill-exclamation::before { content: map-get($bootstrap-icons-map, "shield-fill-exclamation"); } +.bi-shield-fill-minus::before { content: map-get($bootstrap-icons-map, "shield-fill-minus"); } +.bi-shield-fill-plus::before { content: map-get($bootstrap-icons-map, "shield-fill-plus"); } +.bi-shield-fill-x::before { content: map-get($bootstrap-icons-map, "shield-fill-x"); } +.bi-shield-fill::before { content: map-get($bootstrap-icons-map, "shield-fill"); } +.bi-shield-lock-fill::before { content: map-get($bootstrap-icons-map, "shield-lock-fill"); } +.bi-shield-lock::before { content: map-get($bootstrap-icons-map, "shield-lock"); } +.bi-shield-minus::before { content: map-get($bootstrap-icons-map, "shield-minus"); } +.bi-shield-plus::before { content: map-get($bootstrap-icons-map, "shield-plus"); } +.bi-shield-shaded::before { content: map-get($bootstrap-icons-map, "shield-shaded"); } +.bi-shield-slash-fill::before { content: map-get($bootstrap-icons-map, "shield-slash-fill"); } +.bi-shield-slash::before { content: map-get($bootstrap-icons-map, "shield-slash"); } +.bi-shield-x::before { content: map-get($bootstrap-icons-map, "shield-x"); } +.bi-shield::before { content: map-get($bootstrap-icons-map, "shield"); } +.bi-shift-fill::before { content: map-get($bootstrap-icons-map, "shift-fill"); } +.bi-shift::before { content: map-get($bootstrap-icons-map, "shift"); } +.bi-shop-window::before { content: map-get($bootstrap-icons-map, "shop-window"); } +.bi-shop::before { content: map-get($bootstrap-icons-map, "shop"); } +.bi-shuffle::before { content: map-get($bootstrap-icons-map, "shuffle"); } +.bi-signpost-2-fill::before { content: map-get($bootstrap-icons-map, "signpost-2-fill"); } +.bi-signpost-2::before { content: map-get($bootstrap-icons-map, "signpost-2"); } +.bi-signpost-fill::before { content: map-get($bootstrap-icons-map, "signpost-fill"); } +.bi-signpost-split-fill::before { content: map-get($bootstrap-icons-map, "signpost-split-fill"); } +.bi-signpost-split::before { content: map-get($bootstrap-icons-map, "signpost-split"); } +.bi-signpost::before { content: map-get($bootstrap-icons-map, "signpost"); } +.bi-sim-fill::before { content: map-get($bootstrap-icons-map, "sim-fill"); } +.bi-sim::before { content: map-get($bootstrap-icons-map, "sim"); } +.bi-skip-backward-btn-fill::before { content: map-get($bootstrap-icons-map, "skip-backward-btn-fill"); } +.bi-skip-backward-btn::before { content: map-get($bootstrap-icons-map, "skip-backward-btn"); } +.bi-skip-backward-circle-fill::before { content: map-get($bootstrap-icons-map, "skip-backward-circle-fill"); } +.bi-skip-backward-circle::before { content: map-get($bootstrap-icons-map, "skip-backward-circle"); } +.bi-skip-backward-fill::before { content: map-get($bootstrap-icons-map, "skip-backward-fill"); } +.bi-skip-backward::before { content: map-get($bootstrap-icons-map, "skip-backward"); } +.bi-skip-end-btn-fill::before { content: map-get($bootstrap-icons-map, "skip-end-btn-fill"); } +.bi-skip-end-btn::before { content: map-get($bootstrap-icons-map, "skip-end-btn"); } +.bi-skip-end-circle-fill::before { content: map-get($bootstrap-icons-map, "skip-end-circle-fill"); } +.bi-skip-end-circle::before { content: map-get($bootstrap-icons-map, "skip-end-circle"); } +.bi-skip-end-fill::before { content: map-get($bootstrap-icons-map, "skip-end-fill"); } +.bi-skip-end::before { content: map-get($bootstrap-icons-map, "skip-end"); } +.bi-skip-forward-btn-fill::before { content: map-get($bootstrap-icons-map, "skip-forward-btn-fill"); } +.bi-skip-forward-btn::before { content: map-get($bootstrap-icons-map, "skip-forward-btn"); } +.bi-skip-forward-circle-fill::before { content: map-get($bootstrap-icons-map, "skip-forward-circle-fill"); } +.bi-skip-forward-circle::before { content: map-get($bootstrap-icons-map, "skip-forward-circle"); } +.bi-skip-forward-fill::before { content: map-get($bootstrap-icons-map, "skip-forward-fill"); } +.bi-skip-forward::before { content: map-get($bootstrap-icons-map, "skip-forward"); } +.bi-skip-start-btn-fill::before { content: map-get($bootstrap-icons-map, "skip-start-btn-fill"); } +.bi-skip-start-btn::before { content: map-get($bootstrap-icons-map, "skip-start-btn"); } +.bi-skip-start-circle-fill::before { content: map-get($bootstrap-icons-map, "skip-start-circle-fill"); } +.bi-skip-start-circle::before { content: map-get($bootstrap-icons-map, "skip-start-circle"); } +.bi-skip-start-fill::before { content: map-get($bootstrap-icons-map, "skip-start-fill"); } +.bi-skip-start::before { content: map-get($bootstrap-icons-map, "skip-start"); } +.bi-slack::before { content: map-get($bootstrap-icons-map, "slack"); } +.bi-slash-circle-fill::before { content: map-get($bootstrap-icons-map, "slash-circle-fill"); } +.bi-slash-circle::before { content: map-get($bootstrap-icons-map, "slash-circle"); } +.bi-slash-square-fill::before { content: map-get($bootstrap-icons-map, "slash-square-fill"); } +.bi-slash-square::before { content: map-get($bootstrap-icons-map, "slash-square"); } +.bi-slash::before { content: map-get($bootstrap-icons-map, "slash"); } +.bi-sliders::before { content: map-get($bootstrap-icons-map, "sliders"); } +.bi-smartwatch::before { content: map-get($bootstrap-icons-map, "smartwatch"); } +.bi-snow::before { content: map-get($bootstrap-icons-map, "snow"); } +.bi-snow2::before { content: map-get($bootstrap-icons-map, "snow2"); } +.bi-snow3::before { content: map-get($bootstrap-icons-map, "snow3"); } +.bi-sort-alpha-down-alt::before { content: map-get($bootstrap-icons-map, "sort-alpha-down-alt"); } +.bi-sort-alpha-down::before { content: map-get($bootstrap-icons-map, "sort-alpha-down"); } +.bi-sort-alpha-up-alt::before { content: map-get($bootstrap-icons-map, "sort-alpha-up-alt"); } +.bi-sort-alpha-up::before { content: map-get($bootstrap-icons-map, "sort-alpha-up"); } +.bi-sort-down-alt::before { content: map-get($bootstrap-icons-map, "sort-down-alt"); } +.bi-sort-down::before { content: map-get($bootstrap-icons-map, "sort-down"); } +.bi-sort-numeric-down-alt::before { content: map-get($bootstrap-icons-map, "sort-numeric-down-alt"); } +.bi-sort-numeric-down::before { content: map-get($bootstrap-icons-map, "sort-numeric-down"); } +.bi-sort-numeric-up-alt::before { content: map-get($bootstrap-icons-map, "sort-numeric-up-alt"); } +.bi-sort-numeric-up::before { content: map-get($bootstrap-icons-map, "sort-numeric-up"); } +.bi-sort-up-alt::before { content: map-get($bootstrap-icons-map, "sort-up-alt"); } +.bi-sort-up::before { content: map-get($bootstrap-icons-map, "sort-up"); } +.bi-soundwave::before { content: map-get($bootstrap-icons-map, "soundwave"); } +.bi-speaker-fill::before { content: map-get($bootstrap-icons-map, "speaker-fill"); } +.bi-speaker::before { content: map-get($bootstrap-icons-map, "speaker"); } +.bi-speedometer::before { content: map-get($bootstrap-icons-map, "speedometer"); } +.bi-speedometer2::before { content: map-get($bootstrap-icons-map, "speedometer2"); } +.bi-spellcheck::before { content: map-get($bootstrap-icons-map, "spellcheck"); } +.bi-square-fill::before { content: map-get($bootstrap-icons-map, "square-fill"); } +.bi-square-half::before { content: map-get($bootstrap-icons-map, "square-half"); } +.bi-square::before { content: map-get($bootstrap-icons-map, "square"); } +.bi-stack::before { content: map-get($bootstrap-icons-map, "stack"); } +.bi-star-fill::before { content: map-get($bootstrap-icons-map, "star-fill"); } +.bi-star-half::before { content: map-get($bootstrap-icons-map, "star-half"); } +.bi-star::before { content: map-get($bootstrap-icons-map, "star"); } +.bi-stars::before { content: map-get($bootstrap-icons-map, "stars"); } +.bi-stickies-fill::before { content: map-get($bootstrap-icons-map, "stickies-fill"); } +.bi-stickies::before { content: map-get($bootstrap-icons-map, "stickies"); } +.bi-sticky-fill::before { content: map-get($bootstrap-icons-map, "sticky-fill"); } +.bi-sticky::before { content: map-get($bootstrap-icons-map, "sticky"); } +.bi-stop-btn-fill::before { content: map-get($bootstrap-icons-map, "stop-btn-fill"); } +.bi-stop-btn::before { content: map-get($bootstrap-icons-map, "stop-btn"); } +.bi-stop-circle-fill::before { content: map-get($bootstrap-icons-map, "stop-circle-fill"); } +.bi-stop-circle::before { content: map-get($bootstrap-icons-map, "stop-circle"); } +.bi-stop-fill::before { content: map-get($bootstrap-icons-map, "stop-fill"); } +.bi-stop::before { content: map-get($bootstrap-icons-map, "stop"); } +.bi-stoplights-fill::before { content: map-get($bootstrap-icons-map, "stoplights-fill"); } +.bi-stoplights::before { content: map-get($bootstrap-icons-map, "stoplights"); } +.bi-stopwatch-fill::before { content: map-get($bootstrap-icons-map, "stopwatch-fill"); } +.bi-stopwatch::before { content: map-get($bootstrap-icons-map, "stopwatch"); } +.bi-subtract::before { content: map-get($bootstrap-icons-map, "subtract"); } +.bi-suit-club-fill::before { content: map-get($bootstrap-icons-map, "suit-club-fill"); } +.bi-suit-club::before { content: map-get($bootstrap-icons-map, "suit-club"); } +.bi-suit-diamond-fill::before { content: map-get($bootstrap-icons-map, "suit-diamond-fill"); } +.bi-suit-diamond::before { content: map-get($bootstrap-icons-map, "suit-diamond"); } +.bi-suit-heart-fill::before { content: map-get($bootstrap-icons-map, "suit-heart-fill"); } +.bi-suit-heart::before { content: map-get($bootstrap-icons-map, "suit-heart"); } +.bi-suit-spade-fill::before { content: map-get($bootstrap-icons-map, "suit-spade-fill"); } +.bi-suit-spade::before { content: map-get($bootstrap-icons-map, "suit-spade"); } +.bi-sun-fill::before { content: map-get($bootstrap-icons-map, "sun-fill"); } +.bi-sun::before { content: map-get($bootstrap-icons-map, "sun"); } +.bi-sunglasses::before { content: map-get($bootstrap-icons-map, "sunglasses"); } +.bi-sunrise-fill::before { content: map-get($bootstrap-icons-map, "sunrise-fill"); } +.bi-sunrise::before { content: map-get($bootstrap-icons-map, "sunrise"); } +.bi-sunset-fill::before { content: map-get($bootstrap-icons-map, "sunset-fill"); } +.bi-sunset::before { content: map-get($bootstrap-icons-map, "sunset"); } +.bi-symmetry-horizontal::before { content: map-get($bootstrap-icons-map, "symmetry-horizontal"); } +.bi-symmetry-vertical::before { content: map-get($bootstrap-icons-map, "symmetry-vertical"); } +.bi-table::before { content: map-get($bootstrap-icons-map, "table"); } +.bi-tablet-fill::before { content: map-get($bootstrap-icons-map, "tablet-fill"); } +.bi-tablet-landscape-fill::before { content: map-get($bootstrap-icons-map, "tablet-landscape-fill"); } +.bi-tablet-landscape::before { content: map-get($bootstrap-icons-map, "tablet-landscape"); } +.bi-tablet::before { content: map-get($bootstrap-icons-map, "tablet"); } +.bi-tag-fill::before { content: map-get($bootstrap-icons-map, "tag-fill"); } +.bi-tag::before { content: map-get($bootstrap-icons-map, "tag"); } +.bi-tags-fill::before { content: map-get($bootstrap-icons-map, "tags-fill"); } +.bi-tags::before { content: map-get($bootstrap-icons-map, "tags"); } +.bi-telegram::before { content: map-get($bootstrap-icons-map, "telegram"); } +.bi-telephone-fill::before { content: map-get($bootstrap-icons-map, "telephone-fill"); } +.bi-telephone-forward-fill::before { content: map-get($bootstrap-icons-map, "telephone-forward-fill"); } +.bi-telephone-forward::before { content: map-get($bootstrap-icons-map, "telephone-forward"); } +.bi-telephone-inbound-fill::before { content: map-get($bootstrap-icons-map, "telephone-inbound-fill"); } +.bi-telephone-inbound::before { content: map-get($bootstrap-icons-map, "telephone-inbound"); } +.bi-telephone-minus-fill::before { content: map-get($bootstrap-icons-map, "telephone-minus-fill"); } +.bi-telephone-minus::before { content: map-get($bootstrap-icons-map, "telephone-minus"); } +.bi-telephone-outbound-fill::before { content: map-get($bootstrap-icons-map, "telephone-outbound-fill"); } +.bi-telephone-outbound::before { content: map-get($bootstrap-icons-map, "telephone-outbound"); } +.bi-telephone-plus-fill::before { content: map-get($bootstrap-icons-map, "telephone-plus-fill"); } +.bi-telephone-plus::before { content: map-get($bootstrap-icons-map, "telephone-plus"); } +.bi-telephone-x-fill::before { content: map-get($bootstrap-icons-map, "telephone-x-fill"); } +.bi-telephone-x::before { content: map-get($bootstrap-icons-map, "telephone-x"); } +.bi-telephone::before { content: map-get($bootstrap-icons-map, "telephone"); } +.bi-terminal-fill::before { content: map-get($bootstrap-icons-map, "terminal-fill"); } +.bi-terminal::before { content: map-get($bootstrap-icons-map, "terminal"); } +.bi-text-center::before { content: map-get($bootstrap-icons-map, "text-center"); } +.bi-text-indent-left::before { content: map-get($bootstrap-icons-map, "text-indent-left"); } +.bi-text-indent-right::before { content: map-get($bootstrap-icons-map, "text-indent-right"); } +.bi-text-left::before { content: map-get($bootstrap-icons-map, "text-left"); } +.bi-text-paragraph::before { content: map-get($bootstrap-icons-map, "text-paragraph"); } +.bi-text-right::before { content: map-get($bootstrap-icons-map, "text-right"); } +.bi-textarea-resize::before { content: map-get($bootstrap-icons-map, "textarea-resize"); } +.bi-textarea-t::before { content: map-get($bootstrap-icons-map, "textarea-t"); } +.bi-textarea::before { content: map-get($bootstrap-icons-map, "textarea"); } +.bi-thermometer-half::before { content: map-get($bootstrap-icons-map, "thermometer-half"); } +.bi-thermometer-high::before { content: map-get($bootstrap-icons-map, "thermometer-high"); } +.bi-thermometer-low::before { content: map-get($bootstrap-icons-map, "thermometer-low"); } +.bi-thermometer-snow::before { content: map-get($bootstrap-icons-map, "thermometer-snow"); } +.bi-thermometer-sun::before { content: map-get($bootstrap-icons-map, "thermometer-sun"); } +.bi-thermometer::before { content: map-get($bootstrap-icons-map, "thermometer"); } +.bi-three-dots-vertical::before { content: map-get($bootstrap-icons-map, "three-dots-vertical"); } +.bi-three-dots::before { content: map-get($bootstrap-icons-map, "three-dots"); } +.bi-toggle-off::before { content: map-get($bootstrap-icons-map, "toggle-off"); } +.bi-toggle-on::before { content: map-get($bootstrap-icons-map, "toggle-on"); } +.bi-toggle2-off::before { content: map-get($bootstrap-icons-map, "toggle2-off"); } +.bi-toggle2-on::before { content: map-get($bootstrap-icons-map, "toggle2-on"); } +.bi-toggles::before { content: map-get($bootstrap-icons-map, "toggles"); } +.bi-toggles2::before { content: map-get($bootstrap-icons-map, "toggles2"); } +.bi-tools::before { content: map-get($bootstrap-icons-map, "tools"); } +.bi-tornado::before { content: map-get($bootstrap-icons-map, "tornado"); } +.bi-trash-fill::before { content: map-get($bootstrap-icons-map, "trash-fill"); } +.bi-trash::before { content: map-get($bootstrap-icons-map, "trash"); } +.bi-trash2-fill::before { content: map-get($bootstrap-icons-map, "trash2-fill"); } +.bi-trash2::before { content: map-get($bootstrap-icons-map, "trash2"); } +.bi-tree-fill::before { content: map-get($bootstrap-icons-map, "tree-fill"); } +.bi-tree::before { content: map-get($bootstrap-icons-map, "tree"); } +.bi-triangle-fill::before { content: map-get($bootstrap-icons-map, "triangle-fill"); } +.bi-triangle-half::before { content: map-get($bootstrap-icons-map, "triangle-half"); } +.bi-triangle::before { content: map-get($bootstrap-icons-map, "triangle"); } +.bi-trophy-fill::before { content: map-get($bootstrap-icons-map, "trophy-fill"); } +.bi-trophy::before { content: map-get($bootstrap-icons-map, "trophy"); } +.bi-tropical-storm::before { content: map-get($bootstrap-icons-map, "tropical-storm"); } +.bi-truck-flatbed::before { content: map-get($bootstrap-icons-map, "truck-flatbed"); } +.bi-truck::before { content: map-get($bootstrap-icons-map, "truck"); } +.bi-tsunami::before { content: map-get($bootstrap-icons-map, "tsunami"); } +.bi-tv-fill::before { content: map-get($bootstrap-icons-map, "tv-fill"); } +.bi-tv::before { content: map-get($bootstrap-icons-map, "tv"); } +.bi-twitch::before { content: map-get($bootstrap-icons-map, "twitch"); } +.bi-twitter::before { content: map-get($bootstrap-icons-map, "twitter"); } +.bi-type-bold::before { content: map-get($bootstrap-icons-map, "type-bold"); } +.bi-type-h1::before { content: map-get($bootstrap-icons-map, "type-h1"); } +.bi-type-h2::before { content: map-get($bootstrap-icons-map, "type-h2"); } +.bi-type-h3::before { content: map-get($bootstrap-icons-map, "type-h3"); } +.bi-type-italic::before { content: map-get($bootstrap-icons-map, "type-italic"); } +.bi-type-strikethrough::before { content: map-get($bootstrap-icons-map, "type-strikethrough"); } +.bi-type-underline::before { content: map-get($bootstrap-icons-map, "type-underline"); } +.bi-type::before { content: map-get($bootstrap-icons-map, "type"); } +.bi-ui-checks-grid::before { content: map-get($bootstrap-icons-map, "ui-checks-grid"); } +.bi-ui-checks::before { content: map-get($bootstrap-icons-map, "ui-checks"); } +.bi-ui-radios-grid::before { content: map-get($bootstrap-icons-map, "ui-radios-grid"); } +.bi-ui-radios::before { content: map-get($bootstrap-icons-map, "ui-radios"); } +.bi-umbrella-fill::before { content: map-get($bootstrap-icons-map, "umbrella-fill"); } +.bi-umbrella::before { content: map-get($bootstrap-icons-map, "umbrella"); } +.bi-union::before { content: map-get($bootstrap-icons-map, "union"); } +.bi-unlock-fill::before { content: map-get($bootstrap-icons-map, "unlock-fill"); } +.bi-unlock::before { content: map-get($bootstrap-icons-map, "unlock"); } +.bi-upc-scan::before { content: map-get($bootstrap-icons-map, "upc-scan"); } +.bi-upc::before { content: map-get($bootstrap-icons-map, "upc"); } +.bi-upload::before { content: map-get($bootstrap-icons-map, "upload"); } +.bi-vector-pen::before { content: map-get($bootstrap-icons-map, "vector-pen"); } +.bi-view-list::before { content: map-get($bootstrap-icons-map, "view-list"); } +.bi-view-stacked::before { content: map-get($bootstrap-icons-map, "view-stacked"); } +.bi-vinyl-fill::before { content: map-get($bootstrap-icons-map, "vinyl-fill"); } +.bi-vinyl::before { content: map-get($bootstrap-icons-map, "vinyl"); } +.bi-voicemail::before { content: map-get($bootstrap-icons-map, "voicemail"); } +.bi-volume-down-fill::before { content: map-get($bootstrap-icons-map, "volume-down-fill"); } +.bi-volume-down::before { content: map-get($bootstrap-icons-map, "volume-down"); } +.bi-volume-mute-fill::before { content: map-get($bootstrap-icons-map, "volume-mute-fill"); } +.bi-volume-mute::before { content: map-get($bootstrap-icons-map, "volume-mute"); } +.bi-volume-off-fill::before { content: map-get($bootstrap-icons-map, "volume-off-fill"); } +.bi-volume-off::before { content: map-get($bootstrap-icons-map, "volume-off"); } +.bi-volume-up-fill::before { content: map-get($bootstrap-icons-map, "volume-up-fill"); } +.bi-volume-up::before { content: map-get($bootstrap-icons-map, "volume-up"); } +.bi-vr::before { content: map-get($bootstrap-icons-map, "vr"); } +.bi-wallet-fill::before { content: map-get($bootstrap-icons-map, "wallet-fill"); } +.bi-wallet::before { content: map-get($bootstrap-icons-map, "wallet"); } +.bi-wallet2::before { content: map-get($bootstrap-icons-map, "wallet2"); } +.bi-watch::before { content: map-get($bootstrap-icons-map, "watch"); } +.bi-water::before { content: map-get($bootstrap-icons-map, "water"); } +.bi-whatsapp::before { content: map-get($bootstrap-icons-map, "whatsapp"); } +.bi-wifi-1::before { content: map-get($bootstrap-icons-map, "wifi-1"); } +.bi-wifi-2::before { content: map-get($bootstrap-icons-map, "wifi-2"); } +.bi-wifi-off::before { content: map-get($bootstrap-icons-map, "wifi-off"); } +.bi-wifi::before { content: map-get($bootstrap-icons-map, "wifi"); } +.bi-wind::before { content: map-get($bootstrap-icons-map, "wind"); } +.bi-window-dock::before { content: map-get($bootstrap-icons-map, "window-dock"); } +.bi-window-sidebar::before { content: map-get($bootstrap-icons-map, "window-sidebar"); } +.bi-window::before { content: map-get($bootstrap-icons-map, "window"); } +.bi-wrench::before { content: map-get($bootstrap-icons-map, "wrench"); } +.bi-x-circle-fill::before { content: map-get($bootstrap-icons-map, "x-circle-fill"); } +.bi-x-circle::before { content: map-get($bootstrap-icons-map, "x-circle"); } +.bi-x-diamond-fill::before { content: map-get($bootstrap-icons-map, "x-diamond-fill"); } +.bi-x-diamond::before { content: map-get($bootstrap-icons-map, "x-diamond"); } +.bi-x-octagon-fill::before { content: map-get($bootstrap-icons-map, "x-octagon-fill"); } +.bi-x-octagon::before { content: map-get($bootstrap-icons-map, "x-octagon"); } +.bi-x-square-fill::before { content: map-get($bootstrap-icons-map, "x-square-fill"); } +.bi-x-square::before { content: map-get($bootstrap-icons-map, "x-square"); } +.bi-x::before { content: map-get($bootstrap-icons-map, "x"); } +.bi-youtube::before { content: map-get($bootstrap-icons-map, "youtube"); } +.bi-zoom-in::before { content: map-get($bootstrap-icons-map, "zoom-in"); } +.bi-zoom-out::before { content: map-get($bootstrap-icons-map, "zoom-out"); } +.bi-bank::before { content: map-get($bootstrap-icons-map, "bank"); } +.bi-bank2::before { content: map-get($bootstrap-icons-map, "bank2"); } +.bi-bell-slash-fill::before { content: map-get($bootstrap-icons-map, "bell-slash-fill"); } +.bi-bell-slash::before { content: map-get($bootstrap-icons-map, "bell-slash"); } +.bi-cash-coin::before { content: map-get($bootstrap-icons-map, "cash-coin"); } +.bi-check-lg::before { content: map-get($bootstrap-icons-map, "check-lg"); } +.bi-coin::before { content: map-get($bootstrap-icons-map, "coin"); } +.bi-currency-bitcoin::before { content: map-get($bootstrap-icons-map, "currency-bitcoin"); } +.bi-currency-dollar::before { content: map-get($bootstrap-icons-map, "currency-dollar"); } +.bi-currency-euro::before { content: map-get($bootstrap-icons-map, "currency-euro"); } +.bi-currency-exchange::before { content: map-get($bootstrap-icons-map, "currency-exchange"); } +.bi-currency-pound::before { content: map-get($bootstrap-icons-map, "currency-pound"); } +.bi-currency-yen::before { content: map-get($bootstrap-icons-map, "currency-yen"); } +.bi-dash-lg::before { content: map-get($bootstrap-icons-map, "dash-lg"); } +.bi-exclamation-lg::before { content: map-get($bootstrap-icons-map, "exclamation-lg"); } +.bi-file-earmark-pdf-fill::before { content: map-get($bootstrap-icons-map, "file-earmark-pdf-fill"); } +.bi-file-earmark-pdf::before { content: map-get($bootstrap-icons-map, "file-earmark-pdf"); } +.bi-file-pdf-fill::before { content: map-get($bootstrap-icons-map, "file-pdf-fill"); } +.bi-file-pdf::before { content: map-get($bootstrap-icons-map, "file-pdf"); } +.bi-gender-ambiguous::before { content: map-get($bootstrap-icons-map, "gender-ambiguous"); } +.bi-gender-female::before { content: map-get($bootstrap-icons-map, "gender-female"); } +.bi-gender-male::before { content: map-get($bootstrap-icons-map, "gender-male"); } +.bi-gender-trans::before { content: map-get($bootstrap-icons-map, "gender-trans"); } +.bi-headset-vr::before { content: map-get($bootstrap-icons-map, "headset-vr"); } +.bi-info-lg::before { content: map-get($bootstrap-icons-map, "info-lg"); } +.bi-mastodon::before { content: map-get($bootstrap-icons-map, "mastodon"); } +.bi-messenger::before { content: map-get($bootstrap-icons-map, "messenger"); } +.bi-piggy-bank-fill::before { content: map-get($bootstrap-icons-map, "piggy-bank-fill"); } +.bi-piggy-bank::before { content: map-get($bootstrap-icons-map, "piggy-bank"); } +.bi-pin-map-fill::before { content: map-get($bootstrap-icons-map, "pin-map-fill"); } +.bi-pin-map::before { content: map-get($bootstrap-icons-map, "pin-map"); } +.bi-plus-lg::before { content: map-get($bootstrap-icons-map, "plus-lg"); } +.bi-question-lg::before { content: map-get($bootstrap-icons-map, "question-lg"); } +.bi-recycle::before { content: map-get($bootstrap-icons-map, "recycle"); } +.bi-reddit::before { content: map-get($bootstrap-icons-map, "reddit"); } +.bi-safe-fill::before { content: map-get($bootstrap-icons-map, "safe-fill"); } +.bi-safe2-fill::before { content: map-get($bootstrap-icons-map, "safe2-fill"); } +.bi-safe2::before { content: map-get($bootstrap-icons-map, "safe2"); } +.bi-sd-card-fill::before { content: map-get($bootstrap-icons-map, "sd-card-fill"); } +.bi-sd-card::before { content: map-get($bootstrap-icons-map, "sd-card"); } +.bi-skype::before { content: map-get($bootstrap-icons-map, "skype"); } +.bi-slash-lg::before { content: map-get($bootstrap-icons-map, "slash-lg"); } +.bi-translate::before { content: map-get($bootstrap-icons-map, "translate"); } +.bi-x-lg::before { content: map-get($bootstrap-icons-map, "x-lg"); } +.bi-safe::before { content: map-get($bootstrap-icons-map, "safe"); } +.bi-apple::before { content: map-get($bootstrap-icons-map, "apple"); } +.bi-microsoft::before { content: map-get($bootstrap-icons-map, "microsoft"); } +.bi-windows::before { content: map-get($bootstrap-icons-map, "windows"); } +.bi-behance::before { content: map-get($bootstrap-icons-map, "behance"); } +.bi-dribbble::before { content: map-get($bootstrap-icons-map, "dribbble"); } +.bi-line::before { content: map-get($bootstrap-icons-map, "line"); } +.bi-medium::before { content: map-get($bootstrap-icons-map, "medium"); } +.bi-paypal::before { content: map-get($bootstrap-icons-map, "paypal"); } +.bi-pinterest::before { content: map-get($bootstrap-icons-map, "pinterest"); } +.bi-signal::before { content: map-get($bootstrap-icons-map, "signal"); } +.bi-snapchat::before { content: map-get($bootstrap-icons-map, "snapchat"); } +.bi-spotify::before { content: map-get($bootstrap-icons-map, "spotify"); } +.bi-stack-overflow::before { content: map-get($bootstrap-icons-map, "stack-overflow"); } +.bi-strava::before { content: map-get($bootstrap-icons-map, "strava"); } +.bi-wordpress::before { content: map-get($bootstrap-icons-map, "wordpress"); } +.bi-vimeo::before { content: map-get($bootstrap-icons-map, "vimeo"); } +.bi-activity::before { content: map-get($bootstrap-icons-map, "activity"); } +.bi-easel2-fill::before { content: map-get($bootstrap-icons-map, "easel2-fill"); } +.bi-easel2::before { content: map-get($bootstrap-icons-map, "easel2"); } +.bi-easel3-fill::before { content: map-get($bootstrap-icons-map, "easel3-fill"); } +.bi-easel3::before { content: map-get($bootstrap-icons-map, "easel3"); } +.bi-fan::before { content: map-get($bootstrap-icons-map, "fan"); } +.bi-fingerprint::before { content: map-get($bootstrap-icons-map, "fingerprint"); } +.bi-graph-down-arrow::before { content: map-get($bootstrap-icons-map, "graph-down-arrow"); } +.bi-graph-up-arrow::before { content: map-get($bootstrap-icons-map, "graph-up-arrow"); } +.bi-hypnotize::before { content: map-get($bootstrap-icons-map, "hypnotize"); } +.bi-magic::before { content: map-get($bootstrap-icons-map, "magic"); } +.bi-person-rolodex::before { content: map-get($bootstrap-icons-map, "person-rolodex"); } +.bi-person-video::before { content: map-get($bootstrap-icons-map, "person-video"); } +.bi-person-video2::before { content: map-get($bootstrap-icons-map, "person-video2"); } +.bi-person-video3::before { content: map-get($bootstrap-icons-map, "person-video3"); } +.bi-person-workspace::before { content: map-get($bootstrap-icons-map, "person-workspace"); } +.bi-radioactive::before { content: map-get($bootstrap-icons-map, "radioactive"); } +.bi-webcam-fill::before { content: map-get($bootstrap-icons-map, "webcam-fill"); } +.bi-webcam::before { content: map-get($bootstrap-icons-map, "webcam"); } +.bi-yin-yang::before { content: map-get($bootstrap-icons-map, "yin-yang"); } +.bi-bandaid-fill::before { content: map-get($bootstrap-icons-map, "bandaid-fill"); } +.bi-bandaid::before { content: map-get($bootstrap-icons-map, "bandaid"); } +.bi-bluetooth::before { content: map-get($bootstrap-icons-map, "bluetooth"); } +.bi-body-text::before { content: map-get($bootstrap-icons-map, "body-text"); } +.bi-boombox::before { content: map-get($bootstrap-icons-map, "boombox"); } +.bi-boxes::before { content: map-get($bootstrap-icons-map, "boxes"); } +.bi-dpad-fill::before { content: map-get($bootstrap-icons-map, "dpad-fill"); } +.bi-dpad::before { content: map-get($bootstrap-icons-map, "dpad"); } +.bi-ear-fill::before { content: map-get($bootstrap-icons-map, "ear-fill"); } +.bi-ear::before { content: map-get($bootstrap-icons-map, "ear"); } +.bi-envelope-check-1::before { content: map-get($bootstrap-icons-map, "envelope-check-1"); } +.bi-envelope-check-fill::before { content: map-get($bootstrap-icons-map, "envelope-check-fill"); } +.bi-envelope-check::before { content: map-get($bootstrap-icons-map, "envelope-check"); } +.bi-envelope-dash-1::before { content: map-get($bootstrap-icons-map, "envelope-dash-1"); } +.bi-envelope-dash-fill::before { content: map-get($bootstrap-icons-map, "envelope-dash-fill"); } +.bi-envelope-dash::before { content: map-get($bootstrap-icons-map, "envelope-dash"); } +.bi-envelope-exclamation-1::before { content: map-get($bootstrap-icons-map, "envelope-exclamation-1"); } +.bi-envelope-exclamation-fill::before { content: map-get($bootstrap-icons-map, "envelope-exclamation-fill"); } +.bi-envelope-exclamation::before { content: map-get($bootstrap-icons-map, "envelope-exclamation"); } +.bi-envelope-plus-fill::before { content: map-get($bootstrap-icons-map, "envelope-plus-fill"); } +.bi-envelope-plus::before { content: map-get($bootstrap-icons-map, "envelope-plus"); } +.bi-envelope-slash-1::before { content: map-get($bootstrap-icons-map, "envelope-slash-1"); } +.bi-envelope-slash-fill::before { content: map-get($bootstrap-icons-map, "envelope-slash-fill"); } +.bi-envelope-slash::before { content: map-get($bootstrap-icons-map, "envelope-slash"); } +.bi-envelope-x-1::before { content: map-get($bootstrap-icons-map, "envelope-x-1"); } +.bi-envelope-x-fill::before { content: map-get($bootstrap-icons-map, "envelope-x-fill"); } +.bi-envelope-x::before { content: map-get($bootstrap-icons-map, "envelope-x"); } +.bi-explicit-fill::before { content: map-get($bootstrap-icons-map, "explicit-fill"); } +.bi-explicit::before { content: map-get($bootstrap-icons-map, "explicit"); } +.bi-git::before { content: map-get($bootstrap-icons-map, "git"); } +.bi-infinity::before { content: map-get($bootstrap-icons-map, "infinity"); } +.bi-list-columns-reverse::before { content: map-get($bootstrap-icons-map, "list-columns-reverse"); } +.bi-list-columns::before { content: map-get($bootstrap-icons-map, "list-columns"); } +.bi-meta::before { content: map-get($bootstrap-icons-map, "meta"); } +.bi-mortorboard-fill::before { content: map-get($bootstrap-icons-map, "mortorboard-fill"); } +.bi-mortorboard::before { content: map-get($bootstrap-icons-map, "mortorboard"); } +.bi-nintendo-switch::before { content: map-get($bootstrap-icons-map, "nintendo-switch"); } +.bi-pc-display-horizontal::before { content: map-get($bootstrap-icons-map, "pc-display-horizontal"); } +.bi-pc-display::before { content: map-get($bootstrap-icons-map, "pc-display"); } +.bi-pc-horizontal::before { content: map-get($bootstrap-icons-map, "pc-horizontal"); } +.bi-pc::before { content: map-get($bootstrap-icons-map, "pc"); } +.bi-playstation::before { content: map-get($bootstrap-icons-map, "playstation"); } +.bi-plus-slash-minus::before { content: map-get($bootstrap-icons-map, "plus-slash-minus"); } +.bi-projector-fill::before { content: map-get($bootstrap-icons-map, "projector-fill"); } +.bi-projector::before { content: map-get($bootstrap-icons-map, "projector"); } +.bi-qr-code-scan::before { content: map-get($bootstrap-icons-map, "qr-code-scan"); } +.bi-qr-code::before { content: map-get($bootstrap-icons-map, "qr-code"); } +.bi-quora::before { content: map-get($bootstrap-icons-map, "quora"); } +.bi-quote::before { content: map-get($bootstrap-icons-map, "quote"); } +.bi-robot::before { content: map-get($bootstrap-icons-map, "robot"); } +.bi-send-check-fill::before { content: map-get($bootstrap-icons-map, "send-check-fill"); } +.bi-send-check::before { content: map-get($bootstrap-icons-map, "send-check"); } +.bi-send-dash-fill::before { content: map-get($bootstrap-icons-map, "send-dash-fill"); } +.bi-send-dash::before { content: map-get($bootstrap-icons-map, "send-dash"); } +.bi-send-exclamation-1::before { content: map-get($bootstrap-icons-map, "send-exclamation-1"); } +.bi-send-exclamation-fill::before { content: map-get($bootstrap-icons-map, "send-exclamation-fill"); } +.bi-send-exclamation::before { content: map-get($bootstrap-icons-map, "send-exclamation"); } +.bi-send-fill::before { content: map-get($bootstrap-icons-map, "send-fill"); } +.bi-send-plus-fill::before { content: map-get($bootstrap-icons-map, "send-plus-fill"); } +.bi-send-plus::before { content: map-get($bootstrap-icons-map, "send-plus"); } +.bi-send-slash-fill::before { content: map-get($bootstrap-icons-map, "send-slash-fill"); } +.bi-send-slash::before { content: map-get($bootstrap-icons-map, "send-slash"); } +.bi-send-x-fill::before { content: map-get($bootstrap-icons-map, "send-x-fill"); } +.bi-send-x::before { content: map-get($bootstrap-icons-map, "send-x"); } +.bi-send::before { content: map-get($bootstrap-icons-map, "send"); } +.bi-steam::before { content: map-get($bootstrap-icons-map, "steam"); } +.bi-terminal-dash-1::before { content: map-get($bootstrap-icons-map, "terminal-dash-1"); } +.bi-terminal-dash::before { content: map-get($bootstrap-icons-map, "terminal-dash"); } +.bi-terminal-plus::before { content: map-get($bootstrap-icons-map, "terminal-plus"); } +.bi-terminal-split::before { content: map-get($bootstrap-icons-map, "terminal-split"); } +.bi-ticket-detailed-fill::before { content: map-get($bootstrap-icons-map, "ticket-detailed-fill"); } +.bi-ticket-detailed::before { content: map-get($bootstrap-icons-map, "ticket-detailed"); } +.bi-ticket-fill::before { content: map-get($bootstrap-icons-map, "ticket-fill"); } +.bi-ticket-perforated-fill::before { content: map-get($bootstrap-icons-map, "ticket-perforated-fill"); } +.bi-ticket-perforated::before { content: map-get($bootstrap-icons-map, "ticket-perforated"); } +.bi-ticket::before { content: map-get($bootstrap-icons-map, "ticket"); } +.bi-tiktok::before { content: map-get($bootstrap-icons-map, "tiktok"); } +.bi-window-dash::before { content: map-get($bootstrap-icons-map, "window-dash"); } +.bi-window-desktop::before { content: map-get($bootstrap-icons-map, "window-desktop"); } +.bi-window-fullscreen::before { content: map-get($bootstrap-icons-map, "window-fullscreen"); } +.bi-window-plus::before { content: map-get($bootstrap-icons-map, "window-plus"); } +.bi-window-split::before { content: map-get($bootstrap-icons-map, "window-split"); } +.bi-window-stack::before { content: map-get($bootstrap-icons-map, "window-stack"); } +.bi-window-x::before { content: map-get($bootstrap-icons-map, "window-x"); } +.bi-xbox::before { content: map-get($bootstrap-icons-map, "xbox"); } +.bi-ethernet::before { content: map-get($bootstrap-icons-map, "ethernet"); } +.bi-hdmi-fill::before { content: map-get($bootstrap-icons-map, "hdmi-fill"); } +.bi-hdmi::before { content: map-get($bootstrap-icons-map, "hdmi"); } +.bi-usb-c-fill::before { content: map-get($bootstrap-icons-map, "usb-c-fill"); } +.bi-usb-c::before { content: map-get($bootstrap-icons-map, "usb-c"); } +.bi-usb-fill::before { content: map-get($bootstrap-icons-map, "usb-fill"); } +.bi-usb-plug-fill::before { content: map-get($bootstrap-icons-map, "usb-plug-fill"); } +.bi-usb-plug::before { content: map-get($bootstrap-icons-map, "usb-plug"); } +.bi-usb-symbol::before { content: map-get($bootstrap-icons-map, "usb-symbol"); } +.bi-usb::before { content: map-get($bootstrap-icons-map, "usb"); } +.bi-boombox-fill::before { content: map-get($bootstrap-icons-map, "boombox-fill"); } +.bi-displayport-1::before { content: map-get($bootstrap-icons-map, "displayport-1"); } +.bi-displayport::before { content: map-get($bootstrap-icons-map, "displayport"); } +.bi-gpu-card::before { content: map-get($bootstrap-icons-map, "gpu-card"); } +.bi-memory::before { content: map-get($bootstrap-icons-map, "memory"); } +.bi-modem-fill::before { content: map-get($bootstrap-icons-map, "modem-fill"); } +.bi-modem::before { content: map-get($bootstrap-icons-map, "modem"); } +.bi-motherboard-fill::before { content: map-get($bootstrap-icons-map, "motherboard-fill"); } +.bi-motherboard::before { content: map-get($bootstrap-icons-map, "motherboard"); } +.bi-optical-audio-fill::before { content: map-get($bootstrap-icons-map, "optical-audio-fill"); } +.bi-optical-audio::before { content: map-get($bootstrap-icons-map, "optical-audio"); } +.bi-pci-card::before { content: map-get($bootstrap-icons-map, "pci-card"); } +.bi-router-fill::before { content: map-get($bootstrap-icons-map, "router-fill"); } +.bi-router::before { content: map-get($bootstrap-icons-map, "router"); } +.bi-ssd-fill::before { content: map-get($bootstrap-icons-map, "ssd-fill"); } +.bi-ssd::before { content: map-get($bootstrap-icons-map, "ssd"); } +.bi-thunderbolt-fill::before { content: map-get($bootstrap-icons-map, "thunderbolt-fill"); } +.bi-thunderbolt::before { content: map-get($bootstrap-icons-map, "thunderbolt"); } +.bi-usb-drive-fill::before { content: map-get($bootstrap-icons-map, "usb-drive-fill"); } +.bi-usb-drive::before { content: map-get($bootstrap-icons-map, "usb-drive"); } +.bi-usb-micro-fill::before { content: map-get($bootstrap-icons-map, "usb-micro-fill"); } +.bi-usb-micro::before { content: map-get($bootstrap-icons-map, "usb-micro"); } +.bi-usb-mini-fill::before { content: map-get($bootstrap-icons-map, "usb-mini-fill"); } +.bi-usb-mini::before { content: map-get($bootstrap-icons-map, "usb-mini"); } +.bi-cloud-haze2::before { content: map-get($bootstrap-icons-map, "cloud-haze2"); } +.bi-device-hdd-fill::before { content: map-get($bootstrap-icons-map, "device-hdd-fill"); } +.bi-device-hdd::before { content: map-get($bootstrap-icons-map, "device-hdd"); } +.bi-device-ssd-fill::before { content: map-get($bootstrap-icons-map, "device-ssd-fill"); } +.bi-device-ssd::before { content: map-get($bootstrap-icons-map, "device-ssd"); } +.bi-displayport-fill::before { content: map-get($bootstrap-icons-map, "displayport-fill"); } +.bi-mortarboard-fill::before { content: map-get($bootstrap-icons-map, "mortarboard-fill"); } +.bi-mortarboard::before { content: map-get($bootstrap-icons-map, "mortarboard"); } +.bi-terminal-x::before { content: map-get($bootstrap-icons-map, "terminal-x"); } +.bi-arrow-through-heart-fill::before { content: map-get($bootstrap-icons-map, "arrow-through-heart-fill"); } +.bi-arrow-through-heart::before { content: map-get($bootstrap-icons-map, "arrow-through-heart"); } +.bi-badge-sd-fill::before { content: map-get($bootstrap-icons-map, "badge-sd-fill"); } +.bi-badge-sd::before { content: map-get($bootstrap-icons-map, "badge-sd"); } +.bi-bag-heart-fill::before { content: map-get($bootstrap-icons-map, "bag-heart-fill"); } +.bi-bag-heart::before { content: map-get($bootstrap-icons-map, "bag-heart"); } +.bi-balloon-fill::before { content: map-get($bootstrap-icons-map, "balloon-fill"); } +.bi-balloon-heart-fill::before { content: map-get($bootstrap-icons-map, "balloon-heart-fill"); } +.bi-balloon-heart::before { content: map-get($bootstrap-icons-map, "balloon-heart"); } +.bi-balloon::before { content: map-get($bootstrap-icons-map, "balloon"); } +.bi-box2-fill::before { content: map-get($bootstrap-icons-map, "box2-fill"); } +.bi-box2-heart-fill::before { content: map-get($bootstrap-icons-map, "box2-heart-fill"); } +.bi-box2-heart::before { content: map-get($bootstrap-icons-map, "box2-heart"); } +.bi-box2::before { content: map-get($bootstrap-icons-map, "box2"); } +.bi-braces-asterisk::before { content: map-get($bootstrap-icons-map, "braces-asterisk"); } +.bi-calendar-heart-fill::before { content: map-get($bootstrap-icons-map, "calendar-heart-fill"); } +.bi-calendar-heart::before { content: map-get($bootstrap-icons-map, "calendar-heart"); } +.bi-calendar2-heart-fill::before { content: map-get($bootstrap-icons-map, "calendar2-heart-fill"); } +.bi-calendar2-heart::before { content: map-get($bootstrap-icons-map, "calendar2-heart"); } +.bi-chat-heart-fill::before { content: map-get($bootstrap-icons-map, "chat-heart-fill"); } +.bi-chat-heart::before { content: map-get($bootstrap-icons-map, "chat-heart"); } +.bi-chat-left-heart-fill::before { content: map-get($bootstrap-icons-map, "chat-left-heart-fill"); } +.bi-chat-left-heart::before { content: map-get($bootstrap-icons-map, "chat-left-heart"); } +.bi-chat-right-heart-fill::before { content: map-get($bootstrap-icons-map, "chat-right-heart-fill"); } +.bi-chat-right-heart::before { content: map-get($bootstrap-icons-map, "chat-right-heart"); } +.bi-chat-square-heart-fill::before { content: map-get($bootstrap-icons-map, "chat-square-heart-fill"); } +.bi-chat-square-heart::before { content: map-get($bootstrap-icons-map, "chat-square-heart"); } +.bi-clipboard-check-fill::before { content: map-get($bootstrap-icons-map, "clipboard-check-fill"); } +.bi-clipboard-data-fill::before { content: map-get($bootstrap-icons-map, "clipboard-data-fill"); } +.bi-clipboard-fill::before { content: map-get($bootstrap-icons-map, "clipboard-fill"); } +.bi-clipboard-heart-fill::before { content: map-get($bootstrap-icons-map, "clipboard-heart-fill"); } +.bi-clipboard-heart::before { content: map-get($bootstrap-icons-map, "clipboard-heart"); } +.bi-clipboard-minus-fill::before { content: map-get($bootstrap-icons-map, "clipboard-minus-fill"); } +.bi-clipboard-plus-fill::before { content: map-get($bootstrap-icons-map, "clipboard-plus-fill"); } +.bi-clipboard-pulse::before { content: map-get($bootstrap-icons-map, "clipboard-pulse"); } +.bi-clipboard-x-fill::before { content: map-get($bootstrap-icons-map, "clipboard-x-fill"); } +.bi-clipboard2-check-fill::before { content: map-get($bootstrap-icons-map, "clipboard2-check-fill"); } +.bi-clipboard2-check::before { content: map-get($bootstrap-icons-map, "clipboard2-check"); } +.bi-clipboard2-data-fill::before { content: map-get($bootstrap-icons-map, "clipboard2-data-fill"); } +.bi-clipboard2-data::before { content: map-get($bootstrap-icons-map, "clipboard2-data"); } +.bi-clipboard2-fill::before { content: map-get($bootstrap-icons-map, "clipboard2-fill"); } +.bi-clipboard2-heart-fill::before { content: map-get($bootstrap-icons-map, "clipboard2-heart-fill"); } +.bi-clipboard2-heart::before { content: map-get($bootstrap-icons-map, "clipboard2-heart"); } +.bi-clipboard2-minus-fill::before { content: map-get($bootstrap-icons-map, "clipboard2-minus-fill"); } +.bi-clipboard2-minus::before { content: map-get($bootstrap-icons-map, "clipboard2-minus"); } +.bi-clipboard2-plus-fill::before { content: map-get($bootstrap-icons-map, "clipboard2-plus-fill"); } +.bi-clipboard2-plus::before { content: map-get($bootstrap-icons-map, "clipboard2-plus"); } +.bi-clipboard2-pulse-fill::before { content: map-get($bootstrap-icons-map, "clipboard2-pulse-fill"); } +.bi-clipboard2-pulse::before { content: map-get($bootstrap-icons-map, "clipboard2-pulse"); } +.bi-clipboard2-x-fill::before { content: map-get($bootstrap-icons-map, "clipboard2-x-fill"); } +.bi-clipboard2-x::before { content: map-get($bootstrap-icons-map, "clipboard2-x"); } +.bi-clipboard2::before { content: map-get($bootstrap-icons-map, "clipboard2"); } +.bi-emoji-kiss-fill::before { content: map-get($bootstrap-icons-map, "emoji-kiss-fill"); } +.bi-emoji-kiss::before { content: map-get($bootstrap-icons-map, "emoji-kiss"); } +.bi-envelope-heart-fill::before { content: map-get($bootstrap-icons-map, "envelope-heart-fill"); } +.bi-envelope-heart::before { content: map-get($bootstrap-icons-map, "envelope-heart"); } +.bi-envelope-open-heart-fill::before { content: map-get($bootstrap-icons-map, "envelope-open-heart-fill"); } +.bi-envelope-open-heart::before { content: map-get($bootstrap-icons-map, "envelope-open-heart"); } +.bi-envelope-paper-fill::before { content: map-get($bootstrap-icons-map, "envelope-paper-fill"); } +.bi-envelope-paper-heart-fill::before { content: map-get($bootstrap-icons-map, "envelope-paper-heart-fill"); } +.bi-envelope-paper-heart::before { content: map-get($bootstrap-icons-map, "envelope-paper-heart"); } +.bi-envelope-paper::before { content: map-get($bootstrap-icons-map, "envelope-paper"); } +.bi-filetype-aac::before { content: map-get($bootstrap-icons-map, "filetype-aac"); } +.bi-filetype-ai::before { content: map-get($bootstrap-icons-map, "filetype-ai"); } +.bi-filetype-bmp::before { content: map-get($bootstrap-icons-map, "filetype-bmp"); } +.bi-filetype-cs::before { content: map-get($bootstrap-icons-map, "filetype-cs"); } +.bi-filetype-css::before { content: map-get($bootstrap-icons-map, "filetype-css"); } +.bi-filetype-csv::before { content: map-get($bootstrap-icons-map, "filetype-csv"); } +.bi-filetype-doc::before { content: map-get($bootstrap-icons-map, "filetype-doc"); } +.bi-filetype-docx::before { content: map-get($bootstrap-icons-map, "filetype-docx"); } +.bi-filetype-exe::before { content: map-get($bootstrap-icons-map, "filetype-exe"); } +.bi-filetype-gif::before { content: map-get($bootstrap-icons-map, "filetype-gif"); } +.bi-filetype-heic::before { content: map-get($bootstrap-icons-map, "filetype-heic"); } +.bi-filetype-html::before { content: map-get($bootstrap-icons-map, "filetype-html"); } +.bi-filetype-java::before { content: map-get($bootstrap-icons-map, "filetype-java"); } +.bi-filetype-jpg::before { content: map-get($bootstrap-icons-map, "filetype-jpg"); } +.bi-filetype-js::before { content: map-get($bootstrap-icons-map, "filetype-js"); } +.bi-filetype-jsx::before { content: map-get($bootstrap-icons-map, "filetype-jsx"); } +.bi-filetype-key::before { content: map-get($bootstrap-icons-map, "filetype-key"); } +.bi-filetype-m4p::before { content: map-get($bootstrap-icons-map, "filetype-m4p"); } +.bi-filetype-md::before { content: map-get($bootstrap-icons-map, "filetype-md"); } +.bi-filetype-mdx::before { content: map-get($bootstrap-icons-map, "filetype-mdx"); } +.bi-filetype-mov::before { content: map-get($bootstrap-icons-map, "filetype-mov"); } +.bi-filetype-mp3::before { content: map-get($bootstrap-icons-map, "filetype-mp3"); } +.bi-filetype-mp4::before { content: map-get($bootstrap-icons-map, "filetype-mp4"); } +.bi-filetype-otf::before { content: map-get($bootstrap-icons-map, "filetype-otf"); } +.bi-filetype-pdf::before { content: map-get($bootstrap-icons-map, "filetype-pdf"); } +.bi-filetype-php::before { content: map-get($bootstrap-icons-map, "filetype-php"); } +.bi-filetype-png::before { content: map-get($bootstrap-icons-map, "filetype-png"); } +.bi-filetype-ppt-1::before { content: map-get($bootstrap-icons-map, "filetype-ppt-1"); } +.bi-filetype-ppt::before { content: map-get($bootstrap-icons-map, "filetype-ppt"); } +.bi-filetype-psd::before { content: map-get($bootstrap-icons-map, "filetype-psd"); } +.bi-filetype-py::before { content: map-get($bootstrap-icons-map, "filetype-py"); } +.bi-filetype-raw::before { content: map-get($bootstrap-icons-map, "filetype-raw"); } +.bi-filetype-rb::before { content: map-get($bootstrap-icons-map, "filetype-rb"); } +.bi-filetype-sass::before { content: map-get($bootstrap-icons-map, "filetype-sass"); } +.bi-filetype-scss::before { content: map-get($bootstrap-icons-map, "filetype-scss"); } +.bi-filetype-sh::before { content: map-get($bootstrap-icons-map, "filetype-sh"); } +.bi-filetype-svg::before { content: map-get($bootstrap-icons-map, "filetype-svg"); } +.bi-filetype-tiff::before { content: map-get($bootstrap-icons-map, "filetype-tiff"); } +.bi-filetype-tsx::before { content: map-get($bootstrap-icons-map, "filetype-tsx"); } +.bi-filetype-ttf::before { content: map-get($bootstrap-icons-map, "filetype-ttf"); } +.bi-filetype-txt::before { content: map-get($bootstrap-icons-map, "filetype-txt"); } +.bi-filetype-wav::before { content: map-get($bootstrap-icons-map, "filetype-wav"); } +.bi-filetype-woff::before { content: map-get($bootstrap-icons-map, "filetype-woff"); } +.bi-filetype-xls-1::before { content: map-get($bootstrap-icons-map, "filetype-xls-1"); } +.bi-filetype-xls::before { content: map-get($bootstrap-icons-map, "filetype-xls"); } +.bi-filetype-xml::before { content: map-get($bootstrap-icons-map, "filetype-xml"); } +.bi-filetype-yml::before { content: map-get($bootstrap-icons-map, "filetype-yml"); } +.bi-heart-arrow::before { content: map-get($bootstrap-icons-map, "heart-arrow"); } +.bi-heart-pulse-fill::before { content: map-get($bootstrap-icons-map, "heart-pulse-fill"); } +.bi-heart-pulse::before { content: map-get($bootstrap-icons-map, "heart-pulse"); } +.bi-heartbreak-fill::before { content: map-get($bootstrap-icons-map, "heartbreak-fill"); } +.bi-heartbreak::before { content: map-get($bootstrap-icons-map, "heartbreak"); } +.bi-hearts::before { content: map-get($bootstrap-icons-map, "hearts"); } +.bi-hospital-fill::before { content: map-get($bootstrap-icons-map, "hospital-fill"); } +.bi-hospital::before { content: map-get($bootstrap-icons-map, "hospital"); } +.bi-house-heart-fill::before { content: map-get($bootstrap-icons-map, "house-heart-fill"); } +.bi-house-heart::before { content: map-get($bootstrap-icons-map, "house-heart"); } +.bi-incognito::before { content: map-get($bootstrap-icons-map, "incognito"); } +.bi-magnet-fill::before { content: map-get($bootstrap-icons-map, "magnet-fill"); } +.bi-magnet::before { content: map-get($bootstrap-icons-map, "magnet"); } +.bi-person-heart::before { content: map-get($bootstrap-icons-map, "person-heart"); } +.bi-person-hearts::before { content: map-get($bootstrap-icons-map, "person-hearts"); } +.bi-phone-flip::before { content: map-get($bootstrap-icons-map, "phone-flip"); } +.bi-plugin::before { content: map-get($bootstrap-icons-map, "plugin"); } +.bi-postage-fill::before { content: map-get($bootstrap-icons-map, "postage-fill"); } +.bi-postage-heart-fill::before { content: map-get($bootstrap-icons-map, "postage-heart-fill"); } +.bi-postage-heart::before { content: map-get($bootstrap-icons-map, "postage-heart"); } +.bi-postage::before { content: map-get($bootstrap-icons-map, "postage"); } +.bi-postcard-fill::before { content: map-get($bootstrap-icons-map, "postcard-fill"); } +.bi-postcard-heart-fill::before { content: map-get($bootstrap-icons-map, "postcard-heart-fill"); } +.bi-postcard-heart::before { content: map-get($bootstrap-icons-map, "postcard-heart"); } +.bi-postcard::before { content: map-get($bootstrap-icons-map, "postcard"); } +.bi-search-heart-fill::before { content: map-get($bootstrap-icons-map, "search-heart-fill"); } +.bi-search-heart::before { content: map-get($bootstrap-icons-map, "search-heart"); } +.bi-sliders2-vertical::before { content: map-get($bootstrap-icons-map, "sliders2-vertical"); } +.bi-sliders2::before { content: map-get($bootstrap-icons-map, "sliders2"); } +.bi-trash3-fill::before { content: map-get($bootstrap-icons-map, "trash3-fill"); } +.bi-trash3::before { content: map-get($bootstrap-icons-map, "trash3"); } +.bi-valentine::before { content: map-get($bootstrap-icons-map, "valentine"); } +.bi-valentine2::before { content: map-get($bootstrap-icons-map, "valentine2"); } +.bi-wrench-adjustable-circle-fill::before { content: map-get($bootstrap-icons-map, "wrench-adjustable-circle-fill"); } +.bi-wrench-adjustable-circle::before { content: map-get($bootstrap-icons-map, "wrench-adjustable-circle"); } +.bi-wrench-adjustable::before { content: map-get($bootstrap-icons-map, "wrench-adjustable"); } +.bi-filetype-json::before { content: map-get($bootstrap-icons-map, "filetype-json"); } +.bi-filetype-pptx::before { content: map-get($bootstrap-icons-map, "filetype-pptx"); } +.bi-filetype-xlsx::before { content: map-get($bootstrap-icons-map, "filetype-xlsx"); } +.bi-1-circle-1::before { content: map-get($bootstrap-icons-map, "1-circle-1"); } +.bi-1-circle-fill-1::before { content: map-get($bootstrap-icons-map, "1-circle-fill-1"); } +.bi-1-circle-fill::before { content: map-get($bootstrap-icons-map, "1-circle-fill"); } +.bi-1-circle::before { content: map-get($bootstrap-icons-map, "1-circle"); } +.bi-1-square-fill::before { content: map-get($bootstrap-icons-map, "1-square-fill"); } +.bi-1-square::before { content: map-get($bootstrap-icons-map, "1-square"); } +.bi-2-circle-1::before { content: map-get($bootstrap-icons-map, "2-circle-1"); } +.bi-2-circle-fill-1::before { content: map-get($bootstrap-icons-map, "2-circle-fill-1"); } +.bi-2-circle-fill::before { content: map-get($bootstrap-icons-map, "2-circle-fill"); } +.bi-2-circle::before { content: map-get($bootstrap-icons-map, "2-circle"); } +.bi-2-square-fill::before { content: map-get($bootstrap-icons-map, "2-square-fill"); } +.bi-2-square::before { content: map-get($bootstrap-icons-map, "2-square"); } +.bi-3-circle-1::before { content: map-get($bootstrap-icons-map, "3-circle-1"); } +.bi-3-circle-fill-1::before { content: map-get($bootstrap-icons-map, "3-circle-fill-1"); } +.bi-3-circle-fill::before { content: map-get($bootstrap-icons-map, "3-circle-fill"); } +.bi-3-circle::before { content: map-get($bootstrap-icons-map, "3-circle"); } +.bi-3-square-fill::before { content: map-get($bootstrap-icons-map, "3-square-fill"); } +.bi-3-square::before { content: map-get($bootstrap-icons-map, "3-square"); } +.bi-4-circle-1::before { content: map-get($bootstrap-icons-map, "4-circle-1"); } +.bi-4-circle-fill-1::before { content: map-get($bootstrap-icons-map, "4-circle-fill-1"); } +.bi-4-circle-fill::before { content: map-get($bootstrap-icons-map, "4-circle-fill"); } +.bi-4-circle::before { content: map-get($bootstrap-icons-map, "4-circle"); } +.bi-4-square-fill::before { content: map-get($bootstrap-icons-map, "4-square-fill"); } +.bi-4-square::before { content: map-get($bootstrap-icons-map, "4-square"); } +.bi-5-circle-1::before { content: map-get($bootstrap-icons-map, "5-circle-1"); } +.bi-5-circle-fill-1::before { content: map-get($bootstrap-icons-map, "5-circle-fill-1"); } +.bi-5-circle-fill::before { content: map-get($bootstrap-icons-map, "5-circle-fill"); } +.bi-5-circle::before { content: map-get($bootstrap-icons-map, "5-circle"); } +.bi-5-square-fill::before { content: map-get($bootstrap-icons-map, "5-square-fill"); } +.bi-5-square::before { content: map-get($bootstrap-icons-map, "5-square"); } +.bi-6-circle-1::before { content: map-get($bootstrap-icons-map, "6-circle-1"); } +.bi-6-circle-fill-1::before { content: map-get($bootstrap-icons-map, "6-circle-fill-1"); } +.bi-6-circle-fill::before { content: map-get($bootstrap-icons-map, "6-circle-fill"); } +.bi-6-circle::before { content: map-get($bootstrap-icons-map, "6-circle"); } +.bi-6-square-fill::before { content: map-get($bootstrap-icons-map, "6-square-fill"); } +.bi-6-square::before { content: map-get($bootstrap-icons-map, "6-square"); } +.bi-7-circle-1::before { content: map-get($bootstrap-icons-map, "7-circle-1"); } +.bi-7-circle-fill-1::before { content: map-get($bootstrap-icons-map, "7-circle-fill-1"); } +.bi-7-circle-fill::before { content: map-get($bootstrap-icons-map, "7-circle-fill"); } +.bi-7-circle::before { content: map-get($bootstrap-icons-map, "7-circle"); } +.bi-7-square-fill::before { content: map-get($bootstrap-icons-map, "7-square-fill"); } +.bi-7-square::before { content: map-get($bootstrap-icons-map, "7-square"); } +.bi-8-circle-1::before { content: map-get($bootstrap-icons-map, "8-circle-1"); } +.bi-8-circle-fill-1::before { content: map-get($bootstrap-icons-map, "8-circle-fill-1"); } +.bi-8-circle-fill::before { content: map-get($bootstrap-icons-map, "8-circle-fill"); } +.bi-8-circle::before { content: map-get($bootstrap-icons-map, "8-circle"); } +.bi-8-square-fill::before { content: map-get($bootstrap-icons-map, "8-square-fill"); } +.bi-8-square::before { content: map-get($bootstrap-icons-map, "8-square"); } +.bi-9-circle-1::before { content: map-get($bootstrap-icons-map, "9-circle-1"); } +.bi-9-circle-fill-1::before { content: map-get($bootstrap-icons-map, "9-circle-fill-1"); } +.bi-9-circle-fill::before { content: map-get($bootstrap-icons-map, "9-circle-fill"); } +.bi-9-circle::before { content: map-get($bootstrap-icons-map, "9-circle"); } +.bi-9-square-fill::before { content: map-get($bootstrap-icons-map, "9-square-fill"); } +.bi-9-square::before { content: map-get($bootstrap-icons-map, "9-square"); } +.bi-airplane-engines-fill::before { content: map-get($bootstrap-icons-map, "airplane-engines-fill"); } +.bi-airplane-engines::before { content: map-get($bootstrap-icons-map, "airplane-engines"); } +.bi-airplane-fill::before { content: map-get($bootstrap-icons-map, "airplane-fill"); } +.bi-airplane::before { content: map-get($bootstrap-icons-map, "airplane"); } +.bi-alexa::before { content: map-get($bootstrap-icons-map, "alexa"); } +.bi-alipay::before { content: map-get($bootstrap-icons-map, "alipay"); } +.bi-android::before { content: map-get($bootstrap-icons-map, "android"); } +.bi-android2::before { content: map-get($bootstrap-icons-map, "android2"); } +.bi-box-fill::before { content: map-get($bootstrap-icons-map, "box-fill"); } +.bi-box-seam-fill::before { content: map-get($bootstrap-icons-map, "box-seam-fill"); } +.bi-browser-chrome::before { content: map-get($bootstrap-icons-map, "browser-chrome"); } +.bi-browser-edge::before { content: map-get($bootstrap-icons-map, "browser-edge"); } +.bi-browser-firefox::before { content: map-get($bootstrap-icons-map, "browser-firefox"); } +.bi-browser-safari::before { content: map-get($bootstrap-icons-map, "browser-safari"); } +.bi-c-circle-1::before { content: map-get($bootstrap-icons-map, "c-circle-1"); } +.bi-c-circle-fill-1::before { content: map-get($bootstrap-icons-map, "c-circle-fill-1"); } +.bi-c-circle-fill::before { content: map-get($bootstrap-icons-map, "c-circle-fill"); } +.bi-c-circle::before { content: map-get($bootstrap-icons-map, "c-circle"); } +.bi-c-square-fill::before { content: map-get($bootstrap-icons-map, "c-square-fill"); } +.bi-c-square::before { content: map-get($bootstrap-icons-map, "c-square"); } +.bi-capsule-pill::before { content: map-get($bootstrap-icons-map, "capsule-pill"); } +.bi-capsule::before { content: map-get($bootstrap-icons-map, "capsule"); } +.bi-car-front-fill::before { content: map-get($bootstrap-icons-map, "car-front-fill"); } +.bi-car-front::before { content: map-get($bootstrap-icons-map, "car-front"); } +.bi-cassette-fill::before { content: map-get($bootstrap-icons-map, "cassette-fill"); } +.bi-cassette::before { content: map-get($bootstrap-icons-map, "cassette"); } +.bi-cc-circle-1::before { content: map-get($bootstrap-icons-map, "cc-circle-1"); } +.bi-cc-circle-fill-1::before { content: map-get($bootstrap-icons-map, "cc-circle-fill-1"); } +.bi-cc-circle-fill::before { content: map-get($bootstrap-icons-map, "cc-circle-fill"); } +.bi-cc-circle::before { content: map-get($bootstrap-icons-map, "cc-circle"); } +.bi-cc-square-fill::before { content: map-get($bootstrap-icons-map, "cc-square-fill"); } +.bi-cc-square::before { content: map-get($bootstrap-icons-map, "cc-square"); } +.bi-cup-hot-fill::before { content: map-get($bootstrap-icons-map, "cup-hot-fill"); } +.bi-cup-hot::before { content: map-get($bootstrap-icons-map, "cup-hot"); } +.bi-currency-rupee::before { content: map-get($bootstrap-icons-map, "currency-rupee"); } +.bi-dropbox::before { content: map-get($bootstrap-icons-map, "dropbox"); } +.bi-escape::before { content: map-get($bootstrap-icons-map, "escape"); } +.bi-fast-forward-btn-fill::before { content: map-get($bootstrap-icons-map, "fast-forward-btn-fill"); } +.bi-fast-forward-btn::before { content: map-get($bootstrap-icons-map, "fast-forward-btn"); } +.bi-fast-forward-circle-fill::before { content: map-get($bootstrap-icons-map, "fast-forward-circle-fill"); } +.bi-fast-forward-circle::before { content: map-get($bootstrap-icons-map, "fast-forward-circle"); } +.bi-fast-forward-fill::before { content: map-get($bootstrap-icons-map, "fast-forward-fill"); } +.bi-fast-forward::before { content: map-get($bootstrap-icons-map, "fast-forward"); } +.bi-filetype-sql::before { content: map-get($bootstrap-icons-map, "filetype-sql"); } +.bi-fire::before { content: map-get($bootstrap-icons-map, "fire"); } +.bi-google-play::before { content: map-get($bootstrap-icons-map, "google-play"); } +.bi-h-circle-1::before { content: map-get($bootstrap-icons-map, "h-circle-1"); } +.bi-h-circle-fill-1::before { content: map-get($bootstrap-icons-map, "h-circle-fill-1"); } +.bi-h-circle-fill::before { content: map-get($bootstrap-icons-map, "h-circle-fill"); } +.bi-h-circle::before { content: map-get($bootstrap-icons-map, "h-circle"); } +.bi-h-square-fill::before { content: map-get($bootstrap-icons-map, "h-square-fill"); } +.bi-h-square::before { content: map-get($bootstrap-icons-map, "h-square"); } +.bi-indent::before { content: map-get($bootstrap-icons-map, "indent"); } +.bi-lungs-fill::before { content: map-get($bootstrap-icons-map, "lungs-fill"); } +.bi-lungs::before { content: map-get($bootstrap-icons-map, "lungs"); } +.bi-microsoft-teams::before { content: map-get($bootstrap-icons-map, "microsoft-teams"); } +.bi-p-circle-1::before { content: map-get($bootstrap-icons-map, "p-circle-1"); } +.bi-p-circle-fill-1::before { content: map-get($bootstrap-icons-map, "p-circle-fill-1"); } +.bi-p-circle-fill::before { content: map-get($bootstrap-icons-map, "p-circle-fill"); } +.bi-p-circle::before { content: map-get($bootstrap-icons-map, "p-circle"); } +.bi-p-square-fill::before { content: map-get($bootstrap-icons-map, "p-square-fill"); } +.bi-p-square::before { content: map-get($bootstrap-icons-map, "p-square"); } +.bi-pass-fill::before { content: map-get($bootstrap-icons-map, "pass-fill"); } +.bi-pass::before { content: map-get($bootstrap-icons-map, "pass"); } +.bi-prescription::before { content: map-get($bootstrap-icons-map, "prescription"); } +.bi-prescription2::before { content: map-get($bootstrap-icons-map, "prescription2"); } +.bi-r-circle-1::before { content: map-get($bootstrap-icons-map, "r-circle-1"); } +.bi-r-circle-fill-1::before { content: map-get($bootstrap-icons-map, "r-circle-fill-1"); } +.bi-r-circle-fill::before { content: map-get($bootstrap-icons-map, "r-circle-fill"); } +.bi-r-circle::before { content: map-get($bootstrap-icons-map, "r-circle"); } +.bi-r-square-fill::before { content: map-get($bootstrap-icons-map, "r-square-fill"); } +.bi-r-square::before { content: map-get($bootstrap-icons-map, "r-square"); } +.bi-repeat-1::before { content: map-get($bootstrap-icons-map, "repeat-1"); } +.bi-repeat::before { content: map-get($bootstrap-icons-map, "repeat"); } +.bi-rewind-btn-fill::before { content: map-get($bootstrap-icons-map, "rewind-btn-fill"); } +.bi-rewind-btn::before { content: map-get($bootstrap-icons-map, "rewind-btn"); } +.bi-rewind-circle-fill::before { content: map-get($bootstrap-icons-map, "rewind-circle-fill"); } +.bi-rewind-circle::before { content: map-get($bootstrap-icons-map, "rewind-circle"); } +.bi-rewind-fill::before { content: map-get($bootstrap-icons-map, "rewind-fill"); } +.bi-rewind::before { content: map-get($bootstrap-icons-map, "rewind"); } +.bi-train-freight-front-fill::before { content: map-get($bootstrap-icons-map, "train-freight-front-fill"); } +.bi-train-freight-front::before { content: map-get($bootstrap-icons-map, "train-freight-front"); } +.bi-train-front-fill::before { content: map-get($bootstrap-icons-map, "train-front-fill"); } +.bi-train-front::before { content: map-get($bootstrap-icons-map, "train-front"); } +.bi-train-lightrail-front-fill::before { content: map-get($bootstrap-icons-map, "train-lightrail-front-fill"); } +.bi-train-lightrail-front::before { content: map-get($bootstrap-icons-map, "train-lightrail-front"); } +.bi-truck-front-fill::before { content: map-get($bootstrap-icons-map, "truck-front-fill"); } +.bi-truck-front::before { content: map-get($bootstrap-icons-map, "truck-front"); } +.bi-ubuntu::before { content: map-get($bootstrap-icons-map, "ubuntu"); } +.bi-unindent::before { content: map-get($bootstrap-icons-map, "unindent"); } +.bi-unity::before { content: map-get($bootstrap-icons-map, "unity"); } +.bi-universal-access-circle::before { content: map-get($bootstrap-icons-map, "universal-access-circle"); } +.bi-universal-access::before { content: map-get($bootstrap-icons-map, "universal-access"); } +.bi-virus::before { content: map-get($bootstrap-icons-map, "virus"); } +.bi-virus2::before { content: map-get($bootstrap-icons-map, "virus2"); } +.bi-wechat::before { content: map-get($bootstrap-icons-map, "wechat"); } +.bi-yelp::before { content: map-get($bootstrap-icons-map, "yelp"); } +.bi-sign-stop-fill::before { content: map-get($bootstrap-icons-map, "sign-stop-fill"); } +.bi-sign-stop-lights-fill::before { content: map-get($bootstrap-icons-map, "sign-stop-lights-fill"); } +.bi-sign-stop-lights::before { content: map-get($bootstrap-icons-map, "sign-stop-lights"); } +.bi-sign-stop::before { content: map-get($bootstrap-icons-map, "sign-stop"); } +.bi-sign-turn-left-fill::before { content: map-get($bootstrap-icons-map, "sign-turn-left-fill"); } +.bi-sign-turn-left::before { content: map-get($bootstrap-icons-map, "sign-turn-left"); } +.bi-sign-turn-right-fill::before { content: map-get($bootstrap-icons-map, "sign-turn-right-fill"); } +.bi-sign-turn-right::before { content: map-get($bootstrap-icons-map, "sign-turn-right"); } +.bi-sign-turn-slight-left-fill::before { content: map-get($bootstrap-icons-map, "sign-turn-slight-left-fill"); } +.bi-sign-turn-slight-left::before { content: map-get($bootstrap-icons-map, "sign-turn-slight-left"); } +.bi-sign-turn-slight-right-fill::before { content: map-get($bootstrap-icons-map, "sign-turn-slight-right-fill"); } +.bi-sign-turn-slight-right::before { content: map-get($bootstrap-icons-map, "sign-turn-slight-right"); } +.bi-sign-yield-fill::before { content: map-get($bootstrap-icons-map, "sign-yield-fill"); } +.bi-sign-yield::before { content: map-get($bootstrap-icons-map, "sign-yield"); } +.bi-ev-station-fill::before { content: map-get($bootstrap-icons-map, "ev-station-fill"); } +.bi-ev-station::before { content: map-get($bootstrap-icons-map, "ev-station"); } +.bi-fuel-pump-diesel-fill::before { content: map-get($bootstrap-icons-map, "fuel-pump-diesel-fill"); } +.bi-fuel-pump-diesel::before { content: map-get($bootstrap-icons-map, "fuel-pump-diesel"); } +.bi-fuel-pump-fill::before { content: map-get($bootstrap-icons-map, "fuel-pump-fill"); } +.bi-fuel-pump::before { content: map-get($bootstrap-icons-map, "fuel-pump"); } diff --git a/src/main/resources/static/css/_bootstrap.scss b/src/main/resources/static/css/_bootstrap.scss new file mode 100644 index 0000000..e128bd3 --- /dev/null +++ b/src/main/resources/static/css/_bootstrap.scss @@ -0,0 +1,38 @@ +// bootstrap +@import "./bootstrap/functions"; +@import "./bootstrap/variables"; +@import "./bootstrap/mixins"; +@import "./bootstrap/root"; +@import "./bootstrap/reboot"; +@import "./bootstrap/type"; +@import "./bootstrap/images"; +//@import "./bootstrap/code"; +@import "./bootstrap/grid"; +@import "./bootstrap/tables"; +@import "./bootstrap/forms"; +@import "./bootstrap/buttons"; +@import "./bootstrap/transitions"; +@import "./bootstrap/dropdown"; +@import "./bootstrap/button-group"; +@import "./bootstrap/input-group"; +@import "./bootstrap/custom-forms"; +@import "./bootstrap/nav"; +@import "./bootstrap/navbar"; +@import "./bootstrap/card"; +@import "./bootstrap/breadcrumb"; +@import "./bootstrap/pagination"; +@import "./bootstrap/badge"; +//@import "./bootstrap/jumbotron"; +@import "./bootstrap/alert"; +@import "./bootstrap/progress"; +//@import "./bootstrap/media"; +@import "./bootstrap/list-group"; +@import "./bootstrap/close"; +//@import "./bootstrap/toasts"; +@import "./bootstrap/modal"; +@import "./bootstrap/tooltip"; +//@import "./bootstrap/popover";/ +//@import "./bootstrap/carousel"; +@import "./bootstrap/spinners"; +@import "./bootstrap/utilities"; +@import "./bootstrap/print"; \ No newline at end of file diff --git a/src/main/resources/static/css/_croppie.scss b/src/main/resources/static/css/_croppie.scss new file mode 100644 index 0000000..630d645 --- /dev/null +++ b/src/main/resources/static/css/_croppie.scss @@ -0,0 +1,250 @@ +.croppie-container { + width: 100%; + height: 100%; +} + +.croppie-container .cr-image { + z-index: -1; + position: absolute; + top: 0; + left: 0; + transform-origin: 0 0; + max-height: none; + max-width: none; +} + +.croppie-container .cr-boundary { + position: relative; + overflow: hidden; + margin: 0 auto; + z-index: 1; + width: 100%; + height: 100%; +} + +.croppie-container .cr-viewport, +.croppie-container .cr-resizer { + position: absolute; + border: 2px solid #fff; + margin: auto; + top: 0; + bottom: 0; + right: 0; + left: 0; + box-shadow: 0 0 2000px 2000px rgba(0, 0, 0, 0.5); + z-index: 0; +} + +.croppie-container .cr-resizer { + z-index: 2; + box-shadow: none; + pointer-events: none; +} + +.croppie-container .cr-resizer-vertical, +.croppie-container .cr-resizer-horisontal { + position: absolute; + pointer-events: all; +} + +.croppie-container .cr-resizer-vertical::after, +.croppie-container .cr-resizer-horisontal::after { + display: block; + position: absolute; + box-sizing: border-box; + border: 1px solid black; + background: #fff; + width: 10px; + height: 10px; + content: ''; +} + +.croppie-container .cr-resizer-vertical { + bottom: -5px; + cursor: row-resize; + width: 100%; + height: 10px; +} + +.croppie-container .cr-resizer-vertical::after { + left: 50%; + margin-left: -5px; +} + +.croppie-container .cr-resizer-horisontal { + right: -5px; + cursor: col-resize; + width: 10px; + height: 100%; +} + +.croppie-container .cr-resizer-horisontal::after { + top: 50%; + margin-top: -5px; +} + +.croppie-container .cr-original-image { + display: none; +} + +.croppie-container .cr-vp-circle { + border-radius: 50%; +} + +.croppie-container .cr-overlay { + z-index: 1; + position: absolute; + cursor: move; + touch-action: none; +} + +.croppie-container .cr-slider-wrap { + width: 75%; + margin: 15px auto; + text-align: center; +} + +.croppie-result { + position: relative; + overflow: hidden; +} + +.croppie-result img { + position: absolute; +} + +.croppie-container .cr-image, +.croppie-container .cr-overlay, +.croppie-container .cr-viewport { + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} + +/*************************************/ +/***** STYLING RANGE INPUT ***********/ +/*************************************/ +/*http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html */ +/*************************************/ + +.cr-slider { + -webkit-appearance: none; + /*removes default webkit styles*/ + /*border: 1px solid white; *//*fix for FF unable to apply focus style bug */ + width: 300px; + /*required for proper track sizing in FF*/ + max-width: 100%; + padding-top: 8px; + padding-bottom: 8px; + background-color: transparent; +} + +.cr-slider::-webkit-slider-runnable-track { + width: 100%; + height: 3px; + background: rgba(0, 0, 0, 0.5); + border: 0; + border-radius: 3px; +} + +.cr-slider::-webkit-slider-thumb { + -webkit-appearance: none; + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top: -6px; +} + +.cr-slider:focus { + outline: none; +} +/* +.cr-slider:focus::-webkit-slider-runnable-track { +background: #ccc; +} +*/ + +.cr-slider::-moz-range-track { + width: 100%; + height: 3px; + background: rgba(0, 0, 0, 0.5); + border: 0; + border-radius: 3px; +} + +.cr-slider::-moz-range-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top: -6px; +} + +/*hide the outline behind the border*/ +.cr-slider:-moz-focusring { + outline: 1px solid white; + outline-offset: -1px; +} + +.cr-slider::-ms-track { + width: 100%; + height: 5px; + background: transparent; + /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */ + border-color: transparent;/*leave room for the larger thumb to overflow with a transparent border */ + border-width: 6px 0; + color: transparent;/*remove default tick marks*/ +} +.cr-slider::-ms-fill-lower { + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; +} +.cr-slider::-ms-fill-upper { + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; +} +.cr-slider::-ms-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top:1px; +} +.cr-slider:focus::-ms-fill-lower { + background: rgba(0, 0, 0, 0.5); +} +.cr-slider:focus::-ms-fill-upper { + background: rgba(0, 0, 0, 0.5); +} +/*******************************************/ + +/***********************************/ +/* Rotation Tools */ +/***********************************/ +.cr-rotate-controls { + position: absolute; + bottom: 5px; + left: 5px; + z-index: 1; +} +.cr-rotate-controls button { + border: 0; + background: none; +} +.cr-rotate-controls i:before { + display: inline-block; + font-style: normal; + font-weight: 900; + font-size: 22px; +} +.cr-rotate-l i:before { + content: '↺'; +} +.cr-rotate-r i:before { + content: '↻'; +} \ No newline at end of file diff --git a/src/main/resources/static/css/_datatables.scss b/src/main/resources/static/css/_datatables.scss new file mode 100644 index 0000000..e9d61b6 --- /dev/null +++ b/src/main/resources/static/css/_datatables.scss @@ -0,0 +1,22 @@ +/* + * This combined file was created by the DataTables downloader builder: + * https://datatables.net/download + * + * To rebuild or modify this file with the latest versions of the included + * software please visit: + * https://datatables.net/download/#bs4/jszip-2.5.0/dt-1.10.22/b-1.6.5/b-html5-1.6.5/fh-3.1.7/kt-2.5.3 + * + * Included libraries: + * JSZip 2.5.0, DataTables 1.10.22, Buttons 1.6.5, HTML5 export 1.6.5, FixedHeader 3.1.7, KeyTable 2.5.3 + */ + +table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:0.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>thead>tr>th:not(.sorting_disabled),table.dataTable>thead>tr>td:not(.sorting_disabled){padding-right:30px}table.dataTable>thead .sorting,table.dataTable>thead .sorting_asc,table.dataTable>thead .sorting_desc,table.dataTable>thead .sorting_asc_disabled,table.dataTable>thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{position:absolute;bottom:0.9em;display:block;opacity:0.3}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:before{right:1em;content:"\2191"}table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:after{right:0.5em;content:"\2193"}table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:after{opacity:1}table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:before,div.dataTables_scrollBody table thead .sorting_asc:before,div.dataTables_scrollBody table thead .sorting_desc:before,div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:0.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0} + + +@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-button-collection-title{text-align:center;padding:0.3em 0 0.5em;font-size:0.9em}div.dt-button-collection-title:empty{display:none}div.dt-button-collection{position:absolute;z-index:2001}div.dt-button-collection div.dropdown-menu{display:block;z-index:2002;min-width:100%}div.dt-button-collection div.dt-button-collection-title{background-color:white;border:1px solid rgba(0,0,0,0.15)}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>:last-child{display:block !important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-collection.fixed{max-width:none}div.dt-button-collection.fixed:before,div.dt-button-collection.fixed:after{display:none}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:999}@media screen and (max-width: 767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5em}div.dt-buttons a.btn{float:none}}div.dt-buttons button.btn.processing,div.dt-buttons div.btn.processing,div.dt-buttons a.btn.processing{color:rgba(0,0,0,0.2)}div.dt-buttons button.btn.processing:after,div.dt-buttons div.btn.processing:after,div.dt-buttons a.btn.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear} + + +table.dataTable.fixedHeader-floating,table.dataTable.fixedHeader-locked{background-color:white;margin-top:0 !important;margin-bottom:0 !important}table.dataTable.fixedHeader-floating{position:fixed !important}table.dataTable.fixedHeader-locked{position:absolute !important}@media print{table.fixedHeader-floating{display:none}} + + +table.dataTable tbody th.focus,table.dataTable tbody td.focus{box-shadow:inset 0 0 1px 2px #0275d8}div.dtk-focus-alt table.dataTable tbody th.focus,div.dtk-focus-alt table.dataTable tbody td.focus{box-shadow:inset 0 0 1px 2px #ff8b33} \ No newline at end of file diff --git a/src/main/resources/static/css/_flaticon.scss b/src/main/resources/static/css/_flaticon.scss new file mode 100644 index 0000000..a254e26 --- /dev/null +++ b/src/main/resources/static/css/_flaticon.scss @@ -0,0 +1,116 @@ +$flaticon-font: "flaticon"; + +@font-face { + font-family: $flaticon-font; + src: url("./fonts/Flaticon.ttf?fed325219c39afc02d372e888d57d844") format("truetype"), + url("./fonts/Flaticon.woff?fed325219c39afc02d372e888d57d844") format("woff"), + url("./fonts/Flaticon.woff2?fed325219c39afc02d372e888d57d844") format("woff2"), + url("./fonts/Flaticon.eot?fed325219c39afc02d372e888d57d844#iefix") format("embedded-opentype"), + url("./fonts/Flaticon.svg?fed325219c39afc02d372e888d57d844#flaticon") format("svg"); +} + +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: "Flaticon"; + src: url("./fonts/Flaticon.svg#Flaticon") format("svg"); + } +} + +.fi:before{ + font-family: flaticon !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +$flaticon-map: ( + "edit": "\f101", + "gear": "\f102", + "user": "\f103", + "trash": "\f104", + "search": "\f105", + "target": "\f106", + "pdf": "\f107", + "excel": "\f108", + "printer": "\f109", + "book": "\f10a", + "eye": "\f10b", + "chemical": "\f10c", + "raw-material": "\f10d", + "accessory": "\f10e", + "carton-box": "\f10f", + "cross": "\f110", + "check": "\f111", + "disabled": "\f112", + "information": "\f113", + "like": "\f114", + "crown": "\f115", +); + +.flaticon-edit:before { + content: map-get($flaticon-map, "edit"); +} +.flaticon-gear:before { + content: map-get($flaticon-map, "gear"); +} +.flaticon-user:before { + content: map-get($flaticon-map, "user"); +} +.flaticon-trash:before { + content: map-get($flaticon-map, "trash"); +} +.flaticon-search:before { + content: map-get($flaticon-map, "search"); +} +.flaticon-target:before { + content: map-get($flaticon-map, "target"); +} +.flaticon-pdf:before { + content: map-get($flaticon-map, "pdf"); +} +.flaticon-excel:before { + content: map-get($flaticon-map, "excel"); +} +.flaticon-printer:before { + content: map-get($flaticon-map, "printer"); +} +.flaticon-book:before { + content: map-get($flaticon-map, "book"); +} +.flaticon-eye:before { + content: map-get($flaticon-map, "eye"); +} +.flaticon-chemical:before { + content: map-get($flaticon-map, "chemical"); +} +.flaticon-raw-material:before { + content: map-get($flaticon-map, "raw-material"); +} +.flaticon-accessory:before { + content: map-get($flaticon-map, "accessory"); +} +.flaticon-carton-box:before { + content: map-get($flaticon-map, "carton-box"); +} +.flaticon-cross:before { + content: map-get($flaticon-map, "cross"); +} +.flaticon-check:before { + content: map-get($flaticon-map, "check"); +} +.flaticon-disabled:before { + content: map-get($flaticon-map, "disabled"); +} +.flaticon-information:before { + content: map-get($flaticon-map, "information"); +} +.flaticon-like:before { + content: map-get($flaticon-map, "like"); +} +.flaticon-crown:before { + content: map-get($flaticon-map, "crown"); +} \ No newline at end of file diff --git a/src/main/resources/static/css/_jquery-ui.scss b/src/main/resources/static/css/_jquery-ui.scss new file mode 100644 index 0000000..4475f84 --- /dev/null +++ b/src/main/resources/static/css/_jquery-ui.scss @@ -0,0 +1,758 @@ +/*! jQuery UI - v1.12.1 - 2020-02-27 +* http://jqueryui.com +* Includes: core.css, autocomplete.css, menu.css, datepicker.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=smoothness&cornerRadiusShadow=8px&offsetLeftShadow=-8px&offsetTopShadow=-8px&thicknessShadow=8px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=aaaaaa&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cd0a0a&fcError=cd0a0a&borderColorError=cd0a0a&bgImgOpacityError=95&bgTextureError=glass&bgColorError=fef1ec&iconColorHighlight=2e83ff&fcHighlight=363636&borderColorHighlight=fcefa1&bgImgOpacityHighlight=55&bgTextureHighlight=glass&bgColorHighlight=fbf9ee&iconColorActive=454545&fcActive=212121&borderColorActive=aaaaaa&bgImgOpacityActive=65&bgTextureActive=glass&bgColorActive=ffffff&iconColorHover=454545&fcHover=212121&borderColorHover=999999&bgImgOpacityHover=75&bgTextureHover=glass&bgColorHover=dadada&iconColorDefault=888888&fcDefault=555555&borderColorDefault=d3d3d3&bgImgOpacityDefault=75&bgTextureDefault=glass&bgColorDefault=e6e6e6&iconColorContent=222222&fcContent=222222&borderColorContent=aaaaaa&bgImgOpacityContent=75&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=222222&fcHeader=222222&borderColorHeader=aaaaaa&bgImgOpacityHeader=75&bgTextureHeader=highlight_soft&bgColorHeader=cccccc&cornerRadius=4px&fsDefault=1.1em&fwDefault=normal&ffDefault=Verdana%2CArial%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); /* support: IE8 */ +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; + pointer-events: none; +} + + +/* Icons +----------------------------------*/ +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; +} + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-menu { + list-style: none; + padding: 0; + margin: 0; + display: block; + outline: 0; +} +.ui-menu .ui-menu { + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + cursor: pointer; + /* support: IE10, see #8844 */ + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} +.ui-menu .ui-menu-item-wrapper { + font-size: 0.9em; + position: relative; + padding: 3px 1em 3px .4em; +} +.ui-menu .ui-menu-divider { + margin: 5px 0; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-state-focus, +.ui-menu .ui-state-active { + margin: -1px; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item-wrapper { + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: 0; + bottom: 0; + left: .2em; + margin: auto 0; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + left: auto; + right: 0; +} +.ui-datepicker { + width: 17em; + padding: .2em .2em 0; + display: none; +} +.ui-datepicker .ui-datepicker-header { + position: relative; + padding: .2em 0; +} +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: absolute; + top: 2px; + width: 1.8em; + height: 1.8em; +} +.ui-datepicker .ui-datepicker-prev-hover, +.ui-datepicker .ui-datepicker-next-hover { + top: 1px; +} +.ui-datepicker .ui-datepicker-prev { + left: 2px; +} +.ui-datepicker .ui-datepicker-next { + right: 2px; +} +.ui-datepicker .ui-datepicker-prev-hover { + left: 1px; +} +.ui-datepicker .ui-datepicker-next-hover { + right: 1px; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + display: block; + position: absolute; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.ui-datepicker .ui-datepicker-title { + margin: 0 2.3em; + line-height: 1.8em; + text-align: center; +} +.ui-datepicker .ui-datepicker-title select { + font-size: 1em; + margin: 1px 0; +} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 45%; +} +.ui-datepicker table { + width: 100%; + font-size: .9em; + border-collapse: collapse; + margin: 0 0 .4em; +} +.ui-datepicker th { + padding: .7em .3em; + text-align: center; + font-weight: bold; + border: 0; +} +.ui-datepicker td { + border: 0; + padding: 1px; +} +.ui-datepicker td span, +.ui-datepicker td a { + display: block; + padding: .2em; + text-align: right; + text-decoration: none; +} +.ui-datepicker .ui-datepicker-buttonpane { + background-image: none; + margin: .7em 0 0 0; + padding: 0 .2em; + border-left: 0; + border-right: 0; + border-bottom: 0; +} +.ui-datepicker .ui-datepicker-buttonpane button { + float: right; + margin: .5em .2em .4em; + cursor: pointer; + padding: .2em .6em .3em .6em; + width: auto; + overflow: visible; +} +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { + float: left; +} + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { + width: auto; +} +.ui-datepicker-multi .ui-datepicker-group { + float: left; +} +.ui-datepicker-multi .ui-datepicker-group table { + width: 95%; + margin: 0 auto .4em; +} +.ui-datepicker-multi-2 .ui-datepicker-group { + width: 50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { + width: 33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { + width: 25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { + border-left-width: 0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { + clear: left; +} +.ui-datepicker-row-break { + clear: both; + width: 100%; + font-size: 0; +} + +/* RTL support */ +.ui-datepicker-rtl { + direction: rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { + right: 2px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next { + left: 2px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { + right: 1px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { + left: 1px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { + clear: right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { + float: left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, +.ui-datepicker-rtl .ui-datepicker-group { + float: right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { + border-right-width: 0; + border-left-width: 1px; +} + +/* Icons */ +.ui-datepicker .ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; + left: .5em; + top: .3em; +} + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Verdana,Arial,sans-serif; + font-size: 1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Verdana,Arial,sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #d3d3d3; +} +.ui-widget-content { + border: 1px solid #aaaaaa; + background: #ffffff; + color: #222222; +} +.ui-widget-content a { + color: #222222; +} +.ui-widget-header { + border: 1px solid #aaaaaa; + background: #cccccc url("../img/jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; + color: #222222; + font-weight: bold; +} +.ui-widget-header a { + color: #222222; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + + /* We use html here because we need a greater specificity to make sure disabled + works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #d3d3d3; + background: #e6e6e6 url("../img/jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #555555; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #555555; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #999999; + background: #dadada url("../img/jquery-ui/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #212121; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #212121; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #aaaaaa; + background: #ffffff url("../img/jquery-ui/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #212121; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #aaaaaa; + background-color: #212121; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #212121; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #fcefa1; + background: #fbf9ee url("../img/jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; + color: #363636; +} +.ui-state-checked { + border: 1px solid #fcefa1; + background: #fbf9ee; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #363636; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #cd0a0a; + background: #fef1ec url("../img/jquery-ui/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; + color: #cd0a0a; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #cd0a0a; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #cd0a0a; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); /* support: IE8 */ + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); /* support: IE8 */ + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("../img/jquery-ui/ui-icons_222222_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("../img/jquery-ui/ui-icons_222222_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url("../img/jquery-ui/ui-icons_454545_256x240.png"); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url("../img/jquery-ui/ui-icons_454545_256x240.png"); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url("../img/jquery-ui/ui-icons_2e83ff_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("../img/jquery-ui/ui-icons_cd0a0a_256x240.png"); +} +.ui-button .ui-icon { + background-image: url("../img/jquery-ui/ui-icons_888888_256x240.png"); +} + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-caret-1-n { background-position: 0 0; } +.ui-icon-caret-1-ne { background-position: -16px 0; } +.ui-icon-caret-1-e { background-position: -32px 0; } +.ui-icon-caret-1-se { background-position: -48px 0; } +.ui-icon-caret-1-s { background-position: -65px 0; } +.ui-icon-caret-1-sw { background-position: -80px 0; } +.ui-icon-caret-1-w { background-position: -96px 0; } +.ui-icon-caret-1-nw { background-position: -112px 0; } +.ui-icon-caret-2-n-s { background-position: -128px 0; } +.ui-icon-caret-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -65px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -65px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 1px -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 4px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: .3; + filter: Alpha(Opacity=30); /* support: IE8 */ +} +.ui-widget-shadow { + -webkit-box-shadow: -8px -8px 8px #aaaaaa; + box-shadow: -8px -8px 8px #aaaaaa; +} \ No newline at end of file diff --git a/src/main/resources/static/css/_main.scss b/src/main/resources/static/css/_main.scss new file mode 100644 index 0000000..82bb3d3 --- /dev/null +++ b/src/main/resources/static/css/_main.scss @@ -0,0 +1,1687 @@ +// variables +$color-visitor-screen-theme: #966432; +$color-visitor-screen-text: #c00000; +$color-btn-border-dotted: #aaa; + +// inherited colors +$color-dark: $gray-800; +$color-border: $gray-300; +$color-blue-light: lighten($primary, 25%); + +// font sizes +$body-main-font-size: 0.9rem; + +// page styles +body { + padding-bottom: 100px; + + &.loading { + @extend .overflow-hidden; + position: relative; + + &:after { + content: url('/uind/img/loader.svg'); + display: flex; + justify-content: center; + align-items: center; + width: 100vw; + height: 100vh; + position: sticky; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 9999; + background: rgba(255, 255, 255, 0.7); + } + } +} + +.page-main { + font-size: $body-main-font-size; + flex-wrap: nowrap; +} + +// fixed width column +.col { + + &.fw-50 { + flex: 0 0 50px; + } + + &.fw-75 { + flex: 0 0 75px; + } + + &.fw-100 { + flex: 0 0 100px; + } +} + +// sidebar +.page-filters-sidebar { + padding: 20px; + background: $gray-100; + margin-bottom: 20px; + + &:last-child { + margin-bottom: 0; + } +} + +.page-filter-sidebar-toggle { + @extend .btn; + @extend .btn-dark; + @extend .btn-sm; + position: absolute; + left: 1px; + top: 170px; +} + +// no bullets in list +.list-no-bullets { + list-style-type: none; +} + +// select toggle +[data-hidden] { + display: none; +} + +.form-row[style="display: block;"] { + display: flex !important; +} + +// submenu +.dropdown-submenu-container { + position: relative; + + & > a:after { + content: ''; + display: inline-block; + position: absolute; + top: 12px; + right: 8px; + @include caret-right(); + } + + .dropdown-menu { + top: 0; + left: 100%; + margin-top: -1px; + } + + &:hover > .dropdown-menu { + display: block; + } +} + +// backgrounds +.bg-gray-100 { + background: $gray-100; +} + +.z-index-99 { + z-index: 99 !important; +} + +// multi step form navigation and toggle +.multistep-form-nav { + display: flex; + justify-content: space-between; + width: 75%; + margin: 0 auto; + position: relative; + border-bottom: 0; + + &:before, + &:after { + content: ''; + display: block; + height: 1px; + position: absolute; + left: 0; + right: 0; + top: 45px; + } + + &:before { + width: 100%; + background: $color-border; + } + + &:after { + width: 0; + background: $primary; + transition: width 0.2s ease-in-out; + } +} + +.multistep-form-nav__item { + color: inherit; + font-size: 0.75em; + text-transform: uppercase; + display: flex; + width: 90px; + height: 90px; + border-radius: 50%; + border: 2px solid $color-border; + justify-content: center; + align-items: center; + background: #fff; + position: relative; + cursor: pointer; + z-index: 9; + transition: border-color 0.1s ease-in-out; + + &.active { + border-color: $primary; + } + + &.prev { + border-color: $primary; + } + + &.error { + border-color: $danger; + } + + &:hover { + text-decoration: none; + } + + &:not(.active):hover, + &:not(.prev):hover { + border-color: $color-blue-light; + } +} + +.multistep-form-footer-nav { + display: flex; + justify-content: flex-end; + + a { + margin-right: 5px; + + &:last-child { + margin-right: 0; + } + } +} + +// tabs +[data-tab] { + display: none; + + &.active { + display: block; + } +} + +.toggle-closed, +.toggle-opened { + position: relative; + + &:before { + display: inline-block; + margin-right: 5px; + } +} + +.toggle-closed { + &:before { + content: '+'; + } +} + +.toggle-opened { + &:before { + content: '-'; + } +} + +.action-btn { + margin-right: 5px; + + &:last-child { + margin-right: 0; + } +} + +.table--white-space-no-wrap { + + th, td { + white-space: nowrap; + } +} + +.page-header { + margin-bottom: 30px; +} + +.page-header__logo { + display: inline-block; + width: auto; + height: 30px; +} + +.page-header__user-menu { + font-size: 0.85em; + margin-left: auto; + + .dropdown-menu { + left: auto; + right: 0; + } +} + +.page-header__logout { + padding: 0; + margin: 0; + + [type="submit"] { + @extend .dropdown-item; + } +} + +#welcome-msg { + display: block; + width: 75vw; + margin: 10vh auto 0; +} + +.visitor-visit-table { + text-transform: uppercase; + font-size: 0.9em; +} + +.wms-table { + font-size: 0.9em; +} + +.item-config-table { + font-size: 0.9em; +} + +/* visitor screen */ +.visitor-screen { + border: 2px solid $color-dark; + + .form-control { + text-transform: uppercase; + border-color: $color-dark; + border-radius: 0; + } + + label { + font-size: 0.9em; + } +} + +.visitor-screen_top { + font-size: 0.8em; + text-transform: uppercase; + font-style: italic; + color: #fff; + display: flex; + justify-content: space-between; + padding: 0 20px; + background: $color-visitor-screen-theme; + + p { + line-height: 2em; + margin-bottom: 0; + } +} + +.visitor-screen__header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 2px 20px; + border-bottom: 2px solid $color-dark; + margin-bottom: 20px; +} + +.visitor-screen__header-logo { + display: block; + width: 150px; + height: auto; +} + +.visitor-screen__header-txt { + text-align: right; + text-transform: uppercase; +} + +.visitor-screen__header-txt-head { + font-size: 1.75em; + font-weight: bold; + margin-bottom: 0; +} + +.visitor-screen__header-txt-subhead { + color: $color-visitor-screen-text; + font-size: 1.25em; + font-weight: bold; + font-style: italic; + margin-bottom: 0; +} + +.visitor-screen__middle { + display: flex; + justify-content: center; + padding: 0 10px; +} + +.visitor-screen__middle-fields { + width: calc(100% - 200px - 20px); + padding-right: 20px; +} + +.visitor-screen__middle-right { + width: 200px; +} + +.visitor-screen__middle-photo { + font-size: 0.75em; + text-align: center; + text-transform: uppercase; + display: flex; + justify-content: center; + align-items: center; + width: 200px; + height: 210px; + max-width: 100%; + padding: 5px; + border: 1px dashed $gray-500; + margin-bottom: 25px; +} + +.visitor-screen__photo { + display: block; + width: 190px; + max-width: 90%; + height: auto; + position: absolute; + + &[src=""] { + display: none; + } +} + +.visitor-screen__action { + width: 200px; + border-radius: 0; + + i { + font-size: 2em; + display: block; + } + + span { + display: block; + } +} + +.visitor-screen__footer { + font-size: 0.8em; + text-transform: uppercase; + font-style: italic; + color: #fff; + padding: 0 20px; + background: $color-visitor-screen-theme; + + p { + text-align: center; + line-height: 2em; + margin-bottom: 0; + } +} + +// photo modal +.visitor-photo__video { + display: block; + width: 300px; + height: 225px; + margin: 0 auto; + border: 1px dashed $gray-500; + margin-bottom: 30px; +} + +.visitor-photo__temp-photo { + display: block; + width: 300px; + height: 225px; + margin: 0 auto; + border: 1px dashed $gray-500; +} + +.visitor-photo__canvas { + display: none; + width: 300px; + height: 225px; +} + +// single visitor screen +.visitor-single__info { + margin-bottom: 50px; +} + +// notice bar +.notice-bar { + display: none; + width: 100vw; + height: 80px; + position: absolute; + left: 0; + bottom: 0; + + &.active { + display: block; + } + + p { + font-size: 1.25em; + font-weight: bold; + text-align: center; + line-height: 80px; + margin-bottom: 0; + } +} + +// employee grade +.employee-grade-form { + +} + + +.form-item-remove { + font-size: 0.6em; + text-decoration: none; + position: absolute; + top: 5px; + right: 0; + + &:hover { + text-decoration: none; + } +} + +// data tables +.dataTable { + font-size: $body-main-font-size; + + &.fixedHeader-floating { + font-size: 0.8em; + } + + // fixed column + .dtfc-fixed-left { + background: inherit; + z-index: 99; + } +} + +div.dataTables_wrapper { + + div.dataTables_filter input, + div.dataTables_filter select { + margin-left: 0.5em; + display: inline-block; + width: 170px; + } + +} + +// company form +.hrms-company-form { + + li { + padding-top: 15px; + position: relative; + } + + .form-item-remove { + top: -5px; + } +} + +// hierarchy list +.hierarchy-list { + + & ul li { + position: relative; + + &:before { + content: ''; + display: block; + width: 10px; + height: 10px; + border-radius: 50%; + background: #fff; + border: 2px solid $color-border; + position: absolute; + top: 8px; + left: -45px; + + } + + &:after { + content: ''; + display: block; + width: 25px; + height: 1px; + background: $color-border; + position: absolute; + top: 12px; + left: -36px; + } + } +} + +[data-form-item-container], +[data-educational-credential], +[data-past-employer], +[data-government-reference], +[data-professional-reference], +[data-next-of-kin], +[data-wrapper-item], +[data-sir-item], +[data-bill-item], +[data-po-item], +[data-pr-item], +[data-indent-item], +[data-entity-item], +[data-sc-item] { + padding-bottom: 20px; + margin-bottom: 20px; + border-bottom: 1px solid $color-border; + + &:last-of-type:not([data-sc-item]) { + padding-bottom: 0; + margin-bottom: 0; + border-bottom: 0; + } +} + +// employee photo +.employee__photo { + display: flex; + justify-content: center; + align-items: center; + width: 230px; + height: 230px; + max-width: 100%; + border: 2px dashed $color-border; + cursor: pointer; + position: relative; + margin-bottom: 0; + + &:before { + content: 'Change Photo'; + display: block; + width: 230px; + height: 230px; + max-width: 100%; + line-height: 230px; + text-align: center; + position: absolute; + top: 0; + left: 0; + font-size: 1.2em; + font-weight: bold; + opacity: 0.3; + z-index: 9; + transition: opacity 0.1s ease-in-out; + } + + &:hover { + &:before { + opacity: 0.8; + z-index: 10; + } + + img { + opacity: 0.3; + z-index: 9; + } + } + + img { + display: block; + width: auto; + height: auto; + max-height: 100%; + max-width: 100%; + position: relative; + z-index: 10; + opacity: 1; + transition: opacity 0.1s ease-in-out; + + &[src=""] { + display: none; + } + } +} + +// inventory location +.uic-inventory-locations { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.uic-inventory-location__unit { + flex-basis: 19%; + flex-grow: 0; + flex-shrink: 0; + margin-bottom: 50px; +} + +// login page +.page-login { + min-width: 100vw; + min-height: 100vh; + background: url('../img/login-bg.jpg') center center no-repeat; + background-size: cover; + position: relative; + + &:before { + content: ''; + display: block; + width: 100vw; + height: 100vh; + position: absolute; + top: 0; + left: 0; + background: rgba(0, 0, 0, 0.65); + } +} + +.login__form-container { + margin-top: 100px; +} + +.login__logo { + + img { + display: block; + width: 200px; + height: auto; + margin: 0 auto 30px; + } +} + +.login__form { + padding: 20px; + background: rgba(255, 255, 255, 0.9); +} + +// status badges +.badge-FORWARDED, +.badge-WAIVED, +.badge-FORWARDEDTOMANAGEMENT, +.badge-FORWARDED_TO_MANAGEMENT, +.badge-FORWARDEDTOSUPPLIER, +.badge-FORWARDED_TO_SUPPLIER, +.badge-APPROVED, +.badge-BYPASSED_APPROVAL, +.badge-SIR_CREATED, +.badge-DELIVERED, +.badge-CONFIRMED, +.badge-AUTHORIZED, +.badge-FORWARDED_TO_GATE_KEEPER, +.badge-FORWARDED_TO_STORE_KEEPER, +.badge-FORWARDED_FOR_PR, +.badge-FORWARDED_TO_AUDIT, +.badge-PAYMENT_CREATED, +.badge-BYPASSED_AUDIT, +.badge-BY_PASSED_FOR_WO, +.badge-PAID, +.badge-WORKING, +.badge-COMPLETED, +.badge-READY, +.badge-READY_FOR_UPLOAD, +.badge-UPLOADED, +.badge-PUBLISHED, +.badge-LOW, +.badge-BILLED, +.badge-PAYMENT_READY, +.badge-active, +.badge-LEASED, +.badge-PICKED, +.badge-true, +.badge-ACCOUNTS_APPROVED, +.badge-VACANT, +.badge-PASSED, +.badge-POSTED, +.badge-RUNNING, +.badge-AVAILABLE, +.badge-RECEIVED, +.badge-ACTIVE, +.badge-TAGGED { + @extend .badge-success; +} + +.badge-DRAFT, +.badge-UNPAID, +.badge-REVIEWING, +.badge-REQUESTED, +.badge-FORWARDED_FOR_APPROVAL, +.badge-FORWARDED_TO_ACCOUNTS, +.badge-FORWARDED_FOR_HR_APPROVAL, +.badge-TO_DO, +.badge-ARRANGING, +.badge-IN_ACTIVE { + @extend .badge-secondary; +} + +.badge-NEED_ACTION, +.badge-PARTIALLY_DELIVERED, +.badge-PENDING_HR_HOD, +.badge-ONHOLD, +.badge-PROCURED, +.badge-SPLIT, +.badge-MERGED, +.badge-AWAITING_INSPECTION, +.badge-IN_PROGRESS, +.badge-ON_HOLD, +.badge-MEDIUM, +.badge-PENDING, +.badge-PENDING_MANAGER, +.badge-PENDING_COMMERCIAL, +.badge-PENDING_DEPARTMENT_HEAD, +.badge-PENDING_DIVISION_HEAD, +.badge-PENDING_AUTHORITY, +.badge-PENDING_AUDIT, +.badge-AWAITING_CONFIRMATION, +.badge-PENDING_MANAGEMENT, +.badge-PARTIALLY_COMPLETED, +.badge-PENDING_TREASURY, +.badge-UNBILLED, +.badge-PARTIALLY_PAID, +.badge-EMPTY, +.badge-PENDING_HOD, +.badge-PENDING_HR, +.badge-PENDING_IE, +.badge-inactive, +.badge-UN_LEASED, +.badge-OCCUPIED, +.badge-FORWARDED_TO_DIVISION, +.badge-FORWARDEDTOINDENTDIVAPPROVAL, +.badge-ASSIGNED, +.badge-USER_APPROVED, +.badge-HOD_APPROVED, +.badge-DEPARTMENT_APPROVED, +.badge-AUDIT_APPROVED, +.badge-ASSIGNED, +.badge-QUEUED, +.badge-NOT_ASSIGNED, +.badge-NOT_RECEIVED_YET{ + @extend .badge-warning; +} + +.badge-NOTAPPROVED, +.badge-NOT_APPROVED, +.badge-OVERDUE, +.badge-UN_TAGGED, +.badge-TERMINATED, +.badge-DECLINED, +.badge-Cancelled, +.badge-URGENT, +.badge-HIGH, +.badge-CANCELLED, +.badge-REJECTED, +.badge-OVER_OCCUPIED, +.badge-NO_VEHICLE_ASSIGNED, +.badge-FAILED { + @extend .badge-danger; +} + +.badge-FORWARDED_FOR_DEPARTMENT_APPROVAL, +.badge-FORWARDED_FOR_QA_APPROVAL, +.badge-FORWARDED_FOR_AUDIT_APPROVAL, +.badge-FORWARDED_FOR_MANAGEMENT_APPROVAL, +.badge-FORWARDED_FOR_ACCOUNTS_APPROVAL, +.badge-FORWARDED_FOR_ADMIN_APPROVAL, +.badge-VEHICLE_ASSIGNED, +.badge-FORWARDED_TO_DYEING, +.badge-FORWARDED_TO_STORE { + @extend .badge-info; +} + +.travel-route { + display: flex; + align-items: center; + justify-content: space-between; + background-color: #f1f1f1; + padding: 10px; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); +} + +.route-line { + flex: 1; + border-top: 2px dashed #aaa; + margin: 0 10px; +} + +.plane-icon { + font-size: 2em; + color: #007bff; + margin: 0 10px; +} + +.location { + text-align: center; +} + +.date { + font-size: 1.2em; + font-weight: bold; +} + +.place { + color: #555; +} + + +// item photo +.item__image { + display: inline-block; + position: relative; + margin-right: 10px; + + &:last-child { + margin-right: 0; + } + + img { + display: block; + max-width: 200px; + max-height: 200px; + width: auto; + height: auto; + } + + .item__image-remove { + font-size: 0.8em; + position: absolute; + top: 5px; + right: 5px; + } +} + +// password strength meter +[data-password-strength-meter] { + display: block; + width: 100%; + height: 5px; + margin-bottom: 10px; + background: #ccc; + position: relative; + + &:after { + content: ""; + display: block; + width: 0; + height: 5px; + position: absolute; + top: 0; + left: 0; + background: transparent; + transition: background-color 0.1s ease-in-out, + width 0.2s ease-in-out; + } + + &[data-password-strength-meter="0"] { + &:after { + width: 20%; + background-color: #d80000; + } + } + + &[data-password-strength-meter="1"] { + &:after { + width: 40%; + background-color: #d88400; + } + } + + &[data-password-strength-meter="2"] { + &:after { + width: 60%; + background-color: #c1d800; + } + } + + &[data-password-strength-meter="3"] { + &:after { + width: 80%; + background-color: #7ad800; + } + } + + &[data-password-strength-meter="4"] { + &:after { + width: 100%; + background-color: #23b531; + } + } +} + +[data-password-strength-message] { + font-size: 0.85em; + font-weight: bold; +} + +.td--align-number { + padding-right: 7em !important; + text-align: right !important; +} + +.item-checkbox-container { + position: absolute; + left: 0; + top: 35px; +} + +.fc-license-message { + display: none !important; +} + +.loading-container { + padding: 20px 0; + text-align: center; +} + +.font-sm { + font-size: 0.9em; +} + +.font-x-sm { + font-size: 0.75em; +} + +.font-lg { + font-size: 1.1em; +} + +.notification-new { + position: relative; + + &:after { + content: ''; + display: block; + width: 5px; + height: 5px; + border-radius: 50%; + background: $red; + position: absolute; + top: 8px; + right: 0; + animation: anim-glow 2s ease infinite; + } + + @keyframes anim-glow { + 0% { + box-shadow: 0 0 rgba($red, 1); + } + 100% { + box-shadow: 0 0 10px 8px transparent; + border-width: 2px; + } + } +} + +.uind-autocomplete-container { + position: relative; + + .uind-autocomplete-list { + @extend .list-group; + @extend .shadow; + background: #fff; + width: 100%; + position: absolute; + top: 0; + left: 0; + z-index: 99; + overflow-y: auto; + max-height: 500px; + } + + a, li { + @extend .list-group-item; + @extend .list-group-item-action; + @extend .font-sm; + padding: 0.65rem 0.75rem; + } + + a { + @extend .list-group-item-action; + } +} + +.modal-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + z-index: 99; + background: rgba(0, 0, 0, 0.7); +} + +.bill-total-container { + @extend .shadow; + position: fixed; + top: 100px; + right: -300px; + width: 350px; + padding: 25px; + background: #fff; + cursor: pointer; + opacity: 0.5; + z-index: 99; + transition: right 0.25s ease-in-out, + opacity 0.25s ease-in-out; + + &:hover { + right: 0; + opacity: 1; + } +} + +.slash-separator { + position: relative; + + &:after { + content: " /"; + } + + &:last-child { + &:after { + content: none; + } + } +} + +.google-map-label { + width: 30px; + height: 30px; + border-radius: 50%; + line-height: 30px; + text-align: center; + background: #9d0208; + position: relative; + + &:after { + content: ''; + display: block; + width: 0; + height: 0; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-top: 10px solid #9d0208; + position: absolute; + bottom: -6px; + left: 5px; + } + + &.google-map-label--370617 { + background: #370617; + + &:after { + border-top: 10px solid #370617; + } + } + + &.google-map-label--6a040f { + background: #6a040f; + + &:after { + border-top: 10px solid #6a040f; + } + } + + &.google-map-label--9d0208 { + background: #9d0208; + + &:after { + border-top: 10px solid #9d0208; + } + } + + &.google-map-label--d00000 { + background: #d00000; + + &:after { + border-top: 10px solid #d00000; + } + } + + &.google-map-label--dc2f02 { + background: #dc2f02; + + &:after { + border-top: 10px solid #dc2f02; + } + } + + &.google-map-label--e85d04 { + background: #e85d04; + + &:after { + border-top: 10px solid #e85d04; + } + } + + &.google-map-label--f48c06 { + background: #f48c06; + + &:after { + border-top: 10px solid #f48c06; + } + } + + &.google-map-label--faa307 { + background: #faa307; + + &:after { + border-top: 10px solid #faa307; + } + } + + &.google-map-label--ffba08 { + background: #ffba08; + + &:after { + border-top: 10px solid #ffba08; + } + } +} + +.employee-photo-thumb { + display: block; + width: 56px; + height: 56px; + border-radius: 50%; + + &.employee-photo-thumb--sm { + width: 42px; + height: 42px; + } + + &.employee-photo-thumb--xsm { + width: 32px; + height: 32px; + } +} + +.item-image { + display: block; + width: 45px; + height: 45px; + border-radius: 50%; +} + +.function-icon { + display: inline-block; + width: 20px; + height: auto; + margin-right: 10px; + + &.dark, + .active & { + filter: brightness(0); + } +} + +.employee-function-icon, +.employee-grade-icon { + display: block; + width: 25px; + height: 25px; + border-radius: 50%; + background: #fff; + text-align: center; + line-height: 23px; + position: absolute; + bottom: 0; +} + +.employee-function-icon { + right: 0; + + img { + display: inline-block; + width: 15px; + height: auto; + } +} + +.employee-grade-icon { + color: #fff; + left: 0; + + &.M { + background: #10B981; + } + + &.W { + background: #3B82F6; + } + + &.null { + background: #EF4444; + } +} + +.inactive-employee { + @extend .text-muted; + text-decoration: line-through; +} + +[data-table] { + display: none; + + thead th { + position: relative; + } +} + +.multi-select-container { + position: relative; + + &:hover { + .multi-select-options { + display: block; + } + } + + .multi-select-label { + @extend .form-control; + cursor: pointer; + } + + .multi-select-options { + @extend .list-group; + @extend .shadow; + background: #fff; + width: 100%; + position: absolute; + top: 38px; + left: 0; + z-index: 99; + max-height: 400px; + overflow-y: auto; + display: none; + } + + li { + @extend .list-group-item; + @extend .list-group-item-action; + @extend .font-sm; + padding: 0.65rem 0.75rem; + } +} + +.radio-button { + cursor: pointer; + margin-bottom: 0; + + [type="radio"] { + display: none; + + &:checked + span { + color: #fff; + border: 1px solid $primary; + background: $primary; + } + } + + span { + color: inherit; + display: block; + width: 26px; + height: 26px; + line-height: 24px; + text-align: center; + border: 1px solid $color-dark; + background: transparent; + transition: border 0.1s ease-in-out, + background 0.1s ease-in-out, + color 0.1s ease-in-out; + + &:hover { + border: 1px solid $color-blue-light; + } + } +} + +.employee-probation-review-photo { + width: 100%; + min-height: 200px; + background: url('/uind/img/man.png') center center no-repeat; +} + +.trashIcon { + color: white; +} + +.crossicon { + color: white; +} + +.modal-header-hubstaff { + background-color: #26A7DE; + color: white; +} + +.divider { + border-top: 1px solid #D1D5DB; +} + +.hubstaffactivity { + color: #06B6D4; +} + +.hubstafftrack { + color: #1ca44e; +} + +.hubstaff__logo { + display: inline-block; + width: auto; + height: 20px; +} + +.stock-link { + text-decoration: revert; +} + +// loading skeleton +.skeleton-box { + height: 2em; + position: relative; + overflow: hidden; + background-color: #DDDBDD; + border-radius: 0.25em; + margin-bottom: 1.5em; + + &::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + transform: translateX(-100%); + background-image: linear-gradient( + 90deg, + rgba(#fff, 0) 0, + rgba(#fff, 0.2) 20%, + rgba(#fff, 0.5) 60%, + rgba(#fff, 0) + ); + animation: shimmer 2s infinite; + content: ''; + } + + @keyframes shimmer { + 100% { + transform: translateX(100%); + } + } +} + +// custom table (based on div) +.custom-table { + border-top: 1px solid $color-border; +} + +.table-head { + border-bottom: 2px solid $color-border; +} + +.table-body { +} + +.table-rows-wrapper { + + .custom-table-striped &:nth-child( 2n ) { + background-color: rgba(0, 0, 0, .05); + } + + .custom-table-hover &:hover { + background-color: rgba(0, 0, 0, .075); + } +} + +.table-row { + display: flex; + flex-grow: 1; + border-bottom: 1px solid $color-border; + + .table-cell { + padding: 1rem 0.75rem; + } +} + +.payment-progress-tooltip { + .tooltip-inner { + font-size: 0.95em; + max-width: 550px; + text-align: left; + } +} + +.resource-plan-date { + transition: background-color 0.1s ease-in-out; + + &:hover { + background-color: #eff6ff; + } +} + +.resource-plan-task { + display: block; + color: #fff !important; + font-size: 0.9em; + text-align: center; + background-color: #334155; + padding: 3px 5px; + margin-bottom: 5px; + transition: background-color 0.1s ease-in-out; + + &:hover { + text-decoration: none; + background-color: #0369a1; + } + + &.resource-plan-task--TO_DO { + background: #ea580c; + } + + &.resource-plan-task--WORKING { + background: #0284c7; + } + + &.resource-plan-task--ON_HOLD { + background: #475569; + } + + &.resource-plan-task--COMPLETED { + background: #059669; + } + + &.resource-plan-task--OVERDUE { + background: #be123c; + } + + &:last-child { + margin-bottom: 0; + } +} + +.modal-overlay-custom { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: rgba(0, 0, 0, 0.4); + z-index: 90; +} + +.tox-notifications-container { + display: none !important; +} + +.vertical-separator-narrow { + padding-bottom: 3px; + margin-bottom: 3px; + border-bottom: 1px solid $color-border; + + &:last-child { + padding-bottom: 0; + margin-bottom: 0; + border-bottom: 0; + } +} + +.project-card { + height: 230px; + padding: 1em 1.5em; + margin-bottom: 2em; +} + +.photo-capture-container { + display: flex; + align-items: center; + justify-content: center; + width: 200px; + height: 210px; + border: 1px dashed $gray-500; + cursor: pointer; + transition: border-color 0.1s ease-in-out; + + &:hover { + border-color: $gray-800; + } + + .photo-capture-img { + max-width: 100%; + height: auto; + } +} + +.photo-capture-video { + width: 100%; + height: auto; +} + +.photo-capture-temp-photo { + display: block; + margin: 0 auto; + width: 100%; + height: auto; +} + +.progress-container { + width: 0; + height: 35px; + border-radius: 0.4rem; + background-color: dodgerblue; +} + +.w-90 { + width: 90%; +} + + +.ticker-container { + overflow: hidden; + white-space: nowrap; + background: #FFFFFF !important; +} + +.ticker-text { + display: inline-block; + animation: tickerAnimation 25s linear infinite; +} + +@keyframes tickerAnimation { + from { + transform: translateX(100%); + } + + to { + transform: translateX(-100%); + } +} + +.has-details { + position: relative; +} + +.details { + position: absolute; + top: 0; + transform: translateY(0%) scale(0); + transition: transform 0.1s ease-in-out; + transform-origin: left; + display: inline; + background: white; + z-index: 20; + min-width: 50%; + padding: 1rem; + box-shadow: 4px 4px 8px 8px rgba(0, 0, 0, 0.2); + border-radius: 10px; +} + +.has-details:hover .divider-container { + transform: translateX(-100%) scale(1.05); + background: rgba(255, 255, 255, 0.99); +} + +.badge-pending { + color: #fff; + background-color: blueviolet +} + +.badge-hod-pending { + color: #fff; + background-color: orange +} + +.badge-hr-pending { + color: #fff; + background-color: gold +} + +.badge-management-pending { + color: #fff; + background-color: yellowgreen +} + +.badge-approved { + color: #fff; + background-color: green +} + +.badge-decline { + color: #fff; + background-color: red +} + +.badge-declined { + color: #fff; + background-color: red +} + +.ms-graph-group-employee-tooltip { + width: 450px; + text-align: left; +} diff --git a/src/main/resources/static/css/_multiselect.scss b/src/main/resources/static/css/_multiselect.scss new file mode 100644 index 0000000..89a9599 --- /dev/null +++ b/src/main/resources/static/css/_multiselect.scss @@ -0,0 +1,116 @@ +span.multiselect-native-select { + position: relative; +} +span.multiselect-native-select select { + border: 0 !important; + clip: rect(0 0 0 0) !important; + height: 1px !important; + margin: -1px -1px -1px -3px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + left: 50%; + top: 30px; +} +.multiselect.dropdown-toggle:after { + display: none; +} +.multiselect { + overflow: hidden; + text-overflow: ellipsis; +} +.multiselect-container { + position: absolute; + list-style-type: none; + margin: 0; + padding: 0; +} +.multiselect-container .multiselect-reset .input-group { + width: 93%; +} +.multiselect-container .multiselect-filter > .fa-search { + z-index: 1; + padding-left: 0.75rem; +} +.multiselect-container .multiselect-filter > input.multiselect-search { + border: none; + border-bottom: 1px solid lightgrey; + padding-left: 2rem; + margin-left: -1.625rem; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.multiselect-container .multiselect-filter > input.multiselect-search:focus { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.multiselect-container .multiselect-filter > .multiselect-moz-clear-filter { + margin-left: -1.5rem; + display: none; +} +.multiselect-container .multiselect-option.multiselect-group-option-indented { + padding-left: 1.75rem; +} +.multiselect-container .multiselect-option, +.multiselect-container .multiselect-group, +.multiselect-container .multiselect-all { + padding: 0.25rem 0.25rem 0.25rem 0.75rem; +} +.multiselect-container .multiselect-option.dropdown-item, +.multiselect-container .multiselect-group.dropdown-item, +.multiselect-container .multiselect-all.dropdown-item, +.multiselect-container .multiselect-option.dropdown-toggle, +.multiselect-container .multiselect-group.dropdown-toggle, +.multiselect-container .multiselect-all.dropdown-toggle { + cursor: pointer; +} +.multiselect-container .multiselect-option .form-check-label, +.multiselect-container .multiselect-group .form-check-label, +.multiselect-container .multiselect-all .form-check-label { + cursor: pointer; +} +.multiselect-container .multiselect-option.active:not(.multiselect-active-item-fallback), +.multiselect-container .multiselect-group.active:not(.multiselect-active-item-fallback), +.multiselect-container .multiselect-all.active:not(.multiselect-active-item-fallback), +.multiselect-container .multiselect-option:not(.multiselect-active-item-fallback):active, +.multiselect-container .multiselect-group:not(.multiselect-active-item-fallback):active, +.multiselect-container .multiselect-all:not(.multiselect-active-item-fallback):active { + background-color: lightgrey; + color: black; +} +.multiselect-container .multiselect-option .form-check, +.multiselect-container .multiselect-group .form-check, +.multiselect-container .multiselect-all .form-check { + padding: 0 5px 0 20px; +} +.multiselect-container .multiselect-option:focus, +.multiselect-container .multiselect-group:focus, +.multiselect-container .multiselect-all:focus { + outline: none; +} +.form-inline .multiselect-container span.form-check { + padding: 3px 20px 3px 40px; +} +.input-group.input-group-sm > .multiselect-native-select .multiselect { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + padding-right: 1.75rem; + height: calc(1.5em + 0.5rem + 2px); +} +.input-group > .multiselect-native-select { + flex: 1 1 auto; + width: 1%; +} +.input-group > .multiselect-native-select > div.btn-group { + width: 100%; +} +.input-group > .multiselect-native-select:not(:first-child) .multiselect { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .multiselect-native-select:not(:last-child) .multiselect { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} \ No newline at end of file diff --git a/src/main/resources/static/css/_select2-bootstrap4.scss b/src/main/resources/static/css/_select2-bootstrap4.scss new file mode 100644 index 0000000..50fb17d --- /dev/null +++ b/src/main/resources/static/css/_select2-bootstrap4.scss @@ -0,0 +1,203 @@ +.select2-container { + display: block; } + .select2-container *:focus { + outline: 0; } + + +.input-group .select2-container--bootstrap4 { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; } + +.input-group-prepend ~ .select2-container--bootstrap4 .select2-selection { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.input-group > .select2-container--bootstrap4:not(:last-child) .select2-selection { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--bootstrap4 .select2-selection { + width: 100%; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .select2-container--bootstrap4 .select2-selection { + -webkit-transition: none; + transition: none; } } + +.select2-container--bootstrap4.select2-container--focus .select2-selection { + border-color: #80bdff; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } + +.select2-container--bootstrap4.select2-container--focus.select2-container--open .select2-selection { + border-bottom: none; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.select2-container--bootstrap4.select2-container--open.select2-container--above .select2-selection { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--bootstrap4.select2-container--open.select2-container--below .select2-selection { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.select2-container--bootstrap4.select2-container--disabled .select2-selection, .select2-container--bootstrap4.select2-container--disabled.select2-container--focus .select2-selection { + cursor: not-allowed; + background-color: #e9ecef; + border-color: #ced4da; + -webkit-box-shadow: none; + box-shadow: none; } + +.select2-container--bootstrap4.select2-container--disabled .select2-search__field, .select2-container--bootstrap4.select2-container--disabled.select2-container--focus .select2-search__field { + background-color: transparent; } + +select.is-invalid ~ .select2-container--bootstrap4 .select2-selection, +form.was-validated select:invalid ~ .select2-container--bootstrap4 .select2-selection { + border-color: #dc3545; } + +select.is-valid ~ .select2-container--bootstrap4 .select2-selection, +form.was-validated select:valid ~ .select2-container--bootstrap4 .select2-selection { + border-color: #28a745; } + +.select2-container--bootstrap4 .select2-search { + width: 100%; } + +.select2-container--bootstrap4 .select2-dropdown { + border-color: #ced4da; + border-radius: 0; } + .select2-container--bootstrap4 .select2-dropdown.select2-dropdown--below { + border-top: none; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } + .select2-container--bootstrap4 .select2-dropdown.select2-dropdown--above { + border-top: 1px solid #ced4da; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + .select2-container--bootstrap4 .select2-dropdown .select2-results__option[aria-selected="true"] { + color: #212529; + background-color: #f2f2f2; } + +.select2-container--bootstrap4 .select2-results__option--highlighted, +.select2-container--bootstrap4 .select2-results__option--highlighted.select2-results__option[aria-selected="true"] { + color: #fff; + background-color: #007bff; } + +.select2-container--bootstrap4 .select2-results__option[role="group"] { + padding: 0; } + .select2-container--bootstrap4 .select2-results__option[role="group"] .select2-results__options--nested .select2-results__option { + padding-left: 1em; } + +.select2-container--bootstrap4 .select2-results__option { + padding: 0.375rem 0.75rem; } + +.select2-container--bootstrap4 .select2-results > .select2-results__options { + max-height: 15em; + overflow-y: auto; } + +.select2-container--bootstrap4 .select2-results__group { + display: list-item; + padding: 6px; + color: #6c757d; } + +.select2-container--bootstrap4 .select2-selection__clear { + float: right; + width: .9em; + height: .9em; + padding-left: .15em; + margin-top: .7em; + margin-right: .3em; + line-height: .75em; + color: #f8f9fa; + background-color: #c8c8c8; + border-radius: 100%; } + .select2-container--bootstrap4 .select2-selection__clear:hover { + background-color: #afafaf; } + +.select2-container--bootstrap4 .select2-selection--single { + height: calc(1.5em + 0.75rem + 2px) !important; } + .select2-container--bootstrap4 .select2-selection--single .select2-selection__placeholder { + line-height: calc(1.5em + 0.75rem); + color: #6c757d; } + .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow { + position: absolute; + top: 50%; + right: 3px; + width: 20px; } + .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b { + position: absolute; + top: 60%; + left: 50%; + width: 0; + height: 0; + margin-top: -2px; + margin-left: -4px; + border-color: #343a40 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0; } + .select2-container--bootstrap4 .select2-selection--single .select2-selection__rendered { + padding-left: 0.75rem; + line-height: calc(1.5em + 0.75rem); + color: #495057; } + +.select2-search--dropdown .select2-search__field { + padding: 0.375rem 0.75rem; + border: 1px solid #ced4da; + border-radius: 0.25rem; } + +.select2-results__message { + color: #6c757d; } + +.select2-container--bootstrap4 .select2-selection--multiple { + min-height: calc(1.5em + 0.75rem + 2px) !important; } + .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered { + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + padding: 0 0.375rem; + margin: 0; + list-style: none; } + .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice { + float: left; + padding: 0; + padding-right: 0.75rem; + margin-top: calc(0.375rem - 2px); + margin-right: 0.375rem; + color: #495057; + cursor: pointer; + border: 1px solid #bdc6d0; + border-radius: 0.2rem; } + .select2-container--bootstrap4 .select2-selection--multiple .select2-search__field { + color: #495057; } + .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice + .select2-search { + width: 0; } + .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove { + float: left; + padding-right: 3px; + padding-left: 3px; + margin-right: 1px; + margin-left: 3px; + font-weight: 700; + color: #bdc6d0; } + .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #343a40; } + .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear { + position: absolute !important; + top: 0; + right: .7em; + float: none; + margin-right: 0; } + +.select2-container--bootstrap4.select2-container--disabled .select2-selection--multiple .select2-selection__choice { + padding: 0 5px; + cursor: not-allowed; } + .select2-container--bootstrap4.select2-container--disabled .select2-selection--multiple .select2-selection__choice .select2-selection__choice__remove { + display: none; } + diff --git a/src/main/resources/static/css/_select2.scss b/src/main/resources/static/css/_select2.scss new file mode 100644 index 0000000..3aba9b7 --- /dev/null +++ b/src/main/resources/static/css/_select2.scss @@ -0,0 +1,537 @@ +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; } + .select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-selection--single .select2-selection__clear { + background-color: transparent; + border: none; + font-size: 1em; } + .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; } + .select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline; + list-style: none; + padding: 0; } + .select2-container .select2-selection--multiple .select2-selection__clear { + background-color: transparent; + border: none; + font-size: 1em; } + .select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + margin-left: 5px; + padding: 0; + max-width: 100%; + resize: none; + height: 18px; + vertical-align: bottom; + font-family: sans-serif; + overflow: hidden; + word-break: keep-all; } + .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; } + +.select2-results { + display: block; } + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; } + +.select2-results__option { + font-size: 0.9em; + padding: 6px; + user-select: none; + -webkit-user-select: none; } + +.select2-results__option--selectable { + cursor: pointer; } + +.select2-container--open .select2-dropdown { + left: 0; } + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-search--dropdown { + display: block; + padding: 4px; } + .select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; } + .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + .select2-search--dropdown.select2-search--hide { + display: none; } + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); } + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(50%) !important; + clip-path: inset(50%) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + white-space: nowrap !important; } + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; } + .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + height: 26px; + margin-right: 20px; + padding-right: 0px; } + .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; } + .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; } + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; } + .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; } + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #ced4da; + border-radius: 4px; + cursor: text; + padding: .375rem .75rem; + position: relative; } + .select2-container--default .select2-selection--multiple.select2-selection--clearable { + padding-right: 25px; } + .select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + font-weight: bold; + height: 20px; + margin-right: 10px; + margin-top: 5px; + position: absolute; + right: 0; + padding: 1px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: inline-block; + margin-left: 5px; + margin-top: 5px; + padding: 0; + padding-left: 20px; + position: relative; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: bottom; + white-space: nowrap; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__display { + cursor: default; + padding-left: 2px; + padding-right: 5px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + background-color: transparent; + border: none; + border-right: 1px solid #aaa; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + color: #999; + cursor: pointer; + font-size: 1em; + font-weight: bold; + padding: 0 4px; + position: absolute; + left: 0; + top: 0; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover, .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:focus { + background-color: #f1f1f1; + color: #333; + outline: none; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display { + padding-left: 5px; + padding-right: 2px; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + border-left: 1px solid #aaa; + border-right: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__clear { + float: left; + margin-left: 10px; + margin-right: auto; } + +.select2-container--default.select2-container--focus .select2-selection--multiple { + //border: solid black 1px; + outline: 0; } + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; } + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; } + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; } + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; } + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; } + +.select2-container--default .select2-results__option--group { + padding: 0; } + +.select2-container--default .select2-results__option--disabled { + color: #999; } + +.select2-container--default .select2-results__option--selected { + background-color: #ddd; } + +.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable { + background-color: #5897fb; + color: white; } + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + .select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + height: 26px; + margin-right: 20px; } + .select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } + .select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; + padding-bottom: 5px; + padding-right: 5px; } + .select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + display: inline-block; + margin-left: 5px; + margin-top: 5px; + padding: 0; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__display { + cursor: default; + padding-left: 2px; + padding-right: 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + background-color: transparent; + border: none; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + color: #888; + cursor: pointer; + font-size: 1em; + font-weight: bold; + padding: 0 4px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; + outline: none; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display { + padding-left: 5px; + padding-right: 2px; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; } + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; } + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; } + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; } + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; } + +.select2-container--classic .select2-dropdown--below { + border-top: none; } + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--classic .select2-results__option--group { + padding: 0; } + +.select2-container--classic .select2-results__option--disabled { + color: grey; } + +.select2-container--classic .select2-results__option--highlighted.select2-results__option--selectable { + background-color: #3875d7; + color: white; } + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; } diff --git a/src/main/resources/static/css/_trumbowyg.scss b/src/main/resources/static/css/_trumbowyg.scss new file mode 100644 index 0000000..1db5d33 --- /dev/null +++ b/src/main/resources/static/css/_trumbowyg.scss @@ -0,0 +1,834 @@ +/** + * Trumbowyg v2.27.3 - A lightweight WYSIWYG editor + * Default stylesheet for Trumbowyg editor + * ------------------------ + * @link https://alex-d.github.io/Trumbowyg/ + * @license MIT + * @author Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr + */ + +#trumbowyg-icons, +.trumbowyg-icons { + overflow: hidden; + visibility: hidden; + height: 0; + width: 0; +} +#trumbowyg-icons svg, +.trumbowyg-icons svg { + height: 0; + width: 0; +} + +.trumbowyg-box *, +.trumbowyg-box *::before, +.trumbowyg-box *::after, +.trumbowyg-modal *, +.trumbowyg-modal *::before, +.trumbowyg-modal *::after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.trumbowyg-box svg, +.trumbowyg-modal svg { + width: 17px; + height: 100%; + color: #222; + fill: #222; +} + +.trumbowyg-box { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -moz-box-orient: vertical; + -moz-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + min-height: 300px; +} + +.trumbowyg-editor-box { + display: block; + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -ms-flex: 1; + flex: 1; +} + +.trumbowyg-box, +.trumbowyg-editor-box { + position: relative; + width: 100%; + border: 1px solid #d7e0e2; +} + +.trumbowyg-box .trumbowyg-editor { + min-height: 100%; + margin: 0 auto; +} + +.trumbowyg-box.trumbowyg-fullscreen { + background: #fefefe; + border: none !important; +} + +.trumbowyg-editor-box, +.trumbowyg-textarea { + position: relative; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 20px; + width: 100%; + border-style: none; + resize: none; + outline: none; + overflow: auto; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} +.trumbowyg-editor-box.trumbowyg-autogrow-on-enter, +.trumbowyg-textarea.trumbowyg-autogrow-on-enter { + -webkit-transition: height 300ms ease-out; + -o-transition: height 300ms ease-out; + transition: height 300ms ease-out; +} + +.trumbowyg-editor-box { + padding: 0; +} + +.trumbowyg-editor { + outline: none; + padding: 20px; +} + +.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-box-blur .trumbowyg-editor::before { + color: transparent !important; + text-shadow: 0 0 7px #333; +} +@media screen and (min-width: 0 \0 ) { + .trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-box-blur .trumbowyg-editor::before { + color: rgba(200, 200, 200, 0.6) !important; + } +} +@supports (-ms-accelerator: true) { + .trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-box-blur .trumbowyg-editor::before { + color: rgba(200, 200, 200, 0.6) !important; + } +} +.trumbowyg-box-blur .trumbowyg-editor img, +.trumbowyg-box-blur .trumbowyg-editor hr { + opacity: 0.2; +} + +.trumbowyg-textarea { + position: relative; + display: block; + overflow: auto; + border: none; + font-size: 14px; + font-family: "Consolas", "Courier", "Courier New", monospace; + line-height: 18px; +} + +.trumbowyg-box.trumbowyg-editor-visible .trumbowyg-textarea { + height: 1px !important; + width: 25%; + min-height: 0 !important; + padding: 0 !important; + background: none; + opacity: 0 !important; +} + +.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-textarea { + display: block; + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -ms-flex: 1; + flex: 1; + margin-bottom: 1px; +} +.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor-box { + display: none; +} + +.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea { + opacity: 0.8; + background: none; +} + +.trumbowyg-editor-box[contenteditable=true]:empty:not(:focus)::before { + content: attr(placeholder); + color: #999; + pointer-events: none; + white-space: break-spaces; +} + +.trumbowyg-button-pane { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + width: 100%; + min-height: 36px; + background: #ecf0f1; + border-bottom: 1px solid #d7e0e2; + margin: 0; + padding: 0 5px; + position: relative; + list-style-type: none; + line-height: 10px; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + overflow: hidden; + z-index: 11; +} +.trumbowyg-button-pane::before, .trumbowyg-button-pane::after { + content: " "; + display: block; + position: absolute; + top: 35px; + left: 0; + right: 0; + width: 100%; + height: 1px; + background: #d7e0e2; +} +.trumbowyg-button-pane::after { + top: 71px; +} +.trumbowyg-button-pane .trumbowyg-button-group { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} +.trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg { + color: transparent; +} +.trumbowyg-button-pane .trumbowyg-button-group::after { + content: " "; + display: block; + width: 1px; + background: #d7e0e2; + margin: 0 5px; + height: 35px; + vertical-align: top; +} +.trumbowyg-button-pane .trumbowyg-button-group:last-child::after { + content: none; +} +.trumbowyg-button-pane button { + display: block; + position: relative; + width: 35px; + height: 35px; + padding: 1px 6px !important; + margin-bottom: 1px; + overflow: hidden; + border: none; + cursor: pointer; + background: none; + vertical-align: middle; + -webkit-transition: background-color 150ms, opacity 150ms; + -o-transition: background-color 150ms, opacity 150ms; + transition: background-color 150ms, opacity 150ms; +} +.trumbowyg-button-pane button.trumbowyg-textual-button { + width: auto; + line-height: 35px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.trumbowyg-button-pane.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active), +.trumbowyg-button-pane button.trumbowyg-disable, .trumbowyg-disabled .trumbowyg-button-pane button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button) { + opacity: 0.2; + cursor: default; + pointer-events: none; +} +.trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before, .trumbowyg-disabled .trumbowyg-button-pane .trumbowyg-button-group::before { + background: #e3e9eb; +} +.trumbowyg-button-pane button:not(.trumbowyg-disable):hover, +.trumbowyg-button-pane button:not(.trumbowyg-disable):focus, +.trumbowyg-button-pane button.trumbowyg-active { + background-color: #fff; + outline: none; +} +.trumbowyg-button-pane .trumbowyg-open-dropdown::after { + display: block; + content: " "; + position: absolute; + top: 27px; + right: 3px; + height: 0; + width: 0; + border: 3px solid transparent; + border-top-color: #555; +} +.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button { + padding-left: 10px !important; + padding-right: 18px !important; +} +.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button::after { + top: 17px; + right: 7px; +} +.trumbowyg-button-pane .trumbowyg-right { + margin-left: auto; +} + +.trumbowyg-dropdown { + max-width: 300px; + max-height: 250px; + overflow-y: auto; + overflow-x: hidden; + white-space: nowrap; + border: 1px solid #d7e0e2; + padding: 5px 0; + border-top: none; + background: #fff; + color: #222; + margin-left: -1px; + -webkit-box-shadow: rgba(0, 0, 0, 0.1) 0 2px 3px; + box-shadow: rgba(0, 0, 0, 0.1) 0 2px 3px; + z-index: 12; +} +.trumbowyg-dropdown button { + display: block; + width: 100%; + height: 35px; + line-height: 35px; + text-decoration: none; + background: #fff; + padding: 0 20px 0 10px; + color: #222; + border: none; + cursor: pointer; + text-align: left; + font-size: 15px; + -webkit-transition: all 150ms; + -o-transition: all 150ms; + transition: all 150ms; +} +.trumbowyg-dropdown button:hover, .trumbowyg-dropdown button:focus { + background: #ecf0f1; +} +.trumbowyg-dropdown button svg { + float: left; + margin-right: 14px; +} + +/* Modal box */ +.trumbowyg-modal { + position: absolute; + top: 0; + left: 50%; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + -o-transform: translateX(-50%); + transform: translateX(-50%); + max-width: 520px; + width: 100%; + height: 350px; + z-index: 12; + overflow: hidden; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} + +.trumbowyg-modal-box { + position: absolute; + top: 0; + left: 50%; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + -o-transform: translateX(-50%); + transform: translateX(-50%); + max-width: 500px; + width: calc(100% - 20px); + padding-bottom: 45px; + z-index: 1; + background-color: #fff; + text-align: center; + font-size: 14px; + font-family: "Trebuchet MS", Helvetica, Verdana, sans-serif; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 2px 3px; + box-shadow: rgba(0, 0, 0, 0.2) 0 2px 3px; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.trumbowyg-modal-box .trumbowyg-modal-title { + font-size: 24px; + font-weight: bold; + margin: 0 0 20px; + padding: 15px 0 13px; + display: block; + border-bottom: 1px solid #d7e0e2; +} +.trumbowyg-modal-box .trumbowyg-progress { + width: 100%; + height: 3px; + position: absolute; + top: 58px; +} +.trumbowyg-modal-box .trumbowyg-progress .trumbowyg-progress-bar { + background: #2BC06A; + width: 0; + height: 100%; + -webkit-transition: width 150ms linear; + -o-transition: width 150ms linear; + transition: width 150ms linear; +} +.trumbowyg-modal-box .trumbowyg-input-row { + position: relative; + margin: 15px 12px; + border: 1px solid #dedede; + overflow: hidden; +} +.trumbowyg-modal-box .trumbowyg-input-infos { + text-align: left; + -webkit-transition: all 150ms; + -o-transition: all 150ms; + transition: all 150ms; + width: 150px; + border-right: 1px solid #dedede; + padding: 0 7px; + background-color: #fbfcfc; + position: absolute; + left: 0; + top: 0; + bottom: 0; +} +.trumbowyg-modal-box .trumbowyg-input-infos label { + color: #69878f; + overflow: hidden; + height: 27px; + line-height: 27px; +} +.trumbowyg-modal-box .trumbowyg-input-infos label, .trumbowyg-modal-box .trumbowyg-input-infos label span { + display: block; + height: 27px; + line-height: 27px; + -webkit-transition: all 150ms; + -o-transition: all 150ms; + transition: all 150ms; +} +.trumbowyg-modal-box .trumbowyg-input-infos .trumbowyg-msg-error { + color: #e74c3c; +} +.trumbowyg-modal-box .trumbowyg-input-html { + padding: 1px 1px 1px 152px; +} +.trumbowyg-modal-box .trumbowyg-input-html, .trumbowyg-modal-box .trumbowyg-input-html input, .trumbowyg-modal-box .trumbowyg-input-html textarea, .trumbowyg-modal-box .trumbowyg-input-html select { + font-size: 14px; +} +.trumbowyg-modal-box .trumbowyg-input-html input, .trumbowyg-modal-box .trumbowyg-input-html textarea, .trumbowyg-modal-box .trumbowyg-input-html select { + -webkit-transition: all 150ms; + -o-transition: all 150ms; + transition: all 150ms; + height: 27px; + line-height: 27px; + border: 0; + width: 100%; + padding: 0 7px; +} +.trumbowyg-modal-box .trumbowyg-input-html input:hover, .trumbowyg-modal-box .trumbowyg-input-html input:focus, .trumbowyg-modal-box .trumbowyg-input-html textarea:hover, .trumbowyg-modal-box .trumbowyg-input-html textarea:focus, .trumbowyg-modal-box .trumbowyg-input-html select:hover, .trumbowyg-modal-box .trumbowyg-input-html select:focus { + outline: 1px solid #95a5a6; +} +.trumbowyg-modal-box .trumbowyg-input-html input:focus, .trumbowyg-modal-box .trumbowyg-input-html textarea:focus, .trumbowyg-modal-box .trumbowyg-input-html select:focus { + background: #fbfcfc; +} +.trumbowyg-modal-box .trumbowyg-input-html input[type=checkbox] { + width: 16px; + height: 16px; + padding: 0; +} +.trumbowyg-modal-box .trumbowyg-input-html-with-checkbox { + text-align: left; + padding: 3px 1px 1px 3px; +} +.trumbowyg-modal-box .trumbowyg-input-error input, .trumbowyg-modal-box .trumbowyg-input-error select, .trumbowyg-modal-box .trumbowyg-input-error textarea { + outline: 1px solid #e74c3c; +} +.trumbowyg-modal-box .trumbowyg-input-error .trumbowyg-input-infos label span:first-child { + margin-top: -27px; +} +.trumbowyg-modal-box .error { + margin-top: 25px; + display: block; + color: red; +} +.trumbowyg-modal-box .trumbowyg-modal-button { + position: absolute; + bottom: 10px; + right: 0; + text-decoration: none; + color: #fff; + display: block; + width: 100px; + height: 35px; + line-height: 33px; + margin: 0 10px; + background-color: #333; + border: none; + cursor: pointer; + font-family: "Trebuchet MS", Helvetica, Verdana, sans-serif; + font-size: 16px; + -webkit-transition: all 150ms; + -o-transition: all 150ms; + transition: all 150ms; +} +.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit { + right: 110px; + background: #2bc06a; +} +.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover, .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus { + background: #40d47e; + outline: none; +} +.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active { + background: #25a25a; +} +.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset { + color: #555; + background: #e6e6e6; +} +.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover, .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus { + background: #fbfbfb; + outline: none; +} +.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active { + background: #d5d5d5; +} + +.trumbowyg-overlay { + position: absolute; + background-color: rgba(255, 255, 255, 0.5); + height: 100%; + width: 100%; + left: 0; + display: none; + top: 0; + z-index: 10; +} + +/** + * Fullscreen + */ +body.trumbowyg-body-fullscreen { + overflow: hidden; +} + +.trumbowyg-fullscreen { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + margin: 0; + padding: 0; + z-index: 99999; +} +.trumbowyg-fullscreen.trumbowyg-box, +.trumbowyg-fullscreen .trumbowyg-editor-box { + border: none; +} +.trumbowyg-fullscreen .trumbowyg-editor-box, +.trumbowyg-fullscreen .trumbowyg-textarea { + height: auto !important; + overflow: auto; +} +.trumbowyg-fullscreen .trumbowyg-overlay { + height: 100% !important; +} +.trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg { + color: #222; + fill: transparent; +} + +.trumbowyg-editor { + /* + * For resetCss option + */ +} +.trumbowyg-editor object, +.trumbowyg-editor embed, +.trumbowyg-editor video, +.trumbowyg-editor img { + max-width: 100%; +} +.trumbowyg-editor video, +.trumbowyg-editor img { + height: auto; +} +.trumbowyg-editor img { + cursor: move; +} +.trumbowyg-editor canvas:focus { + outline: none; +} +.trumbowyg-editor.trumbowyg-reset-css { + background: #fefefe !important; + font-family: "Trebuchet MS", Helvetica, Verdana, sans-serif !important; + font-size: 14px !important; + line-height: 1.45em !important; + color: #333 !important; + font-weight: normal !important; +} +.trumbowyg-editor.trumbowyg-reset-css a { + color: #15c !important; + text-decoration: underline !important; +} +.trumbowyg-editor.trumbowyg-reset-css div, +.trumbowyg-editor.trumbowyg-reset-css p, +.trumbowyg-editor.trumbowyg-reset-css ul, +.trumbowyg-editor.trumbowyg-reset-css ol, +.trumbowyg-editor.trumbowyg-reset-css blockquote { + -webkit-box-shadow: none !important; + box-shadow: none !important; + background: none !important; + margin: 0 !important; + margin-bottom: 15px !important; + line-height: 1.4em !important; + font-family: "Trebuchet MS", Helvetica, Verdana, sans-serif !important; + font-size: 14px !important; + border: none !important; +} +.trumbowyg-editor.trumbowyg-reset-css iframe, +.trumbowyg-editor.trumbowyg-reset-css object, +.trumbowyg-editor.trumbowyg-reset-css hr { + margin-bottom: 15px !important; +} +.trumbowyg-editor.trumbowyg-reset-css blockquote { + margin-left: 32px !important; + font-style: italic !important; + color: #555 !important; +} +.trumbowyg-editor.trumbowyg-reset-css ul { + list-style: disc !important; +} +.trumbowyg-editor.trumbowyg-reset-css ol { + list-style: decimal !important; +} +.trumbowyg-editor.trumbowyg-reset-css ul, +.trumbowyg-editor.trumbowyg-reset-css ol { + padding-left: 20px !important; +} +.trumbowyg-editor.trumbowyg-reset-css ul ul, +.trumbowyg-editor.trumbowyg-reset-css ol ol, +.trumbowyg-editor.trumbowyg-reset-css ul ol, +.trumbowyg-editor.trumbowyg-reset-css ol ul { + border: none !important; + margin: 2px !important; + padding: 0 !important; + padding-left: 24px !important; +} +.trumbowyg-editor.trumbowyg-reset-css hr { + display: block !important; + height: 1px !important; + border: none !important; + border-top: 1px solid #CCC !important; +} +.trumbowyg-editor.trumbowyg-reset-css h1, +.trumbowyg-editor.trumbowyg-reset-css h2, +.trumbowyg-editor.trumbowyg-reset-css h3, +.trumbowyg-editor.trumbowyg-reset-css h4 { + color: #111 !important; + background: none !important; + margin: 0 !important; + padding: 0 !important; + font-weight: bold !important; +} +.trumbowyg-editor.trumbowyg-reset-css h1 { + font-size: 32px !important; + line-height: 38px !important; + margin-bottom: 20px !important; +} +.trumbowyg-editor.trumbowyg-reset-css h2 { + font-size: 26px !important; + line-height: 34px !important; + margin-bottom: 15px !important; +} +.trumbowyg-editor.trumbowyg-reset-css h3 { + font-size: 22px !important; + line-height: 28px !important; + margin-bottom: 7px !important; +} +.trumbowyg-editor.trumbowyg-reset-css h4 { + font-size: 16px !important; + line-height: 22px !important; + margin-bottom: 7px !important; +} + +/* + * Dark theme + */ +.trumbowyg-dark .trumbowyg-textarea { + background: #222; + color: #fff; + border-color: #343434; +} +.trumbowyg-dark .trumbowyg-box { + border: 1px solid #343434; +} +.trumbowyg-dark .trumbowyg-box.trumbowyg-fullscreen { + background: #111; +} +.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before { + text-shadow: 0 0 7px #ccc; +} +@media screen and (min-width: 0 \0 ) { + .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before { + color: rgba(20, 20, 20, 0.6) !important; + } +} +@supports (-ms-accelerator: true) { + .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *, .trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before { + color: rgba(20, 20, 20, 0.6) !important; + } +} +.trumbowyg-dark .trumbowyg-box svg { + fill: #fff; + color: #fff; +} +.trumbowyg-dark .trumbowyg-button-pane { + background-color: #222; + border-bottom-color: #343434; +} +.trumbowyg-dark .trumbowyg-button-pane::before, .trumbowyg-dark .trumbowyg-button-pane::after { + background: #343434; +} +.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty)::after { + background-color: #343434; +} +.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg { + color: transparent; +} +.trumbowyg-dark .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::after { + background-color: #2a2a2a; +} +.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):hover, +.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):focus, +.trumbowyg-dark .trumbowyg-button-pane button.trumbowyg-active { + background-color: #333; +} +.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-open-dropdown::after { + border-top-color: #fff; +} +.trumbowyg-dark .trumbowyg-fullscreen .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg { + color: #ecf0f1; + fill: transparent; +} +.trumbowyg-dark .trumbowyg-dropdown { + border-color: #343434; + background: #333; + -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 2px 3px; + box-shadow: rgba(0, 0, 0, 0.3) 0 2px 3px; +} +.trumbowyg-dark .trumbowyg-dropdown button { + background: #333; + color: #fff; +} +.trumbowyg-dark .trumbowyg-dropdown button:hover, .trumbowyg-dark .trumbowyg-dropdown button:focus { + background: #222; +} +.trumbowyg-dark .trumbowyg-modal-box { + background-color: #333; + color: #fff; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title { + border-bottom: 1px solid #555; + color: #fff; + background: #3c3c3c; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-row { + border-color: #222; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-infos { + color: #eee; + background-color: #2f2f2f; + border-right-color: #222; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-infos span { + color: #eee; + background-color: #2f2f2f; + border-color: #343434; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-infos span.trumbowyg-msg-error { + color: #e74c3c; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-row.trumbowyg-input-error input, +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-row.trumbowyg-input-error select, +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-row.trumbowyg-input-error textarea { + border-color: #e74c3c; +} +.trumbowyg-dark .trumbowyg-modal-box input, +.trumbowyg-dark .trumbowyg-modal-box select, +.trumbowyg-dark .trumbowyg-modal-box textarea { + border-color: #343434; + color: #fff; + background: #222; +} +.trumbowyg-dark .trumbowyg-modal-box input:hover, .trumbowyg-dark .trumbowyg-modal-box input:focus, +.trumbowyg-dark .trumbowyg-modal-box select:hover, +.trumbowyg-dark .trumbowyg-modal-box select:focus, +.trumbowyg-dark .trumbowyg-modal-box textarea:hover, +.trumbowyg-dark .trumbowyg-modal-box textarea:focus { + border-color: #626262; +} +.trumbowyg-dark .trumbowyg-modal-box input:focus, +.trumbowyg-dark .trumbowyg-modal-box select:focus, +.trumbowyg-dark .trumbowyg-modal-box textarea:focus { + background-color: #2f2f2f; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit { + background: #1b7943; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover, .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus { + background: #25a25a; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active { + background: #176437; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset { + background: #333; + color: #ccc; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover, .trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus { + background: #444; +} +.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active { + background: #111; +} +.trumbowyg-dark .trumbowyg-overlay { + background-color: rgba(15, 15, 15, 0.6); +} + +.trumbowyg-editor-box { + background: #fff; +} \ No newline at end of file diff --git a/src/main/resources/static/css/bootstrap/_alert.scss b/src/main/resources/static/css/bootstrap/_alert.scss new file mode 100644 index 0000000..da2a98a --- /dev/null +++ b/src/main/resources/static/css/bootstrap/_alert.scss @@ -0,0 +1,51 @@ +// +// Base styles +// + +.alert { + position: relative; + padding: $alert-padding-y $alert-padding-x; + margin-bottom: $alert-margin-bottom; + border: $alert-border-width solid transparent; + @include border-radius($alert-border-radius); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $close-font-size + $alert-padding-x * 2; + + // Adjust close link position + .close { + position: absolute; + top: 0; + right: 0; + padding: $alert-padding-y $alert-padding-x; + color: inherit; + } +} + + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +@each $color, $value in $theme-colors { + .alert-#{$color} { + @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level)); + } +} diff --git a/src/main/resources/static/css/bootstrap/_badge.scss b/src/main/resources/static/css/bootstrap/_badge.scss new file mode 100644 index 0000000..42c5d08 --- /dev/null +++ b/src/main/resources/static/css/bootstrap/_badge.scss @@ -0,0 +1,54 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + display: inline-block; + padding: $badge-padding-y $badge-padding-x; + @include font-size($badge-font-size); + font-weight: $badge-font-weight; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius($badge-border-radius); + @include transition($badge-transition); + + @at-root a#{&} { + @include hover-focus() { + text-decoration: none; + } + } + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} + +// Pill badges +// +// Make them extra rounded with a modifier to replace v3's badges. + +.badge-pill { + padding-right: $badge-pill-padding-x; + padding-left: $badge-pill-padding-x; + @include border-radius($badge-pill-border-radius); +} + +// Colors +// +// Contextual variations (linked badges get darker on :hover). + +@each $color, $value in $theme-colors { + .badge-#{$color} { + @include badge-variant($value); + } +} diff --git a/src/main/resources/static/css/bootstrap/_breadcrumb.scss b/src/main/resources/static/css/bootstrap/_breadcrumb.scss new file mode 100644 index 0000000..d748894 --- /dev/null +++ b/src/main/resources/static/css/bootstrap/_breadcrumb.scss @@ -0,0 +1,42 @@ +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: $breadcrumb-padding-y $breadcrumb-padding-x; + margin-bottom: $breadcrumb-margin-bottom; + @include font-size($breadcrumb-font-size); + list-style: none; + background-color: $breadcrumb-bg; + @include border-radius($breadcrumb-border-radius); +} + +.breadcrumb-item { + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item { + padding-left: $breadcrumb-item-padding; + + &::before { + display: inline-block; // Suppress underlining of the separator in modern browsers + padding-right: $breadcrumb-item-padding; + color: $breadcrumb-divider-color; + content: escape-svg($breadcrumb-divider); + } + } + + // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built + // without `