From b53802c813b0873cc97a8f80db7d8de87d2141bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Henke?= Date: Wed, 6 Jul 2022 16:27:04 +0200 Subject: [PATCH] removed calendar --- .../spring/done/impl/DoneGateway.java | 10 +- .../spring/done/impl/DoneService.java | 1 - .../de/jottyfan/timetrack/modules/Bean.java | 10 - .../timetrack/modules/ControlInterface.java | 17 - .../timetrack/modules/JooqGateway.java | 54 -- .../de/jottyfan/timetrack/modules/Model.java | 16 - .../timetrack/modules/SessionBean.java | 97 ---- .../timetrack/modules/SessionControl.java | 111 ---- .../timetrack/modules/SessionGateway.java | 108 ---- .../timetrack/modules/SessionModel.java | 38 -- .../modules/TimetrackController.java | 181 ------- .../modules/done/DailySummaryBean.java | 64 --- .../timetrack/modules/done/DoneControl.java | 88 ---- .../timetrack/modules/done/DoneGateway.java | 495 ------------------ .../timetrack/modules/done/DoneModel.java | 345 ------------ .../timetrack/modules/done/DownloadBean.java | 61 --- .../timetrack/modules/done/RgbColor.java | 71 --- .../timetrack/modules/done/TimeBean.java | 32 -- .../timetrack/modules/done/UserBean.java | 44 -- .../modules/done/WholeDaySummaryBean.java | 71 --- .../fullcalendar/ColorfulFCEventBean.java | 89 ---- .../done/fullcalendar/FCEventBean.java | 198 ------- .../done/fullcalendar/FCEventList.java | 40 -- src/main/resources/static/css/style.css | 4 +- .../resources/templates/contact/list.html | 2 +- src/main/resources/templates/done/list.html | 4 +- src/main/resources/templates/layout/main.html | 12 +- src/main/resources/templates/note/list.html | 2 +- src/main/webapp/META-INF/context.xml | 6 - src/main/webapp/WEB-INF/beans.xml | 0 src/main/webapp/WEB-INF/faces-config.xml | 10 - src/main/webapp/WEB-INF/web.xml | 69 --- src/main/webapp/pages/contact/item.xhtml | 42 -- src/main/webapp/pages/contact/list.xhtml | 41 -- src/main/webapp/pages/done/add.xhtml | 80 --- src/main/webapp/pages/done/delete.xhtml | 39 -- src/main/webapp/pages/done/edit.xhtml | 85 --- src/main/webapp/pages/done/init.xhtml | 139 ----- src/main/webapp/pages/done/read.xhtml | 46 -- src/main/webapp/pages/note/item.xhtml | 47 -- src/main/webapp/pages/note/list.xhtml | 45 -- src/main/webapp/pages/start.xhtml | 77 --- src/main/webapp/pages/template.xhtml | 24 - .../jslibs/fullcalendar/locales-all.min.js | 1 - .../jslibs/fullcalendar/main.min.css | 1 - .../resources/jslibs/fullcalendar/main.min.js | 6 - .../webapp/resources/my/fullcalendar.xhtml | 83 --- .../webapp/resources/my/selectOneMenu.xhtml | 29 - 48 files changed, 17 insertions(+), 3118 deletions(-) delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/Bean.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/ControlInterface.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/JooqGateway.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/Model.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/SessionBean.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/SessionControl.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/SessionGateway.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/SessionModel.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/TimetrackController.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/DailySummaryBean.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/DoneControl.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/DoneGateway.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/DoneModel.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/DownloadBean.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/RgbColor.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/TimeBean.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/UserBean.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/WholeDaySummaryBean.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/ColorfulFCEventBean.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/FCEventBean.java delete mode 100644 src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/FCEventList.java delete mode 100644 src/main/webapp/META-INF/context.xml delete mode 100644 src/main/webapp/WEB-INF/beans.xml delete mode 100644 src/main/webapp/WEB-INF/faces-config.xml delete mode 100644 src/main/webapp/WEB-INF/web.xml delete mode 100644 src/main/webapp/pages/contact/item.xhtml delete mode 100644 src/main/webapp/pages/contact/list.xhtml delete mode 100644 src/main/webapp/pages/done/add.xhtml delete mode 100644 src/main/webapp/pages/done/delete.xhtml delete mode 100644 src/main/webapp/pages/done/edit.xhtml delete mode 100644 src/main/webapp/pages/done/init.xhtml delete mode 100644 src/main/webapp/pages/done/read.xhtml delete mode 100644 src/main/webapp/pages/note/item.xhtml delete mode 100644 src/main/webapp/pages/note/list.xhtml delete mode 100644 src/main/webapp/pages/start.xhtml delete mode 100644 src/main/webapp/pages/template.xhtml delete mode 100644 src/main/webapp/resources/jslibs/fullcalendar/locales-all.min.js delete mode 100644 src/main/webapp/resources/jslibs/fullcalendar/main.min.css delete mode 100644 src/main/webapp/resources/jslibs/fullcalendar/main.min.js delete mode 100644 src/main/webapp/resources/my/fullcalendar.xhtml delete mode 100644 src/main/webapp/resources/my/selectOneMenu.xhtml diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneGateway.java b/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneGateway.java index 88e0b9e..c3c6be8 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneGateway.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneGateway.java @@ -4,12 +4,8 @@ import static de.jottyfan.timetrack.db.done.Tables.T_BILLING; import static de.jottyfan.timetrack.db.done.Tables.T_DONE; import static de.jottyfan.timetrack.db.done.Tables.T_JOB; import static de.jottyfan.timetrack.db.done.Tables.T_MODULE; -import static de.jottyfan.timetrack.db.done.Tables.T_PROJECT; -import static de.jottyfan.timetrack.db.profile.Tables.T_LOGIN; -import static de.jottyfan.timetrack.db.done.Tables.V_BILLING; -import static de.jottyfan.timetrack.db.done.Tables.V_JOB; -import static de.jottyfan.timetrack.db.done.Tables.V_MODULE; import static de.jottyfan.timetrack.db.done.Tables.V_PROJECT; +import static de.jottyfan.timetrack.db.profile.Tables.T_LOGIN; import java.sql.SQLException; import java.time.LocalDate; @@ -32,8 +28,8 @@ import org.jooq.exception.DataAccessException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; -import de.jottyfan.timetrack.db.done.tables.records.VBillingRecord; import de.jottyfan.timetrack.db.done.tables.records.TDoneRecord; +import de.jottyfan.timetrack.db.done.tables.records.VBillingRecord; import de.jottyfan.timetrack.db.done.tables.records.VJobRecord; import de.jottyfan.timetrack.db.done.tables.records.VModuleRecord; import de.jottyfan.timetrack.db.done.tables.records.VProjectRecord; @@ -68,7 +64,7 @@ public class DoneGateway { Result r = getJooq().selectFrom(T_LOGIN).where(T_LOGIN.LOGIN.eq(username)).fetch(); return r == null || r.size() < 1 ? null : r.get(0).getPk(); } - + /** * get all projects from the database * diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneService.java b/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneService.java index 7e43af3..90eb51c 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneService.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneService.java @@ -128,5 +128,4 @@ public class DoneService implements IDoneService { return -1; } } - } diff --git a/src/main/old/de/jottyfan/timetrack/modules/Bean.java b/src/main/old/de/jottyfan/timetrack/modules/Bean.java deleted file mode 100644 index 434a999..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/Bean.java +++ /dev/null @@ -1,10 +0,0 @@ -package de.jottyfan.timetrack.modules; - -/** - * - * @author henkej - * - */ -public interface Bean -{ -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/ControlInterface.java b/src/main/old/de/jottyfan/timetrack/modules/ControlInterface.java deleted file mode 100644 index 6fea2d3..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/ControlInterface.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.jottyfan.timetrack.modules; - -/** - * - * @author henkej - * - */ -public interface ControlInterface -{ - /** - * navigate to init page of module - * - * @return - * @throws DBException - */ - public String toList(); -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/JooqGateway.java b/src/main/old/de/jottyfan/timetrack/modules/JooqGateway.java deleted file mode 100644 index 00b4522..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/JooqGateway.java +++ /dev/null @@ -1,54 +0,0 @@ -package de.jottyfan.timetrack.modules; - -import java.sql.SQLException; - -import javax.faces.application.FacesMessage; - -import org.jooq.CloseableDSLContext; -import org.jooq.TableLike; - -import de.jooqfaces.JooqFacesContext; - -/** - * - * @author henkej - * - */ -public class JooqGateway { - private final JooqFacesContext facesContext; - - public JooqGateway(JooqFacesContext facesContext) { - this.facesContext = facesContext; - } - - public CloseableDSLContext getJooq() throws ClassNotFoundException, SQLException { - return facesContext.getJooq(); - } - - public void addToSessionMap(String key, Object value) { - facesContext.getExternalContext().getSessionMap().put(key, value); - } - - public Integer getFkLogin() { - SessionBean bean = (SessionBean) facesContext.getExternalContext().getSessionMap().get("sessionBean"); - if (bean == null) { - facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "schwerer Anwendungsfehler", - "no sessionBean found in session, therefore, set fkLogin to 1")); - bean = new SessionBean(); - bean.setLogin(1); - } - return bean.getLogin(); - } - - /** - * return amount of "select count(1) as amount " + subQuery - * - * @param subQuery - * @return number of entries - * @throws ClassNotFoundException - * @throws SQLException - */ - public Long getAmount(TableLike table) throws ClassNotFoundException, SQLException { - return getJooq().selectCount().from(table).fetchOne(0, long.class); - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/Model.java b/src/main/old/de/jottyfan/timetrack/modules/Model.java deleted file mode 100644 index dab29f5..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/Model.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.jottyfan.timetrack.modules; - -/** - * - * @author henkej - * - */ -public interface Model -{ - /** - * get bean of model - * - * @return bean - */ - public Bean getBean(); -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/SessionBean.java b/src/main/old/de/jottyfan/timetrack/modules/SessionBean.java deleted file mode 100644 index 7860baa..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/SessionBean.java +++ /dev/null @@ -1,97 +0,0 @@ -package de.jottyfan.timetrack.modules; - -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; - -import javax.enterprise.context.SessionScoped; -import javax.inject.Named; - -import org.jasypt.util.password.StrongPasswordEncryptor; - -/** - * - * @author henkej - * - */ -@Named -@SessionScoped -public class SessionBean implements Serializable { - private static final long serialVersionUID = 1L; - - private Set privileges; - private Integer login; - private String username; - private String secret; - private String forename; - private String surname; - - public SessionBean() { - this.privileges = new HashSet<>(); - } - - public Boolean getHasLogin() { - return login != null; - } - - public Boolean getHasNoLogin() { - return login == null; - } - - public Integer getLogin() { - return login; - } - - public void setLogin(Integer login) { - this.login = login; - } - - public Boolean hasPrivilege(String privilege) { - return privileges.contains(privilege); - } - - public String getSecret() { - StrongPasswordEncryptor spe = new StrongPasswordEncryptor(); - return spe.encryptPassword(secret); - } - - public boolean checkSecret(String encrypted) { - StrongPasswordEncryptor spe = new StrongPasswordEncryptor(); - return spe.checkPassword(secret, encrypted); - } - - public void setSecret(String secret) { - this.secret = secret; - } - - public String getForename() { - return forename; - } - - public void setForename(String forename) { - this.forename = forename; - } - - public String getSurname() { - return surname; - } - - public void setSurname(String surname) { - this.surname = surname; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - /** - * @return the privileges - */ - public Set getPrivileges() { - return privileges; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/SessionControl.java b/src/main/old/de/jottyfan/timetrack/modules/SessionControl.java deleted file mode 100644 index e39b9ef..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/SessionControl.java +++ /dev/null @@ -1,111 +0,0 @@ -package de.jottyfan.timetrack.modules; - -import java.io.InputStream; -import java.util.Properties; - -import javax.enterprise.context.RequestScoped; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; -import javax.inject.Inject; -import javax.inject.Named; - -import de.jooqfaces.JooqFacesContext; -import de.jottyfan.timetrack.help.Pages; - -/** - * - * @author henkej - * - */ -@Named -@RequestScoped -public class SessionControl { - - @Inject - private SessionBean sessionBean; - - private String secretNew1; - private String secretNew2; - - public String doLogin() { - SessionModel model = new SessionModel(); - model.doLogin((JooqFacesContext) FacesContext.getCurrentInstance(), sessionBean); - return Pages.START.get(); - } - - public String doLogout() { - sessionBean.setLogin(null); - sessionBean.setSecret(null); - sessionBean.setForename(null); - sessionBean.setSurname(null); - sessionBean.setUsername(null); - sessionBean.getPrivileges().clear(); - return Pages.START.get(); - } - - public String doChangePassword() { - if (!secretNew1.equals(secretNew2)) { - FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "error on changing password", - "passwords are not equal"); - FacesContext.getCurrentInstance().addMessage(null, msg); - return ""; - } else if (new SessionModel().doChangePassword((JooqFacesContext) FacesContext.getCurrentInstance(), secretNew1)) { - FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "successfully changed password", - "the new password has been saved"); - FacesContext.getCurrentInstance().addMessage(null, msg); - return Pages.START.get(); - } else { - FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "error on changing password", - "database change was not successful"); - FacesContext.getCurrentInstance().addMessage(null, msg); - return ""; - } - } - - /** - * get the version from the mainfest file - * - * @return the version - */ - public String getVersion() { - FacesContext facesContext = FacesContext.getCurrentInstance(); - try (InputStream is = facesContext.getExternalContext().getResourceAsStream("META-INF/MANIFEST.MF")){ - // from servletcontext - Properties attributes = new Properties(); - attributes.load(is); - return attributes.getProperty("Implementation-Version", "no Implementation-Version attribute found in MANIFEST"); - } catch (Exception e) { - FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "error on loading the version from the Manifest file", e.getMessage()); - FacesContext.getCurrentInstance().addMessage(null, msg); - return "?"; - } - } - - /** - * @return the secretNew1 - */ - public String getSecretNew1() { - return secretNew1; - } - - /** - * @param secretNew1 the secretNew1 to set - */ - public void setSecretNew1(String secretNew1) { - this.secretNew1 = secretNew1; - } - - /** - * @return the secretNew2 - */ - public String getSecretNew2() { - return secretNew2; - } - - /** - * @param secretNew2 the secretNew2 to set - */ - public void setSecretNew2(String secretNew2) { - this.secretNew2 = secretNew2; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/SessionGateway.java b/src/main/old/de/jottyfan/timetrack/modules/SessionGateway.java deleted file mode 100644 index e211b72..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/SessionGateway.java +++ /dev/null @@ -1,108 +0,0 @@ -package de.jottyfan.timetrack.modules; - -import static de.jottyfan.timetrack.db.profile.Tables.T_LOGIN; -import static de.jottyfan.timetrack.db.profile.Tables.V_LOGINROLE; - -import java.sql.SQLException; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.jooq.CloseableDSLContext; -import org.jooq.Record1; -import org.jooq.Record4; -import org.jooq.SelectConditionStep; -import org.jooq.UpdateConditionStep; -import org.jooq.exception.DataAccessException; - -import de.jooqfaces.JooqFacesContext; -import de.jottyfan.timetrack.db.profile.tables.records.TLoginRecord; - -/** - * - * @author henkej - * - */ -public class SessionGateway extends JooqGateway { - private static final Logger LOGGER = LogManager.getLogger(); - - public SessionGateway(JooqFacesContext facesContext) { - super(facesContext); - } - - /** - * seek login and set bean's login to that; if not found, return false - * - * @param bean - * the bean - * @return true or false - * @throws SQLException - * @throws ClassNotFoundException - * @throws DataAccessException - */ - public boolean seekAndSetLogin(SessionBean bean) throws DataAccessException, ClassNotFoundException, SQLException { - try (CloseableDSLContext jooq = getJooq()) { - SelectConditionStep> sql = jooq - // @formatter:off - .select(T_LOGIN.PK, - T_LOGIN.FORENAME, - T_LOGIN.SURNAME, - T_LOGIN.PASSWORD) - .from(T_LOGIN) - .where(T_LOGIN.LOGIN.eq(bean.getUsername())); - // @formatter:on - LOGGER.debug(sql.toString()); - Record4 r = sql.fetchOne(); - if (r != null) { - String encrypted = r.get(T_LOGIN.PASSWORD); - if (bean.checkSecret(encrypted)) { - bean.setLogin(r.get(T_LOGIN.PK)); - bean.setForename(r.get(T_LOGIN.FORENAME)); - bean.setSurname(r.get(T_LOGIN.SURNAME)); - - SelectConditionStep> sql2 = jooq - // @formatter:off - .select(V_LOGINROLE.ROLE_NAME) - .from(V_LOGINROLE) - .where(V_LOGINROLE.LOGIN.eq(bean.getUsername())); - // @formatter:on - LOGGER.debug(sql2.toString()); - for (Record1 privilege : sql2.fetch()) { - bean.getPrivileges().add(privilege.get(V_LOGINROLE.ROLE_NAME)); - } - addToSessionMap("sessionBean", bean); - return true; - } else { - throw new DataAccessException("wrong password"); - } - } else { - return false; - } - } - } - - /** - * change the password - * - * @param bean - * the bean containing the new password - * @return true or false - * @throws SQLException - * @throws ClassNotFoundException - * @throws DataAccessException - */ - public boolean changePassword(SessionBean bean, String newPassword) - throws DataAccessException, ClassNotFoundException, SQLException { - bean.setSecret(newPassword); - String encryptedPassword = bean.getSecret(); - try (CloseableDSLContext jooq = getJooq()) { - UpdateConditionStep sql = jooq - // @formatter:off - .update(T_LOGIN) - .set(T_LOGIN.PASSWORD, encryptedPassword) - .where(T_LOGIN.PK.eq(bean.getLogin())); - // @formatter:on - LOGGER.debug("updating password, disable log here"); - return sql.execute() == 1; - } - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/SessionModel.java b/src/main/old/de/jottyfan/timetrack/modules/SessionModel.java deleted file mode 100644 index bd6a6de..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/SessionModel.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.jottyfan.timetrack.modules; - -import java.sql.SQLException; - -import javax.faces.application.FacesMessage; - -import org.jooq.exception.DataAccessException; - -import de.jooqfaces.JooqFacesContext; - -/** - * - * @author henkej - * - */ -public class SessionModel { - - public boolean doLogin(JooqFacesContext facesContext, SessionBean bean) { - try { - return new SessionGateway(facesContext).seekAndSetLogin(bean); - } catch (DataAccessException | ClassNotFoundException | SQLException e) { - FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "error on login", e.getMessage()); - facesContext.addMessage(null, msg); - return false; - } - } - - public boolean doChangePassword(JooqFacesContext facesContext, String secretNew) { - try { - SessionBean bean = (SessionBean) facesContext.getExternalContext().getSessionMap().get("sessionBean"); - return new SessionGateway(facesContext).changePassword(bean, secretNew); - } catch (DataAccessException | ClassNotFoundException | SQLException e) { - FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "error on changing password", e.getMessage()); - facesContext.addMessage(null, msg); - return false; - } - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/TimetrackController.java b/src/main/old/de/jottyfan/timetrack/modules/TimetrackController.java deleted file mode 100644 index 7ebfac0..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/TimetrackController.java +++ /dev/null @@ -1,181 +0,0 @@ -package de.jottyfan.timetrack.modules; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.security.RolesAllowed; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -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.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; - -/** - * - * @author henkej - * - */ -@Controller -public class TimetrackController { - private static final Logger LOGGER = LogManager.getLogger(TimetrackController.class); - - private final HttpServletRequest request; - - @Autowired - private ITimetrackService fuelService; - - private List cachedFuels; - - @Autowired - public TimetrackController(HttpServletRequest request) { - this.request = request; - } - - @GetMapping("/logout") - public String getLogout(HttpServletRequest request) throws ServletException { - request.logout(); - return "redirect:/"; - } - - @RolesAllowed("car_user") - @GetMapping("/secure/welcome") - public String getWelcome() { - return "secure/welcome"; - } - - @GetMapping("/") - public String getIndex() { - this.cachedFuels = null; - return "public/index"; - } - - @RolesAllowed("car_user") - @GetMapping("/secure/to_table") - public String getTable() { - this.cachedFuels = null; - return "secure/table"; - } - - @RolesAllowed("car_user") - @RequestMapping(value = "/secure/to_bean", method = RequestMethod.GET) - public String getBean(Model model) { - FuelBean bean = model.containsAttribute("fuelBean") ? (FuelBean) model.getAttribute("fuelBean") : new FuelBean(); - model.addAttribute("fuelBean", bean); - return "secure/bean"; - } - - @RolesAllowed("car_user") - @RequestMapping(value = "/secure/to_existing_bean/{fkFuelBean}", method = RequestMethod.GET) - public String getBean(Model model, @PathVariable Integer fkFuelBean) throws Exception { - FuelBean bean = getFuelBean(fkFuelBean); - model.addAttribute("fuelBean", bean); - return "secure/bean"; - } - - private FuelBean getFuelBean(Integer fkFuelBean) throws Exception { - for (FuelBean bean : getFuels()) { - if (bean.getPk().equals(fkFuelBean)) { - return bean; - } - } - throw new Exception("bean not found"); - } - - @RolesAllowed("car_user") - @RequestMapping(value = "/secure/do_upsert", method = RequestMethod.POST) - public String getUpsert(Model model, @ModelAttribute FuelBean fuelBean) { - Integer affected = fuelService.upsert(fuelBean); - model.addAttribute("fuelBean", fuelBean); - LOGGER.info("affected rows: {}", affected); - return affected > 0 ? getTable() : getBean(model); - } - - @RolesAllowed("car_user") - @GetMapping("/secure/jsonfuels") - @ResponseBody - public List getJsonFuels() { - List fuels = fuelService.findAll(); - return fuels; - } - - @ModelAttribute("fuels") - public List getFuels() { - if (cachedFuels == null || cachedFuels.size() < 1) { - cachedFuels = fuelService.findAll(); - } - return cachedFuels; - } - - @ModelAttribute("currentUser") - @ResponseBody - public String getCurrentUser() { - return fuelService.getCurrentUser(request); - } - - @ModelAttribute("averagelkm") - @ResponseBody - public BigDecimal getAverageLiterPerKm() { - List fuels = getFuels(); - Integer minMileage = 1000000; // my car won't even reach this milestone :) - Integer maxMileage = 0; - BigDecimal summedAmount = new BigDecimal(0); - for (FuelBean bean : fuels) { - summedAmount = summedAmount.add(bean.getAmount()); - minMileage = bean.getMileage() < minMileage ? bean.getMileage() : minMileage; - maxMileage = bean.getMileage() > maxMileage ? bean.getMileage() : maxMileage; - } - BigDecimal totalMileage = new BigDecimal(maxMileage - minMileage); - BigDecimal calculated = totalMileage.intValue() != 0 - ? new BigDecimal((summedAmount.doubleValue() / totalMileage.doubleValue()) * 100d) - : new BigDecimal(0); - return calculated; - } - - @ModelAttribute("averageel") - @ResponseBody - public BigDecimal getAverageEuroPerLiter() { - List fuels = getFuels(); - BigDecimal summedLiter = new BigDecimal(0); - BigDecimal summedEuro = new BigDecimal(0); - for (FuelBean bean : fuels) { - summedLiter = summedLiter.add(bean.getAmount()); - summedEuro = summedEuro.add(bean.getPrice()); - } - BigDecimal calculated = summedLiter.intValue() != 0 - ? new BigDecimal(summedEuro.doubleValue() / summedLiter.doubleValue()) - : new BigDecimal(0); - return calculated; - } - - @ModelAttribute("chartjsdata") - @ResponseBody - public List getChartjsData() { - List fuels = getFuels(); - List list = new ArrayList<>(); - for (FuelBean bean : fuels) { - list.add(bean.getEuro_per_l()); - } - return list; - } - - @ModelAttribute("chartjslabel") - @ResponseBody - public List getChartjsLabel() { - List fuels = getFuels(); - List list = new ArrayList<>(); - for (FuelBean bean : fuels) { - list.add(bean.getMileage()); - } - return list; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/DailySummaryBean.java b/src/main/old/de/jottyfan/timetrack/modules/done/DailySummaryBean.java deleted file mode 100644 index 3d99e40..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/DailySummaryBean.java +++ /dev/null @@ -1,64 +0,0 @@ -package de.jottyfan.timetrack.modules.done; - -/** - * - * @author henkej - * - */ -public class DailySummaryBean { - private final String projectName; - private final String moduleName; - private final String jobName; - private final String duration; - private final String billingShortcut; - private final String billingCsskey; - private final Double durationHours; - - public DailySummaryBean(String projectName, String moduleName, String jobName, String duration, String billingShortcut, String billingCsskey, Double durationHours) { - super(); - this.projectName = projectName; - this.moduleName = moduleName; - this.jobName = jobName; - this.duration = duration; - this.billingShortcut = billingShortcut; - this.billingCsskey = billingCsskey; - this.durationHours = durationHours; - } - - public String getProjectName() { - return projectName; - } - - public String getModuleName() { - return moduleName; - } - - public String getJobName() { - return jobName; - } - - public String getDuration() { - return duration; - } - - /** - * @return the billing shortcut - */ - public String getBillingShortcut() { - return billingShortcut; - } - - /** - * @return the billing csskey - */ - public String getBillingCsskey() { - return billingCsskey; - } - - /** - * @return the durationHours - */ - public Double getDurationHours() { - return durationHours; - }; -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/DoneControl.java b/src/main/old/de/jottyfan/timetrack/modules/done/DoneControl.java deleted file mode 100644 index 7bf23ef..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/DoneControl.java +++ /dev/null @@ -1,88 +0,0 @@ -package de.jottyfan.timetrack.modules.done; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -import javax.enterprise.context.RequestScoped; -import javax.faces.context.FacesContext; -import javax.inject.Inject; -import javax.inject.Named; - -import de.jooqfaces.JooqFacesContext; -import de.jottyfan.timetrack.help.Navigation; -import de.jottyfan.timetrack.help.Pages; -import de.jottyfan.timetrack.modules.ControlInterface; - -/** - * - * @author henkej - * - */ -@Named -@RequestScoped -public class DoneControl extends Navigation implements ControlInterface, Serializable { - private static final long serialVersionUID = 1L; - - @Inject - @Named("doneModel") - private DoneModel model; - - public String toStart() { - return navigateTo(Pages.START); - } - - public String toList() { - boolean ready = model.init((JooqFacesContext) FacesContext.getCurrentInstance()); - return ready ? navigateTo(Pages.DONE_INIT) : toStart(); - } - - public String toAdd() { - DoneBean bean = new DoneBean(); - bean.setTimeFrom(LocalDateTime.now()); - model.setBean(bean); - boolean ready = model.loadDefaults((JooqFacesContext) FacesContext.getCurrentInstance()); - return ready ? navigateTo(Pages.DONE_ADD) : toList(); - } - - public String toEdit(DoneBean bean) { - model.setBean(bean); - boolean ready = model.loadDefaults((JooqFacesContext) FacesContext.getCurrentInstance()); - return ready ? navigateTo(Pages.DONE_EDIT) : toList(); - } - - public String toDelete(DoneBean bean) { - model.setBean(bean); - return navigateTo(Pages.DONE_DELETE); - } - - public String toRead() { - boolean ready = model.prepareRead((JooqFacesContext) FacesContext.getCurrentInstance()); - return ready ? navigateTo(Pages.DONE_READ) : toStart(); - } - - public String doUpdate() { - boolean ready = model.update((JooqFacesContext) FacesContext.getCurrentInstance()); - return ready ? toList() : toEdit(model.getBean()); - } - - public String doDelete() { - boolean ready = model.delete((JooqFacesContext) FacesContext.getCurrentInstance()); - return ready ? toList() : toDelete(model.getBean()); - } - - public String doAdd() { - boolean ready = model.insert((JooqFacesContext) FacesContext.getCurrentInstance()); - return ready ? toList() : toAdd(); - } - - public String doDownload() { - boolean ready = model.download((JooqFacesContext) FacesContext.getCurrentInstance()); - return ready ? "" : ""; - } - - public String getCurrentTimeAsString() { - DateTimeFormatter hhmmss = DateTimeFormatter.ofPattern("HH:mm:ss"); - return LocalDateTime.now().format(hhmmss); - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/DoneGateway.java b/src/main/old/de/jottyfan/timetrack/modules/done/DoneGateway.java deleted file mode 100644 index 5c4dc37..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/DoneGateway.java +++ /dev/null @@ -1,495 +0,0 @@ -package de.jottyfan.timetrack.modules.done; - -import static de.jottyfan.timetrack.db.done.Tables.T_BILLING; -import static de.jottyfan.timetrack.db.done.Tables.T_DONE; -import static de.jottyfan.timetrack.db.done.Tables.T_JOB; -import static de.jottyfan.timetrack.db.done.Tables.T_MODULE; -import static de.jottyfan.timetrack.db.done.Tables.T_PROJECT; -import static de.jottyfan.timetrack.db.done.Tables.V_HAMSTERSUMMARY; -import static de.jottyfan.timetrack.db.done.Tables.V_TOTALOFDAY; -import static de.jottyfan.timetrack.db.done.Tables.V_WORKTIME; -import static de.jottyfan.timetrack.db.profile.Tables.T_LOGIN; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.sql.SQLException; -import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.jooq.CloseableDSLContext; -import org.jooq.DeleteConditionStep; -import org.jooq.InsertValuesStep7; -import org.jooq.Record; -import org.jooq.Record3; -import org.jooq.Record4; -import org.jooq.Record5; -import org.jooq.Record7; -import org.jooq.SelectConditionStep; -import org.jooq.SelectJoinStep; -import org.jooq.SelectWhereStep; -import org.jooq.UpdateConditionStep; -import org.jooq.exception.DataAccessException; - -import de.jooqfaces.JooqFacesContext; -import de.jottyfan.timetrack.db.done.tables.records.TBillingRecord; -import de.jottyfan.timetrack.db.done.tables.records.TDoneRecord; -import de.jottyfan.timetrack.db.done.tables.records.TJobRecord; -import de.jottyfan.timetrack.db.done.tables.records.TModuleRecord; -import de.jottyfan.timetrack.db.done.tables.records.TProjectRecord; -import de.jottyfan.timetrack.modules.JooqGateway; -import de.jottyfan.timetrack.modules.done.fullcalendar.ColorfulFCEventBean; -import de.jottyfan.timetrack.modules.done.fullcalendar.FCEventList; - -/** - * - * @author henkej - * - */ -public class DoneGateway extends JooqGateway { - private final static Logger LOGGER = LogManager.getLogger(DoneGateway.class); - private final Integer requested; - - public DoneGateway(JooqFacesContext facesContext) { - super(facesContext); - String dailyMinutes = facesContext.getExternalContext().getInitParameter("requestedDailyMinutes"); - this.requested = dailyMinutes == null ? 480 : Integer.valueOf(dailyMinutes); // defaults to 8 hours/day - } - - /** - * get all modules from db - * - * @return modules - * @throws SQLException - * @throws ClassNotFoundException - */ - public List getAllModules() throws DataAccessException, ClassNotFoundException, SQLException { - try (CloseableDSLContext jooq = getJooq()) { - List list = new ArrayList<>(); - SelectWhereStep sql = jooq.selectFrom(T_MODULE); - LOGGER.debug(sql.toString()); - for (TModuleRecord r : sql.fetch()) { - list.add(r); - } - list.sort((o1, o2) -> o1 == null || o2 == null || o1.getName() == null || o2.getName() == null ? 0 - : o1.getName().compareTo(o2.getName())); - return list; - } - } - - /** - * get all activities from db - * - * @return activities - * @throws SQLException - * @throws ClassNotFoundException - */ - public List getAllActivities() throws DataAccessException, ClassNotFoundException, SQLException { - try (CloseableDSLContext jooq = getJooq()) { - List list = new ArrayList<>(); - SelectWhereStep sql = jooq.selectFrom(T_JOB); - LOGGER.debug(sql.toString()); - for (TJobRecord r : sql.fetch()) { - list.add(r); - } - list.sort((o1, o2) -> o1 == null || o2 == null || o1.getName() == null || o2.getName() == null ? 0 - : o1.getName().compareTo(o2.getName())); - return list; - } - } - - /** - * get all projects from db - * - * @return projects - * @throws SQLException - * @throws ClassNotFoundException - */ - public List getAllProjects() throws DataAccessException, ClassNotFoundException, SQLException { - try (CloseableDSLContext jooq = getJooq()) { - List list = new ArrayList<>(); - SelectWhereStep sql = jooq.selectFrom(T_PROJECT); - LOGGER.debug(sql.toString()); - for (TProjectRecord r : sql.fetch()) { - list.add(r); - } - list.sort((o1, o2) -> o1 == null || o2 == null || o1.getName() == null || o2.getName() == null ? 0 - : o1.getName().compareTo(o2.getName())); - return list; - } - } - - /** - * get all billings from db - * - * @return billings - * @throws SQLException - * @throws ClassNotFoundException - */ - public List getAllBillings() throws DataAccessException, ClassNotFoundException, SQLException { - try (CloseableDSLContext jooq = getJooq()) { - List list = new ArrayList<>(); - SelectWhereStep sql = jooq.selectFrom(T_BILLING); - LOGGER.debug(sql.toString()); - for (TBillingRecord r : sql.fetch()) { - list.add(r); - } - list.sort((o1, o2) -> o1 == null || o2 == null || o1.getName() == null || o2.getName() == null ? 0 - : o1.getName().compareTo(o2.getName())); - return list; - } - } - - private Map generateProjectMap(List list) { - Map map = new HashMap<>(); - for (TProjectRecord r : list) { - map.put(r.getPk(), r); - } - return map; - } - - private Map generateModuleMap(List list) { - Map map = new HashMap<>(); - for (TModuleRecord r : list) { - map.put(r.getPk(), r); - } - return map; - } - - private Map generateJobMap(List list) { - Map map = new HashMap<>(); - for (TJobRecord r : list) { - map.put(r.getPk(), r); - } - return map; - } - - private Map generateBillingMap(List list) { - Map map = new HashMap<>(); - for (TBillingRecord r : list) { - map.put(r.getPk(), r); - } - return map; - } - - /** - * get all from t_done of the given day - * - * @param day the day; if null, the current date is used - * - * @return a list of found times, an empty one at least - * @throws SQLException - * @throws ClassNotFoundException - */ - public List getAll(LocalDateTime day) throws DataAccessException, ClassNotFoundException, SQLException { - Map projectMap = generateProjectMap(getAllProjects()); - Map moduleMap = generateModuleMap(getAllModules()); - Map jobMap = generateJobMap(getAllActivities()); - Map billingMap = generateBillingMap(getAllBillings()); - - if (day == null) { - day = LocalDateTime.now(); - } - LocalDateTime yesterday = day.minusDays(1).withHour(23).withMinute(0).withSecond(0).withNano(0); - LocalDateTime tomorrow = day.plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0); - - List list = new ArrayList<>(); - try (CloseableDSLContext jooq = getJooq()) { - SelectConditionStep sql = getJooq() - // @formatter:off - .selectFrom(T_DONE) - .where(T_DONE.FK_LOGIN.eq(getFkLogin())) - .and(T_DONE.TIME_FROM.isNull() - .or(T_DONE.TIME_FROM.greaterThan(yesterday) - .and(T_DONE.TIME_FROM.lessThan(tomorrow)))) - .and(T_DONE.TIME_UNTIL.isNull() - .or(T_DONE.TIME_UNTIL.lessThan(tomorrow) - .and(T_DONE.TIME_UNTIL.greaterThan(yesterday)))); - // @formatter:on - LOGGER.debug(sql.toString()); - for (TDoneRecord r : sql.fetch()) { - list.add(new DoneBean(r, projectMap, moduleMap, jobMap, billingMap)); - } - } - list.sort((o1, o2) -> o1 == null || o2 == null ? 0 : o1.compareTo(o2)); - return list; - } - - /** - * insert data into t_done - * - * @param bean - * @throws SQLException - * @throws ClassNotFoundException - */ - public void insert(DoneBean bean) throws DataAccessException, ClassNotFoundException, SQLException { - Integer fkProject = bean.getProject() == null ? null : bean.getProject().getPk(); - Integer fkModule = bean.getModule() == null ? null : bean.getModule().getPk(); - Integer fkJob = bean.getActivity() == null ? null : bean.getActivity().getPk(); - Integer fkBilling = bean.getBilling() == null ? null : bean.getBilling().getPk(); - Integer fkLogin = getFkLogin(); - - try (CloseableDSLContext jooq = getJooq()) { - InsertValuesStep7 sql = jooq - // @formatter:off - .insertInto(T_DONE, - T_DONE.TIME_FROM, - T_DONE.TIME_UNTIL, - T_DONE.FK_PROJECT, - T_DONE.FK_MODULE, - T_DONE.FK_JOB, - T_DONE.FK_BILLING, - T_DONE.FK_LOGIN) - .values(bean.getTimeFrom(), bean.getTimeUntil(), fkProject, fkModule, fkJob, fkBilling, fkLogin); - // @formatter:on - LOGGER.debug(sql.toString()); - sql.execute(); - } - } - - /** - * update bean in t_done - * - * @param bean - * @throws SQLException - * @throws ClassNotFoundException - */ - public void update(DoneBean bean) throws DataAccessException, ClassNotFoundException, SQLException { - try (CloseableDSLContext jooq = getJooq()) { - UpdateConditionStep sql = jooq - // @formatter:off - .update(T_DONE) - .set(T_DONE.TIME_FROM, bean.getTimeFrom()) - .set(T_DONE.TIME_UNTIL, bean.getTimeUntil()) - .set(T_DONE.FK_PROJECT, bean.getProject() == null ? null : bean.getProject().getPk()) - .set(T_DONE.FK_JOB, bean.getActivity() == null ? null : bean.getActivity().getPk()) - .set(T_DONE.FK_MODULE, bean.getModule() == null ? null : bean.getModule().getPk()) - .set(T_DONE.FK_BILLING, bean.getBilling() == null ? null : bean.getBilling().getPk()) - .where(T_DONE.PK.eq(bean.getPk())); - // @formatter:on - LOGGER.debug(sql.toString()); - sql.execute(); - } - } - - /** - * delete bean from t_done - * - * @param bean - * @throws SQLException - * @throws ClassNotFoundException - */ - public void delete(DoneBean bean) throws DataAccessException, ClassNotFoundException, SQLException { - try (CloseableDSLContext jooq = getJooq()) { - DeleteConditionStep sql = jooq.deleteFrom(T_DONE).where(T_DONE.PK.eq(bean.getPk())); - LOGGER.debug(sql.toString()); - sql.execute(); - } - } - - /** - * get day summary - * - * @param day the day - * @return the day summary if found, an empty map otherwise - * @throws SQLException - * @throws ClassNotFoundException - * @throws DataAccessException - */ - public WholeDaySummaryBean getDaySummary(java.util.Date day) - throws DataAccessException, ClassNotFoundException, SQLException { - try (CloseableDSLContext jooq = getJooq()) { - SelectConditionStep> sql = jooq - // @formatter:off - .select(V_TOTALOFDAY.STARTTIME, - V_TOTALOFDAY.ENDTIME, - V_TOTALOFDAY.WORKTIME, - V_TOTALOFDAY.BREAKTIME) - .from(V_TOTALOFDAY) - .where(V_TOTALOFDAY.DAY.eq(new SimpleDateFormat("yyyy-MM-dd").format(day))) - .and(V_TOTALOFDAY.FK_LOGIN.eq(getFkLogin())); - // @formatter:on - LOGGER.debug(sql.toString()); - Record r = sql.fetchOne(); - if (r != null) { - String startTime = r.get(V_TOTALOFDAY.STARTTIME); - String endTime = r.get(V_TOTALOFDAY.ENDTIME); - String workTime = r.get(V_TOTALOFDAY.WORKTIME); - String breakTime = r.get(V_TOTALOFDAY.BREAKTIME); - return new WholeDaySummaryBean(startTime, endTime, workTime, breakTime, requested); - } - return new WholeDaySummaryBean("", "", "", "", requested); - } - } - - /** - * get all jobs of day - * - * @param day the day - * @return list of found jobs; an empty list at least - * @throws SQLException - * @throws ClassNotFoundException - * @throws DataAccessException - */ - public List getAllJobs(java.util.Date day) - throws DataAccessException, ClassNotFoundException, SQLException { - try (CloseableDSLContext jooq = getJooq()) { - SelectConditionStep> sql = jooq - // @formatter:off - .select(V_WORKTIME.DURATION, - V_WORKTIME.DURATION_HOURS, - V_WORKTIME.PROJECT_NAME, - V_WORKTIME.MODULE_NAME, - V_WORKTIME.JOB_NAME, - V_WORKTIME.BILLING_SHORTCUT, - V_WORKTIME.BILLING_CSSKEY) - .from(V_WORKTIME) - .where(V_WORKTIME.DAY.eq(new SimpleDateFormat("yyyy-MM-dd").format(day))) - .and(V_WORKTIME.FK_LOGIN.eq(getFkLogin())); - // @formatter:on - LOGGER.debug(sql.toString()); - List list = new ArrayList<>(); - for (Record7 r : sql.fetch()) { - String duration = r.get(V_WORKTIME.DURATION); - Double durationHours = r.get(V_WORKTIME.DURATION_HOURS); - String projectName = r.get(V_WORKTIME.PROJECT_NAME); - String moduleName = r.get(V_WORKTIME.MODULE_NAME); - String jobName = r.get(V_WORKTIME.JOB_NAME); - String billingShortcut = r.get(V_WORKTIME.BILLING_SHORTCUT); - String billingCsskey = r.get(V_WORKTIME.BILLING_CSSKEY); - durationHours = durationHours == null ? null - : new BigDecimal(durationHours).setScale(2, RoundingMode.HALF_UP).doubleValue(); - list.add(new DailySummaryBean(projectName, moduleName, jobName, duration, billingShortcut, billingCsskey, - durationHours)); - } - return list; - } - } - - /** - * get json representation of all calendar events of user - * - * @return - * @throws SQLException - * @throws ClassNotFoundException - * @throws DataAccessException - */ - public String getAllCalendarEvents() throws DataAccessException, ClassNotFoundException, SQLException { - try (CloseableDSLContext jooq = getJooq()) { - SelectConditionStep> sql = jooq - // @formatter:off - .select(T_DONE.TIME_FROM, - T_DONE.TIME_UNTIL, - T_PROJECT.NAME, - T_MODULE.NAME, - T_JOB.NAME, - T_BILLING.CSSKEY, - T_BILLING.SHORTCUT) - .from(T_DONE) - .leftJoin(T_PROJECT).on(T_PROJECT.PK.eq(T_DONE.FK_PROJECT)) - .leftJoin(T_MODULE).on(T_MODULE.PK.eq(T_DONE.FK_MODULE)) - .leftJoin(T_JOB).on(T_JOB.PK.eq(T_DONE.FK_JOB)) - .leftJoin(T_BILLING).on(T_BILLING.PK.eq(T_DONE.FK_BILLING)) - .where(T_DONE.FK_LOGIN.eq(getFkLogin())); - // @formatter:on - LOGGER.debug(sql.toString()); - FCEventList list = new FCEventList(); - for (Record r : sql.fetch()) { - String projectName = r.get(T_PROJECT.NAME); - String moduleName = r.get(T_MODULE.NAME); - String jobName = r.get(T_JOB.NAME); - LocalDateTime timeFrom = r.get(T_DONE.TIME_FROM); - LocalDateTime timeUntil = r.get(T_DONE.TIME_UNTIL); - String cssKey = r.get(T_BILLING.CSSKEY); - String shortcut = r.get(T_BILLING.SHORTCUT); - - StringBuilder buf = new StringBuilder(); - buf.append(projectName); - buf.append(", "); - buf.append(moduleName); - buf.append(": "); - buf.append(jobName); - - Date theDate = Date.from(timeFrom.atZone(ZoneId.systemDefault()).toInstant()); - - ColorfulFCEventBean bean = new ColorfulFCEventBean(buf.toString(), - theDate, new RgbColor().determineTextcolorFromCssKey(cssKey)); - bean.setProject(projectName); - bean.setModule(moduleName); - bean.setJob(jobName); - bean.setBilling(shortcut); - Date endDate = timeUntil == null ? null : Date.from(timeUntil.atZone(ZoneId.systemDefault()).toInstant()); - bean.setEnd(endDate); - if (cssKey != null && !cssKey.isBlank()) { - bean.setColor(new RgbColor().determineColorFromCssKey(cssKey)); - } else { - bean.setColor(new RgbColor().determineRgbColor(projectName, moduleName, jobName)); - } - list.getList().add(bean); - } - return list.toJson(); - } - } - - public List getAllUsers() throws DataAccessException, ClassNotFoundException, SQLException { - List list = new ArrayList<>(); - try (CloseableDSLContext jooq = getJooq()) { - SelectJoinStep> sql = jooq - // @formatter:off - .select(T_LOGIN.LOGIN, - T_LOGIN.FORENAME, - T_LOGIN.SURNAME) - .from(T_LOGIN); - // @formatter:on - LOGGER.debug(sql.toString()); - for (Record r : sql.fetch()) { - String username = r.get(T_LOGIN.LOGIN); - String forename = r.get(T_LOGIN.FORENAME); - String surname = r.get(T_LOGIN.SURNAME); - list.add(new UserBean(username, forename, surname)); - } - } - return list; - } - - public String download(DownloadBean bean) throws DataAccessException, ClassNotFoundException, SQLException { - StringBuilder buf = new StringBuilder(); - try (CloseableDSLContext jooq = getJooq()) { - SelectConditionStep> sql = jooq - // @formatter:off - .select(V_HAMSTERSUMMARY.WORKDAY, - V_HAMSTERSUMMARY.DURATION, - V_HAMSTERSUMMARY.PROJECT_NAME, - V_HAMSTERSUMMARY.MODULE_NAME, - V_HAMSTERSUMMARY.JOB_NAME) - .from(V_HAMSTERSUMMARY) - .where(V_HAMSTERSUMMARY.LOGIN.eq(bean.getUsername())) - .and(V_HAMSTERSUMMARY.WORKDAY.le(bean.getUntilDate()) - .and(V_HAMSTERSUMMARY.WORKDAY.ge(bean.getFromDate()))); - // @formatter:on - LOGGER.debug(sql.toString()); - String sep = ";"; - buf.append("day").append(sep).append("duration").append(sep).append("project").append(sep).append("module") - .append(sep).append("activity\n"); - for (Record r : sql.fetch()) { - LocalDate workday = r.get(V_HAMSTERSUMMARY.WORKDAY); - String date = workday.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")); - buf.append(date).append(sep); - buf.append(r.get(V_HAMSTERSUMMARY.DURATION)).append(sep); - buf.append(r.get(V_HAMSTERSUMMARY.PROJECT_NAME)).append(sep); - buf.append(r.get(V_HAMSTERSUMMARY.MODULE_NAME)).append(sep); - buf.append(r.get(V_HAMSTERSUMMARY.JOB_NAME)).append("\n"); - } - } - return buf.toString(); - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/DoneModel.java b/src/main/old/de/jottyfan/timetrack/modules/done/DoneModel.java deleted file mode 100644 index e9a3526..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/DoneModel.java +++ /dev/null @@ -1,345 +0,0 @@ -package de.jottyfan.timetrack.modules.done; - -import java.io.IOException; -import java.io.Serializable; -import java.sql.SQLException; -import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.TimeZone; - -import javax.enterprise.context.SessionScoped; -import javax.faces.application.FacesMessage; -import javax.inject.Named; - -import org.jooq.exception.DataAccessException; - -import de.jooqfaces.JooqFacesContext; -import de.jottyfan.timetrack.db.done.tables.records.TBillingRecord; -import de.jottyfan.timetrack.db.done.tables.records.TJobRecord; -import de.jottyfan.timetrack.db.done.tables.records.TModuleRecord; -import de.jottyfan.timetrack.db.done.tables.records.TProjectRecord; -import de.jottyfan.timetrack.modules.Model; - -/** - * - * @author henkej - * - */ -@Named -@SessionScoped -public class DoneModel implements Model, Serializable { - private static final long serialVersionUID = 1L; - - private DoneBean bean; - private List beans; - private List projects; - private List modules; - private List activities; - private List billings; - private List times; - private List allJobs; - private WholeDaySummaryBean daySummary; - private java.util.Date day; - private String calendarEvents; - private List users; - private DownloadBean downloadBean; - - public boolean init(JooqFacesContext facesContext) { - try { - day = day == null ? new java.util.Date() : day; - beans = getAllOfDay(facesContext, day); - DoneGateway gw = new DoneGateway(facesContext); - modules = gw.getAllModules(); - activities = gw.getAllActivities(); - projects = gw.getAllProjects(); - billings = gw.getAllBillings(); - daySummary = gw.getDaySummary(day); - allJobs = gw.getAllJobs(day); - calendarEvents = gw.getAllCalendarEvents(); - return true; - } catch (DataAccessException | ClassNotFoundException | SQLException e) { - facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "error", e.getMessage())); - return false; - } - } - - public boolean loadDefaults(JooqFacesContext facesContext) { - try { - defineTimes(); - return true; - } catch (DataAccessException e) { - facesContext.addMessage(null, - new FacesMessage(FacesMessage.SEVERITY_ERROR, "error loading defaults", e.getMessage())); - return false; - } - } - - public boolean prepareRead(JooqFacesContext facesContext) { - try { - users = new DoneGateway(facesContext).getAllUsers(); - downloadBean = new DownloadBean(); - downloadBean.setFromDate(LocalDate.of(LocalDate.now().getYear(), 1, 1)); - downloadBean.setUntilDate(LocalDate.now()); - return true; - } catch (DataAccessException | ClassNotFoundException | SQLException e) { - facesContext.addMessage(null, - new FacesMessage(FacesMessage.SEVERITY_ERROR, "error loading defaults", e.getMessage())); - return false; - } - } - - private void defineTimes() { - times = new ArrayList<>(); - Integer currentHour = getCurrentTime().get(GregorianCalendar.HOUR_OF_DAY); - Integer currentMinute = getCurrentTime().get(GregorianCalendar.MINUTE); - if (currentMinute < 15) { - currentMinute = 0; - } else if (currentMinute < 30) { - currentMinute = 15; - } else if (currentMinute < 45) { - currentMinute = 30; - } else { - currentMinute = 45; - } - times.add(new TimeBean(defineNewTime(currentHour, currentMinute - 120), "link")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute - 105), "link")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute - 90), "link")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute - 75), "link")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute - 60), "link")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute - 45), "link")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute - 30), "link")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute - 15), "link")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute), "default")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute + 15), "default")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute + 30), "link")); - times.add(new TimeBean(defineNewTime(currentHour, currentMinute + 45), "link")); - } - - /** - * summarizes the billings in horizon2020 notation - * - * @return the billings summary - */ - public String getSummaryBilling() { - Map map = new HashMap<>(); - for (DailySummaryBean bean : getAllJobs()) { - String shortcut = bean.getBillingShortcut(); - Double time = bean.getDurationHours(); - Double sumTime = map.get(shortcut); - sumTime = sumTime == null ? time : (sumTime + time); - map.put(shortcut, sumTime); - } - StringBuilder buf = new StringBuilder(); - boolean first = true; - for (Entry entry : map.entrySet()) { - buf.append(first ? "" : ", "); - String key = entry.getKey(); - if (key == null || key.equals("null")) { - buf.append("$ "); - } else { - buf.append(entry.getKey()).append(" "); - } - buf.append("(").append(entry.getValue()).append(")"); - first = false; - } - return buf.toString(); - } - - /** - * summarizes the time of a days work in commaseparated values - * - * @return the summarized times - */ - public String getSummaryTime() { - Double sum = 0d; - for (DailySummaryBean bean : getAllJobs()) { - sum += bean.getDurationHours(); - } - return sum.toString(); - } - - private Calendar getCurrentTime() { - return new GregorianCalendar(TimeZone.getTimeZone("Europe/Berlin")); - } - - private Calendar defineNewTime(Integer hours, Integer minutes) { - Calendar cal = new GregorianCalendar(); - if (minutes < 0) { - hours--; - minutes += 60; - } else if (minutes > 59) { - hours++; - minutes -= 60; - } - cal.set(0, 0, 0, hours, minutes, 0); - return cal; - } - - /** - * get all entries of t_done - * - * @param facesContext - * @param day - * the day to look up for - * @param login - * the user to look up for - * @return all entries - * @throws SQLException - * @throws ClassNotFoundException - */ - private List getAllOfDay(JooqFacesContext facesContext, Date day) - throws DataAccessException, ClassNotFoundException, SQLException { - LocalDateTime ldt = day.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); - return new DoneGateway(facesContext).getAll(ldt); - } - - public boolean insert(JooqFacesContext facesContext) { - try { - bean.setDay(day); - new DoneGateway(facesContext).insert(bean); - return true; - } catch (DataAccessException | ClassNotFoundException | SQLException e) { - facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "error", e.getMessage())); - return false; - } - } - - public boolean update(JooqFacesContext facesContext) { - try { - // day contains the correct date; with that, refresh the current date after possibly changing the day - bean.setDay(day); - new DoneGateway(facesContext).update(bean); - return true; - } catch (DataAccessException | ClassNotFoundException | SQLException e) { - facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "error", e.getMessage())); - return false; - } - } - - public boolean delete(JooqFacesContext facesContext) { - try { - new DoneGateway(facesContext).delete(bean); - return true; - } catch (DataAccessException | ClassNotFoundException | SQLException e) { - facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "error", e.getMessage())); - return false; - } - } - - public boolean download(JooqFacesContext facesContext) { - try { - String csvContent = new DoneGateway(facesContext).download(downloadBean); - facesContext.getExternalContext().responseReset(); - facesContext.getExternalContext().setResponseContentType("text/csv"); - facesContext.getExternalContext().setResponseHeader("Content-Disposition", "attachment; filename=\"worktime.csv\""); - facesContext.getExternalContext().getResponseOutputWriter().append(csvContent); - facesContext.responseComplete(); - return true; - } catch (DataAccessException | ClassNotFoundException | SQLException | IOException e) { - facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "error", e.getMessage())); - return false; - } - } - - public String getAttach() { - StringBuilder buf = new StringBuilder(); - String thatday = new SimpleDateFormat("dd.MM.yyyy").format(day); - for (DailySummaryBean sdb : allJobs) { - buf.append(thatday).append("\t"); - buf.append(sdb.getDuration()).append("\t"); - buf.append(sdb.getProjectName()); - if (sdb.getBillingShortcut() != null && !sdb.getBillingShortcut().isBlank()) { - buf.append(" (").append(sdb.getBillingShortcut()).append(")"); - } - buf.append("\t"); - buf.append(sdb.getModuleName()).append("\t"); - buf.append(sdb.getJobName()).append("\t"); - buf.append("\n"); - } - return buf.toString(); - } - - public String getDayIso8601() { - return day == null ? "" : new SimpleDateFormat("yyyy-MM-dd").format(day); - } - - public void setBean(DoneBean bean) { - this.bean = bean; - } - - public DoneBean getBean() { - return bean; - } - - public List getProjects() { - return projects; - } - - public List getModules() { - return modules; - } - - public List getActivities() { - return activities; - } - - public List getBillings() { - return billings; - } - - public List getAllJobs() { - return allJobs; - } - - public WholeDaySummaryBean getDaySummary() { - return daySummary; - } - - public List getBeans() { - return beans; - } - - public List getTimes() { - return times; - } - - public String getGermanFormattedDay() { - return day == null ? "null" : new SimpleDateFormat("EEEE, dd.MMMM yyyy").format(day); - } - - public Date getDay() { - return day; - } - - public void setDay(Date day) { - this.day = day; - } - - public String getCalendarEvents() { - return calendarEvents; - } - - /** - * @return the users - */ - public List getUsers() { - return users; - } - - /** - * @return the downloadBean - */ - public DownloadBean getDownloadBean() { - return downloadBean; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/DownloadBean.java b/src/main/old/de/jottyfan/timetrack/modules/done/DownloadBean.java deleted file mode 100644 index b0732f1..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/DownloadBean.java +++ /dev/null @@ -1,61 +0,0 @@ -package de.jottyfan.timetrack.modules.done; - -import java.io.Serializable; -import java.time.LocalDate; - -/** - * - * @author jotty - * - */ -public class DownloadBean implements Serializable { - private static final long serialVersionUID = 1L; - - private String username; - private LocalDate fromDate; - private LocalDate untilDate; - - /** - * @return the fromDate - */ - public LocalDate getFromDate() { - return fromDate; - } - - /** - * @param fromDate - * the fromDate to set - */ - public void setFromDate(LocalDate fromDate) { - this.fromDate = fromDate; - } - - /** - * @return the untilDate - */ - public LocalDate getUntilDate() { - return untilDate; - } - - /** - * @param untilDate - * the untilDate to set - */ - public void setUntilDate(LocalDate untilDate) { - this.untilDate = untilDate; - } - - /** - * @return the username - */ - public String getUsername() { - return username; - } - - /** - * @param username the username to set - */ - public void setUsername(String username) { - this.username = username; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/RgbColor.java b/src/main/old/de/jottyfan/timetrack/modules/done/RgbColor.java deleted file mode 100644 index 28eadfc..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/RgbColor.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.jottyfan.timetrack.modules.done; - -import java.awt.Color; -import java.util.HashMap; -import java.util.Map; - -/** - * - * @author henkej - * - */ -public class RgbColor { - - /** - * find a rgb color code for the combination of the given params - * - * @param bigInfluence - * @param mediumInfluence - * @param littleInfluence - * @return the hex color code - */ - public String determineRgbColor(String bigInfluence, String mediumInfluence, String littleInfluence) { - int big = bigInfluence == null ? 0 : bigInfluence.hashCode(); - int med = mediumInfluence == null ? 0 : mediumInfluence.hashCode(); - int lit = littleInfluence == null ? 0 : littleInfluence.hashCode(); - - float bI = (1f / String.valueOf(big).length()); - float mI = (0.5f / String.valueOf(med).length()); - float lI = (0.25f / String.valueOf(lit).length()); - - float r = 0.0f + bI + mI + lI; // + makes it brighter - float g = 0.5f - bI - mI - lI; // - makes it darker - float b = 0.5f - bI - mI - lI; - - r = r < 0 ? r * -1 : r; - r = r > 1.0f ? 1 / r : r; - g = g < 0 ? g * -1 : g; - g = g > 1.0f ? 1 / g : g; - b = b < 0 ? b * -1 : b; - b = b > 1.0f ? 1 / b : b; - - Color c = new Color(r, g, b); - return new StringBuilder("rgb(").append(c.getRed()).append(",").append(c.getGreen()).append(",").append(c.getBlue()) - .append(")").toString(); - } - - /** - * find the corresponding rgb color for the css key - * @param cssKey the key - * @return the hex color code - */ - public String determineColorFromCssKey(String cssKey) { - // for now, only map the css key to a defined list - Map map = new HashMap<>(); - map.put("TA3", "rgb(0, 255, 0)"); - map.put("WP2", "rgb(192, 192, 0)"); - map.put("WP4", "rgb(32, 192, 255)"); - map.put("WP5", "rgb(255, 0, 0)"); - return map.get(cssKey); - } - - public String determineTextcolorFromCssKey(String cssKey) { - Map map = new HashMap<>(); - map.put("TA3", "rgb(0, 0, 0)"); - map.put("WP2", "rgb(0, 0, 0)"); - map.put("WP4", "rgb(0, 0, 0)"); - map.put("WP5", "rgb(0, 0, 0)"); - String value = map.get(cssKey); - return value == null ? "rgb(255, 255, 255)" : value; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/TimeBean.java b/src/main/old/de/jottyfan/timetrack/modules/done/TimeBean.java deleted file mode 100644 index 00c211a..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/TimeBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.jottyfan.timetrack.modules.done; - -import java.text.SimpleDateFormat; -import java.util.Calendar; - -/** - * - * @author henkej - * - */ -public class TimeBean { - private final String value; - private final String look; - - public TimeBean(String value, String look) { - super(); - this.value = value; - this.look = look; - } - - public TimeBean(Calendar calendar, String look) { - this(new SimpleDateFormat("HH:mm").format(calendar.getTime()), look); - } - - public String getValue() { - return value; - } - - public String getLook() { - return look; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/UserBean.java b/src/main/old/de/jottyfan/timetrack/modules/done/UserBean.java deleted file mode 100644 index fa00222..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/UserBean.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.jottyfan.timetrack.modules.done; - -import java.io.Serializable; - -/** - * - * @author jotty - * - */ -public class UserBean implements Serializable { - private static final long serialVersionUID = 1L; - - private final String username; - private final String forename; - private final String surname; - - public UserBean(String username, String forename, String surname) { - super(); - this.username = username; - this.forename = forename; - this.surname = surname; - } - - /** - * @return the forename - */ - public String getForename() { - return forename; - } - - /** - * @return the surname - */ - public String getSurname() { - return surname; - } - - /** - * @return the username - */ - public String getUsername() { - return username; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/WholeDaySummaryBean.java b/src/main/old/de/jottyfan/timetrack/modules/done/WholeDaySummaryBean.java deleted file mode 100644 index e63a1d4..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/WholeDaySummaryBean.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.jottyfan.timetrack.modules.done; - -/** - * - * @author henkej - * - */ -public class WholeDaySummaryBean { - private final String startTime; - private final String endTime; - private final String workTime; - private final String breakTime; - private final Integer dayrequests; - - public WholeDaySummaryBean(String startTime, String endTime, String workTime, String breakTime, Integer dayrequests) { - super(); - this.startTime = startTime; - this.endTime = endTime; - this.workTime = workTime; - this.breakTime = breakTime; - this.dayrequests = dayrequests == null ? 468 : dayrequests; // 7:48 by default - } - - public String getOvertime() { - if (workTime != null && !workTime.trim().isEmpty() && workTime.contains(":")) { - try { - Integer hours = Integer.valueOf(workTime.substring(0, workTime.indexOf(":"))); - Integer minutes = Integer.valueOf(workTime.substring(workTime.indexOf(":") + 1)); - Integer wholeMinutes = hours * 60 + minutes; - Integer overtime = wholeMinutes - dayrequests; - Integer overtimeHours = overtime / 60; - Integer overtimeMinutes = overtime % 60; - StringBuilder buf = new StringBuilder(); - if (overtime < 0) { - buf.append("-"); - overtimeHours *= -1; - overtimeMinutes *= -1; - } - buf.append(String.format("%02d", overtimeHours)); - buf.append(":"); - buf.append(String.format("%02d", overtimeMinutes)); - return buf.toString(); - } catch (NumberFormatException e) { - return ""; - } - } - Integer requestHours = dayrequests / 60; - Integer requestMinutes = dayrequests % 60; - StringBuilder buf = new StringBuilder("-"); - buf.append(requestHours < 10 ? "0" : "").append(requestHours); - buf.append(":"); - buf.append(requestMinutes < 10 ? "0" : "").append(requestMinutes); - return buf.toString(); - } - - public String getStartTime() { - return startTime; - } - - public String getEndTime() { - return endTime; - } - - public String getWorkTime() { - return workTime; - } - - public String getBreakTime() { - return breakTime; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/ColorfulFCEventBean.java b/src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/ColorfulFCEventBean.java deleted file mode 100644 index dd058ec..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/ColorfulFCEventBean.java +++ /dev/null @@ -1,89 +0,0 @@ -package de.jottyfan.timetrack.modules.done.fullcalendar; - -import java.util.Date; - -/** - * - * @author henkej - * - */ -public class ColorfulFCEventBean extends FCEventBean { - private static final long serialVersionUID = 1L; - private final String textColor; - private String billing; - private String project; - private String module; - private String job; - - public ColorfulFCEventBean(String title, Date start, String textColor) { - super(title, start); - this.textColor = textColor; - } - - @Override - public String getExtendedFields() { - StringBuilder buf = new StringBuilder(); - addParam(buf, "textColor", textColor); - addParam(buf, "billing", billing); - addParam(buf, "project", project); - addParam(buf, "module", module); - addParam(buf, "job", job); - return buf.toString(); - } - - /** - * @return the billing - */ - public String getBilling() { - return billing; - } - - /** - * @param billing the billing to set - */ - public void setBilling(String billing) { - this.billing = billing; - } - - /** - * @return the project - */ - public String getProject() { - return project; - } - - /** - * @param project the project to set - */ - public void setProject(String project) { - this.project = project; - } - - /** - * @return the module - */ - public String getModule() { - return module; - } - - /** - * @param module the module to set - */ - public void setModule(String module) { - this.module = module; - } - - /** - * @return the job - */ - public String getJob() { - return job; - } - - /** - * @param job the job to set - */ - public void setJob(String job) { - this.job = job; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/FCEventBean.java b/src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/FCEventBean.java deleted file mode 100644 index f6203ab..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/FCEventBean.java +++ /dev/null @@ -1,198 +0,0 @@ -package de.jottyfan.timetrack.modules.done.fullcalendar; - -import java.io.Serializable; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; - -/** - * - * @author henkej - * - */ -public abstract class FCEventBean implements Serializable { - private static final long serialVersionUID = 1L; - - private String title; - private Boolean allDay; - private Date start; - private Date end; - private Boolean editable; - private Boolean startEditable; - private Boolean durationEditable; - private String color; - private String url; - - public FCEventBean(String title, Date start) { - super(); - this.title = title; - this.start = start; - } - - protected String toJavascriptDate(Date date){ - if (date == null) { - return null; - } - StringBuilder buf = new StringBuilder("new Date("); - Calendar cal = new GregorianCalendar(); - cal.setTime(date); - buf.append(cal.get(Calendar.YEAR)).append(","); - buf.append(cal.get(Calendar.MONTH)).append(","); - buf.append(cal.get(Calendar.DAY_OF_MONTH)).append(","); - buf.append(cal.get(Calendar.HOUR_OF_DAY)).append(","); - buf.append(cal.get(Calendar.MINUTE)).append(","); - buf.append(cal.get(Calendar.SECOND)); - buf.append(")"); - return buf.toString(); - } - - /** - * get extended fields to json string - */ - public abstract String getExtendedFields(); - - /** - * adds a param to buf if value is not null - * - * @param buf the buffer - * @param name the name - * @param value the value - * @param encapsulate if true, encapsulate value by ' - * @param appendComma if true, append a comma - */ - public void addParam(StringBuilder buf, String name, String value, boolean encapsulate, boolean appendComma) { - if (value != null) { - buf.append(name).append(":"); - buf.append(encapsulate ? "'" : "").append(value).append(encapsulate ? "'" : ""); - buf.append(appendComma ? "," : ""); - } - } - - /** - * adds a param to buf if value is not null and append a comma - * - * @param buf the buffer - * @param name the name - * @param value the value - * @param encapsulate if true, encapsulate value by ' - */ - public void addParam(StringBuilder buf, String name, String value, boolean encapsulate) { - addParam(buf, name, value, encapsulate, true); - } - - /** - * adds a param to buf if value is not null and encapsulate it with ' and add a comma - * - * @param buf the buffer - * @param name the name - * @param value the value - */ - public void addParam(StringBuilder buf, String name, String value) { - addParam(buf, name, value, true, true); - } - - /** - * adds a param to buf if value is not null and do not encapsulate it with ' but add a comma - * - * @param buf the buffer - * @param name the name - * @param value the value - */ - public void addParam(StringBuilder buf, String name, Boolean value) { - addParam(buf, name, value == null ? null : value.toString(), false, true); - } - - public String toJson() { - StringBuilder buf = new StringBuilder("{"); - addParam(buf, "title", title); - addParam(buf, "allDay", allDay); - addParam(buf, "editable", editable); - addParam(buf, "startEditable", startEditable); - addParam(buf, "durationEditable", durationEditable); - addParam(buf, "color", color); - addParam(buf, "end", toJavascriptDate(end), false); - addParam(buf, "url", url); - - buf.append(getExtendedFields()); - // this is the last element, we need no trailing , - addParam(buf, "start", toJavascriptDate(start), false, false); - buf.append("}"); - return buf.toString(); - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Boolean getAllDay() { - return allDay; - } - - public void setAllDay(Boolean allDay) { - this.allDay = allDay; - } - - public Date getStart() { - return start; - } - - public void setStart(Date start) { - this.start = start; - } - - public Date getEnd() { - return end; - } - - public void setEnd(Date end) { - this.end = end; - } - - public Boolean getEditable() { - return editable; - } - - public void setEditable(Boolean editable) { - this.editable = editable; - } - - public Boolean getDurationEditable() { - return durationEditable; - } - - public void setDurationEditable(Boolean durationEditable) { - this.durationEditable = durationEditable; - } - - public String getColor() { - return color; - } - - public void setColor(String color) { - this.color = color; - } - - public static long getSerialversionuid() { - return serialVersionUID; - } - - public Boolean getStartEditable() { - return startEditable; - } - - public void setStartEditable(Boolean startEditable) { - this.startEditable = startEditable; - } -} diff --git a/src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/FCEventList.java b/src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/FCEventList.java deleted file mode 100644 index 3e38359..0000000 --- a/src/main/old/de/jottyfan/timetrack/modules/done/fullcalendar/FCEventList.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.jottyfan.timetrack.modules.done.fullcalendar; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * - * @author henkej - * - */ -public class FCEventList implements Serializable { - private static final long serialVersionUID = 1L; - - private List list; - - public FCEventList() { - super(); - this.list = new ArrayList(); - } - - public String toJson() { - StringBuilder buf = new StringBuilder("["); - Iterator iterator = list.iterator(); - while (iterator.hasNext()) { - buf.append(iterator.next().toJson()); - if (iterator.hasNext()) { - buf.append(","); - } - } - buf.append("]"); - return buf.toString(); - } - - public List getList() { - return this.list; - } - -} diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css index fe789fc..df676e7 100644 --- a/src/main/resources/static/css/style.css +++ b/src/main/resources/static/css/style.css @@ -74,7 +74,7 @@ body { } .body { - height: 100%; + height: calc(100% - 2px); width: 100%; overflow: auto; } @@ -236,4 +236,6 @@ body { .tab-pane-table { background-color: white; padding: 8px; + border-radius: 4px; + border: 1px solid silver; } \ No newline at end of file diff --git a/src/main/resources/templates/contact/list.html b/src/main/resources/templates/contact/list.html index f766cfc..6f621bb 100644 --- a/src/main/resources/templates/contact/list.html +++ b/src/main/resources/templates/contact/list.html @@ -37,7 +37,7 @@ -
+
diff --git a/src/main/resources/templates/done/list.html b/src/main/resources/templates/done/list.html index e99abd5..d3c66b3 100644 --- a/src/main/resources/templates/done/list.html +++ b/src/main/resources/templates/done/list.html @@ -25,14 +25,13 @@
-
+
@@ -76,7 +75,6 @@
-
Kalender: TODO
diff --git a/src/main/resources/templates/layout/main.html b/src/main/resources/templates/layout/main.html index 823dad9..c2d3148 100644 --- a/src/main/resources/templates/layout/main.html +++ b/src/main/resources/templates/layout/main.html @@ -3,22 +3,26 @@ +Timetrack + - + + - - + + + + -
diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml deleted file mode 100644 index 7f00d8f..0000000 --- a/src/main/webapp/META-INF/context.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/beans.xml b/src/main/webapp/WEB-INF/beans.xml deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/webapp/WEB-INF/faces-config.xml b/src/main/webapp/WEB-INF/faces-config.xml deleted file mode 100644 index 3fbfad2..0000000 --- a/src/main/webapp/WEB-INF/faces-config.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - de.jooqfaces.JooqFacesContextFactory - - diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index a2bd723..0000000 --- a/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - timetrack - - EncodingFilter - de.jottyfan.timetrack.help.EncodingFilter - - encoding - UTF-8 - - - - Faces Servlet - javax.faces.webapp.FacesServlet - 1 - - - Faces Servlet - *.jsf - - - 580 - - - pages/start.jsf - - - org.apache.myfaces.RENDER_VIEWSTATE_ID - false - - - javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE - true - - - javax.faces.STATE_SAVING_METHOD - client - - - javax.faces.FACELETS_SKIP_COMMENTS - true - - - javax.faces.PROJECT_STAGE - Production - - - - org.apache.myfaces.LOG_WEB_CONTEXT_PARAMS - false - - - BootsFaces_USETHEME - true - - - BootsFaces_THEME - #{themeBean.currentTheme} - - - jooqFacesProperties - /etc/timetrack.properties - - - de.jooqfaces.PropertiesDeploymentListener - - diff --git a/src/main/webapp/pages/contact/item.xhtml b/src/main/webapp/pages/contact/item.xhtml deleted file mode 100644 index cd24288..0000000 --- a/src/main/webapp/pages/contact/item.xhtml +++ /dev/null @@ -1,42 +0,0 @@ - - - - Kontakte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/pages/contact/list.xhtml b/src/main/webapp/pages/contact/list.xhtml deleted file mode 100644 index 0b48a00..0000000 --- a/src/main/webapp/pages/contact/list.xhtml +++ /dev/null @@ -1,41 +0,0 @@ - - - - Kontakte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/pages/done/add.xhtml b/src/main/webapp/pages/done/add.xhtml deleted file mode 100644 index e7c009a..0000000 --- a/src/main/webapp/pages/done/add.xhtml +++ /dev/null @@ -1,80 +0,0 @@ - - - - Arbeitszeit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/pages/done/delete.xhtml b/src/main/webapp/pages/done/delete.xhtml deleted file mode 100644 index 1fa3df5..0000000 --- a/src/main/webapp/pages/done/delete.xhtml +++ /dev/null @@ -1,39 +0,0 @@ - - - - Arbeitszeit - - - - - Arbeitszeit - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/pages/done/edit.xhtml b/src/main/webapp/pages/done/edit.xhtml deleted file mode 100644 index bfa7717..0000000 --- a/src/main/webapp/pages/done/edit.xhtml +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arbeitszeit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/pages/done/init.xhtml b/src/main/webapp/pages/done/init.xhtml deleted file mode 100644 index 71673e9..0000000 --- a/src/main/webapp/pages/done/init.xhtml +++ /dev/null @@ -1,139 +0,0 @@ - - - - Arbeitszeit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Pause -

- -

-
-
- - Startzeit -

- -

-
-
- - Überstunden -

- -

-
-
- - Arbeitszeit -

- -

-
-
- - Endzeit -

- -

-
-
-
-
- - - - - - - - - - - - - - - - - -

- -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - - - - - - -
-
- diff --git a/src/main/webapp/pages/done/read.xhtml b/src/main/webapp/pages/done/read.xhtml deleted file mode 100644 index 466cd01..0000000 --- a/src/main/webapp/pages/done/read.xhtml +++ /dev/null @@ -1,46 +0,0 @@ - - - - Arbeitszeit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/webapp/pages/note/item.xhtml b/src/main/webapp/pages/note/item.xhtml deleted file mode 100644 index fc569fa..0000000 --- a/src/main/webapp/pages/note/item.xhtml +++ /dev/null @@ -1,47 +0,0 @@ - - - - Aufgaben - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/pages/note/list.xhtml b/src/main/webapp/pages/note/list.xhtml deleted file mode 100644 index 3762e77..0000000 --- a/src/main/webapp/pages/note/list.xhtml +++ /dev/null @@ -1,45 +0,0 @@ - - - - Aufgaben - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/pages/start.xhtml b/src/main/webapp/pages/start.xhtml deleted file mode 100644 index 1f99d96..0000000 --- a/src/main/webapp/pages/start.xhtml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/pages/template.xhtml b/src/main/webapp/pages/template.xhtml deleted file mode 100644 index a1a6d0c..0000000 --- a/src/main/webapp/pages/template.xhtml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - -
-
- -
-
- -
-
- -
- -
-
- diff --git a/src/main/webapp/resources/jslibs/fullcalendar/locales-all.min.js b/src/main/webapp/resources/jslibs/fullcalendar/locales-all.min.js deleted file mode 100644 index 1bb38a1..0000000 --- a/src/main/webapp/resources/jslibs/fullcalendar/locales-all.min.js +++ /dev/null @@ -1 +0,0 @@ -[].push.apply(FullCalendar.globalLocales,function(){"use strict";return[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Heeldag",moreLinkText:"Addisionele",noEventsText:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-kw",week:{dow:0,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-ly",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-ma",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-sa",week:{dow:0,doy:6},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-tn",week:{dow:1,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"az",week:{dow:1,doy:4},buttonText:{prev:"Əvvəl",next:"Sonra",today:"Bu Gün",month:"Ay",week:"Həftə",day:"Gün",list:"Gündəm"},weekText:"Həftə",allDayText:"Bütün Gün",moreLinkText:function(e){return"+ daha çox "+e},noEventsText:"Göstərmək üçün hadisə yoxdur"},{code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",moreLinkText:function(e){return"+още "+e},noEventsText:"Няма събития за показване"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekText:"Sed",allDayText:"Cijeli dan",moreLinkText:function(e){return"+ još "+e},noEventsText:"Nema događaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekText:"Set",allDayText:"Tot el dia",moreLinkText:"més",noEventsText:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekText:"Týd",allDayText:"Celý den",moreLinkText:function(e){return"+další: "+e},noEventsText:"Žádné akce k zobrazení"},{code:"cy",week:{dow:1,doy:4},buttonText:{prev:"Blaenorol",next:"Nesaf",today:"Heddiw",year:"Blwyddyn",month:"Mis",week:"Wythnos",day:"Dydd",list:"Rhestr"},weekText:"Wythnos",allDayText:"Trwy'r dydd",moreLinkText:"Mwy",noEventsText:"Dim digwyddiadau"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekText:"Uge",allDayText:"Hele dagen",moreLinkText:"flere",noEventsText:"Ingen arrangementer at vise"},{code:"de-at",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",allDayText:"Ganztägig",moreLinkText:function(e){return"+ weitere "+e},noEventsText:"Keine Ereignisse anzuzeigen"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",allDayText:"Ganztägig",moreLinkText:function(e){return"+ weitere "+e},noEventsText:"Keine Ereignisse anzuzeigen"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekText:"Εβδ",allDayText:"Ολοήμερο",moreLinkText:"περισσότερα",noEventsText:"Δεν υπάρχουν γεγονότα προς εμφάνιση"},{code:"en-au",week:{dow:1,doy:4}},{code:"en-gb",week:{dow:1,doy:4}},{code:"en-nz",week:{dow:1,doy:4}},{code:"eo",week:{dow:1,doy:4},buttonText:{prev:"Antaŭa",next:"Sekva",today:"Hodiaŭ",month:"Monato",week:"Semajno",day:"Tago",list:"Tagordo"},weekText:"Sm",allDayText:"Tuta tago",moreLinkText:"pli",noEventsText:"Neniuj eventoj por montri"},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekText:"Sm",allDayText:"Todo el día",moreLinkText:"más",noEventsText:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekText:"Sm",allDayText:"Todo el día",moreLinkText:"más",noEventsText:"No hay eventos para mostrar"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekText:"näd",allDayText:"Kogu päev",moreLinkText:function(e){return"+ veel "+e},noEventsText:"Kuvamiseks puuduvad sündmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekText:"As",allDayText:"Egun osoa",moreLinkText:"gehiago",noEventsText:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekText:"هف",allDayText:"تمام روز",moreLinkText:function(e){return"بیش از "+e},noEventsText:"هیچ رویدادی به نمایش"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekText:"Vk",allDayText:"Koko päivä",moreLinkText:"lisää",noEventsText:"Ei näytettäviä tapahtumia"},{code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sm",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekText:"Sm",allDayText:"Todo o día",moreLinkText:"máis",noEventsText:"Non hai eventos para amosar"},{code:"he",direction:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",moreLinkText:"אחר",noEventsText:"אין אירועים להצגה",weekText:"שבוע"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekText:"हफ्ता",allDayText:"सभी दिन",moreLinkText:function(e){return"+अधिक "+e},noEventsText:"कोई घटनाओं को प्रदर्शित करने के लिए"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekText:"Tje",allDayText:"Cijeli dan",moreLinkText:function(e){return"+ još "+e},noEventsText:"Nema događaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},weekText:"Hét",allDayText:"Egész nap",moreLinkText:"további",noEventsText:"Nincs megjeleníthető esemény"},{code:"hy-am",week:{dow:1,doy:4},buttonText:{prev:"Նախորդ",next:"Հաջորդ",today:"Այսօր",month:"Ամիս",week:"Շաբաթ",day:"Օր",list:"Օրվա ցուցակ"},weekText:"Շաբ",allDayText:"Ամբողջ օր",moreLinkText:function(e){return"+ ևս "+e},noEventsText:"Բացակայում է իրադարձությունը ցուցադրելու"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sehari penuh",moreLinkText:"lebih",noEventsText:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekText:"Vika",allDayText:"Allan daginn",moreLinkText:"meira",noEventsText:"Engir viðburðir til að sýna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekText:"Sm",allDayText:"Tutto il giorno",moreLinkText:function(e){return"+altri "+e},noEventsText:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekText:"週",allDayText:"終日",moreLinkText:function(e){return"他 "+e+" 件"},noEventsText:"表示する予定はありません"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekText:"კვ",allDayText:"მთელი დღე",moreLinkText:function(e){return"+ კიდევ "+e},noEventsText:"ღონისძიებები არ არის"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekText:"Не",allDayText:"Күні бойы",moreLinkText:function(e){return"+ тағы "+e},noEventsText:"Көрсету үшін оқиғалар жоқ"},{code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekText:"주",allDayText:"종일",moreLinkText:"개",noEventsText:"일정이 없습니다"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekText:"W",allDayText:"Ganzen Dag",moreLinkText:"méi",noEventsText:"Nee Evenementer ze affichéieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekText:"SAV",allDayText:"Visą dieną",moreLinkText:"daugiau",noEventsText:"Nėra įvykių rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekText:"Ned.",allDayText:"Visu dienu",moreLinkText:function(e){return"+vēl "+e},noEventsText:"Nav notikumu"},{code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekText:"Сед",allDayText:"Цел ден",moreLinkText:function(e){return"+повеќе "+e},noEventsText:"Нема настани за прикажување"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sepanjang hari",moreLinkText:function(e){return"masih ada "+e+" acara"},noEventsText:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekText:"Uke",allDayText:"Hele dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise"},{code:"ne",week:{dow:7,doy:1},buttonText:{prev:"अघिल्लो",next:"अर्को",today:"आज",month:"महिना",week:"हप्ता",day:"दिन",list:"सूची"},weekText:"हप्ता",allDayText:"दिनभरि",moreLinkText:"थप लिंक",noEventsText:"देखाउनको लागि कुनै घटनाहरू छैनन्"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",moreLinkText:"extra",noEventsText:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekText:"Veke",allDayText:"Heile dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekText:"Tydz",allDayText:"Cały dzień",moreLinkText:"więcej",noEventsText:"Brak wydarzeń do wyświetlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista"},weekText:"Sm",allDayText:"dia inteiro",moreLinkText:function(e){return"mais +"+e},noEventsText:"Não há eventos para mostrar"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekText:"Sem",allDayText:"Todo o dia",moreLinkText:"mais",noEventsText:"Não há eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekText:"Săpt",allDayText:"Toată ziua",moreLinkText:function(e){return"+alte "+e},noEventsText:"Nu există evenimente de afișat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekText:"Нед",allDayText:"Весь день",moreLinkText:function(e){return"+ ещё "+e},noEventsText:"Нет событий для отображения"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekText:"Ty",allDayText:"Celý deň",moreLinkText:function(e){return"+ďalšie: "+e},noEventsText:"Žiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekText:"Teden",allDayText:"Ves dan",moreLinkText:"več",noEventsText:"Ni dogodkov za prikaz"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekText:"Ja",allDayText:"Gjithë ditën",moreLinkText:function(e){return"+më tepër "+e},noEventsText:"Nuk ka evente për të shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekText:"Сед",allDayText:"Цео дан",moreLinkText:function(e){return"+ још "+e},noEventsText:"Нема догађаја за приказ"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekText:"Sed",allDayText:"Cеo dan",moreLinkText:function(e){return"+ još "+e},noEventsText:"Nеma događaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},weekText:"v.",allDayText:"Heldag",moreLinkText:"till",noEventsText:"Inga händelser att visa"},{code:"ta-in",week:{dow:1,doy:4},buttonText:{prev:"முந்தைய",next:"அடுத்தது",today:"இன்று",month:"மாதம்",week:"சனிக்கிழமை",day:"நாள்",list:"தினசரி கதை"},weekText:"வார",allDayText:"நாள் முழுவதும்",moreLinkText:function(e){return"+ மேலும் "+e},noEventsText:"நிகழ்வைக் காட்டவில்லை"},{code:"th",week:{dow:1,doy:4},buttonText:{prev:"ก่อนหน้า",next:"ถัดไป",prevYear:"ปีก่อนหน้า",nextYear:"ปีถัดไป",year:"ปี",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"กำหนดการ"},weekText:"สัปดาห์",allDayText:"ตลอดวัน",moreLinkText:"เพิ่มเติม",noEventsText:"ไม่มีกิจกรรมที่จะแสดง"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekText:"Hf",allDayText:"Tüm gün",moreLinkText:"daha fazla",noEventsText:"Gösterilecek etkinlik yok"},{code:"ug",buttonText:{month:"ئاي",week:"ھەپتە",day:"كۈن",list:"كۈنتەرتىپ"},allDayText:"پۈتۈن كۈن"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekText:"Тиж",allDayText:"Увесь день",moreLinkText:function(e){return"+ще "+e+"..."},noEventsText:"Немає подій для відображення"},{code:"uz",buttonText:{month:"Oy",week:"Xafta",day:"Kun",list:"Kun tartibi"},allDayText:"Kun bo'yi",moreLinkText:function(e){return"+ yana "+e},noEventsText:"Ko'rsatish uchun voqealar yo'q"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekText:"Tu",allDayText:"Cả ngày",moreLinkText:function(e){return"+ thêm "+e},noEventsText:"Không có sự kiện để hiển thị"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekText:"周",allDayText:"全天",moreLinkText:function(e){return"另外 "+e+" 个"},noEventsText:"没有事件显示"},{code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekText:"周",allDayText:"整天",moreLinkText:"顯示更多",noEventsText:"没有任何活動"}]}()); \ No newline at end of file diff --git a/src/main/webapp/resources/jslibs/fullcalendar/main.min.css b/src/main/webapp/resources/jslibs/fullcalendar/main.min.css deleted file mode 100644 index 48a87a8..0000000 --- a/src/main/webapp/resources/jslibs/fullcalendar/main.min.css +++ /dev/null @@ -1 +0,0 @@ -.fc-icon,.fc-unselectable{-moz-user-select:none;-ms-user-select:none}.fc .fc-button,.fc-icon{text-transform:none;text-align:center}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc .fc-button:not(:disabled),.fc a[data-navlink],.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-unselectable{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc{display:flex;flex-direction:column;font-size:1em}.fc .fc-button,.fc-icon{display:inline-block;font-weight:400}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{vertical-align:top;padding:0}.fc .fc-button,.fc .fc-button .fc-icon,.fc .fc-button-group,.fc .fc-timegrid-slot-label{vertical-align:middle}.fc a[data-navlink]:hover{text-decoration:underline}.fc .fc-button:hover,.fc .fc-list-event-title a,a.fc-event,a.fc-event:hover{text-decoration:none}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format('truetype');font-weight:400;font-style:normal}.fc-icon{width:1em;height:1em;-webkit-user-select:none;user-select:none;font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fc-icon-chevron-left:before{content:"\e900"}.fc-icon-chevron-right:before{content:"\e901"}.fc-icon-chevrons-left:before{content:"\e902"}.fc-icon-chevrons-right:before{content:"\e903"}.fc-icon-minus-square:before{content:"\e904"}.fc-icon-plus-square:before{content:"\e905"}.fc-icon-x:before{content:"\e906"}.fc .fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc .fc-button::-moz-focus-inner{padding:0;border-style:none}.fc .fc-button{-webkit-appearance:button;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc .fc-button:focus{outline:0;box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc .fc-button-primary:focus,.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:hover{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1e2b37;background-color:var(--fc-button-hover-bg-color,#1e2b37);border-color:#1a252f;border-color:var(--fc-button-hover-border-color,#1a252f)}.fc .fc-button-primary:disabled{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1a252f;background-color:var(--fc-button-active-bg-color,#1a252f);border-color:#151e27;border-color:var(--fc-button-active-border-color,#151e27)}.fc .fc-button .fc-icon{font-size:1.5em}.fc .fc-button-group{position:relative;display:inline-flex}.fc .fc-button-group>.fc-button{position:relative;flex:1 1 auto}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc .fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{position:absolute;top:0;right:0;left:0;bottom:0}.fc .fc-scroller-harness{position:relative;overflow:hidden;direction:ltr}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-scrollgrid,.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{width:100%;table-layout:fixed}.fc .fc-scrollgrid table{border-top-style:hidden;border-left-style:hidden;border-right-style:hidden}.fc .fc-scrollgrid{border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid{height:auto}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-top-width:0;border-left-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color,#fff);position:-webkit-sticky;position:sticky;z-index:2}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:-webkit-sticky;position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business,.fc .fc-view-harness-active>.fc-view{position:absolute;top:0;left:0;right:0;bottom:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-non-business{background:rgba(215,215,215,.3);background:var(--fc-non-business-color,rgba(215,215,215,.3))}.fc .fc-bg-event{background:var(--fc-bg-event-color,#8fdf82);opacity:.3;opacity:var(--fc-bg-event-opacity,.3)}.fc .fc-bg-event .fc-event-title{margin:.5em;font-size:.85em;font-size:var(--fc-small-font-size,.85em);font-style:italic}.fc .fc-highlight{background:rgba(188,232,241,.3);background:var(--fc-highlight-color,rgba(188,232,241,.3))}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer,.fc-h-event{display:block}.fc-event-selected .fc-event-resizer{border-radius:4px;border-radius:calc(var(--fc-event-resizer-dot-total-width,8px)/ 2);border-width:1px;border-width:var(--fc-event-resizer-dot-border-width,1px);width:8px;width:var(--fc-event-resizer-dot-total-width,8px);height:8px;height:var(--fc-event-resizer-dot-total-width,8px);border-style:solid;border-color:inherit;background:var(--fc-page-bg-color,#fff)}.fc-event-selected .fc-event-resizer:before{content:'';position:absolute;top:-20px;left:-20px;right:-20px;bottom:-20px}.fc-event-selected{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before{content:"";position:absolute;z-index:3;top:0;left:0;right:0;bottom:0}.fc-event-selected:after{content:"";background:rgba(0,0,0,.25);background:var(--fc-event-selected-overlay-color,rgba(0,0,0,.25));position:absolute;z-index:1;top:-1px;left:-1px;right:-1px;bottom:-1px}.fc-h-event{border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-h-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;vertical-align:top;left:0;right:0;max-width:100%;overflow:hidden}.fc-h-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-top-right-radius:0;border-bottom-right-radius:0;border-right-width:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{top:0;bottom:0;width:8px;width:var(--fc-event-resizer-thickness,8px)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:-4px;left:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:-4px;right:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-h-event.fc-event-selected .fc-event-resizer{top:50%;margin-top:-4px;margin-top:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:-4px;left:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:-4px;right:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}:root{--fc-daygrid-event-dot-width:8px;--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc .fc-popover{position:fixed;top:0;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc .fc-popover-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-theme-standard .fc-popover{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd);background:var(--fc-page-bg-color,#fff)}.fc-theme-standard .fc-popover-header{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{content:"";clear:both;display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-daygrid-day-frame{position:relative;min-height:100%}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{position:relative;z-index:4;padding:4px}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{position:absolute;left:0;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{position:relative;min-height:2em}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{position:absolute;top:0;left:0;right:0}.fc .fc-daygrid-bg-harness{position:absolute;top:0;bottom:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{z-index:6;margin-top:1px}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;margin:2px 3px 0}.fc .fc-daygrid-more-link{position:relative;z-index:4;cursor:pointer}.fc .fc-daygrid-week-number{position:absolute;z-index:5;top:0;padding:2px;min-width:1.5em;text-align:center;background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));color:grey;color:var(--fc-neutral-text-color,grey)}.fc .fc-more-popover{z-index:8}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{left:0;border-radius:0 0 3px}.fc-direction-rtl .fc-daygrid-week-number{right:0;border-radius:0 0 0 3px}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{position:relative;white-space:nowrap;border-radius:3px;font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{display:flex;align-items:center;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;min-width:0;overflow:hidden;font-weight:700}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-daygrid-event-dot{margin:0 4px;box-sizing:content-box;width:0;height:0;border:4px solid #3788d8;border:calc(var(--fc-daygrid-event-dot-width,8px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:4px;border-radius:calc(var(--fc-daygrid-event-dot-width,8px)/ 2)}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.fc-v-event{display:block;border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-v-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff);height:100%}.fc-v-event .fc-event-main-frame{height:100%;display:flex;flex-direction:column}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{top:0;bottom:0;max-height:100%;overflow:hidden}.fc-v-event:not(.fc-event-start){border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event:not(.fc-event-end){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:8px;height:var(--fc-event-resizer-thickness,8px);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:-4px;margin-left:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-body,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-slot{height:1.5em;border-bottom:0}.fc .fc-timegrid-slot:empty:before{content:'\00a0'}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{overflow:hidden;display:flex;align-items:center;justify-content:flex-end}.fc .fc-timegrid-axis-cushion{max-width:60px;flex-shrink:0}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-timegrid-col.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-liquid-hack .fc-timegrid-col-frame{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc-media-screen .fc-timegrid-cols{position:absolute;top:0;left:0;right:0;bottom:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{position:absolute;top:0;left:0;right:0}.fc-media-screen .fc-timegrid-event-harness{position:absolute}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight,.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-bg-harness{position:absolute;left:0;right:0}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror{box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px var(--fc-page-bg-color,#fff)}.fc-timegrid-event{font-size:.85em;font-size:var(--fc-small-font-size,.85em);border-radius:3px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{white-space:nowrap;font-size:.85em;font-size:var(--fc-small-font-size,.85em);margin-bottom:1px}.fc-timegrid-event-condensed .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-condensed .fc-event-time:after{content:'\00a0-\00a0'}.fc-timegrid-event-condensed .fc-event-title{font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-media-screen .fc-timegrid-event{position:absolute;top:0;bottom:1px;left:0;right:0}.fc .fc-timegrid-now-indicator-line{position:absolute;z-index:4;left:0;right:0;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red);border-width:1px 0 0}.fc .fc-timegrid-now-indicator-arrow{position:absolute;z-index:4;margin-top:-5px;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red)}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-theme-standard .fc-list{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-list-empty{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));height:100%;display:flex;justify-content:center;align-items:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{width:100%;border-style:hidden}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{position:-webkit-sticky;position:sticky;top:0;background:var(--fc-page-bg-color,#fff)}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{content:"";clear:both;display:table}.fc-theme-standard .fc-list-day-cushion{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:#f5f5f5;background-color:var(--fc-list-event-hover-bg-color,#f5f5f5)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{display:inline-block;box-sizing:content-box;width:0;height:0;border:5px solid #3788d8;border:calc(var(--fc-list-event-dot-width,10px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:5px;border-radius:calc(var(--fc-list-event-dot-width,10px)/ 2)}.fc .fc-list-event-title a{color:inherit}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}.fc-theme-bootstrap a:not([href]){color:inherit} \ No newline at end of file diff --git a/src/main/webapp/resources/jslibs/fullcalendar/main.min.js b/src/main/webapp/resources/jslibs/fullcalendar/main.min.js deleted file mode 100644 index 1e636ee..0000000 --- a/src/main/webapp/resources/jslibs/fullcalendar/main.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar v5.5.1 -Docs & License: https://fullcalendar.io/ -(c) 2020 Adam Shaw -*/ -var FullCalendar=function(e){"use strict";var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,n)};function n(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}var r=function(){return(r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n3)for(n=[n],i=3;i1&&_(o,t,n),t=R(n,o,o,e.__k,null,o.__e,t),"function"==typeof e.type&&(e.__d=t)))}function I(e,t,n,r,o,a,s,l,u){var c,d,p,f,v,g,m,S,D,b,C,R=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(u=n.__h,l=t.__e=n.__e,t.__h=null,a=[l]),(c=i.__b)&&c(t);try{e:if("function"==typeof R){if(S=t.props,D=(c=R.contextType)&&r[c.__c],b=c?D?D.props.value:c.__:r,n.__c?m=(d=t.__c=n.__c).__=d.__E:("prototype"in R&&R.prototype.render?t.__c=d=new R(S,b):(t.__c=d=new E(S,b),d.constructor=R,d.render=A),D&&D.sub(d),d.props=S,d.state||(d.state={}),d.context=b,d.__n=r,p=d.__d=!0,d.__h=[]),null==d.__s&&(d.__s=d.state),null!=R.getDerivedStateFromProps&&(d.__s==d.state&&(d.__s=h({},d.__s)),h(d.__s,R.getDerivedStateFromProps(S,d.__s))),f=d.props,v=d.state,p)null==R.getDerivedStateFromProps&&null!=d.componentWillMount&&d.componentWillMount(),null!=d.componentDidMount&&d.__h.push(d.componentDidMount);else{if(null==R.getDerivedStateFromProps&&S!==f&&null!=d.componentWillReceiveProps&&d.componentWillReceiveProps(S,b),!d.__e&&null!=d.shouldComponentUpdate&&!1===d.shouldComponentUpdate(S,d.__s,b)||t.__v===n.__v){d.props=S,d.state=d.__s,t.__v!==n.__v&&(d.__d=!1),d.__v=t,t.__e=n.__e,t.__k=n.__k,d.__h.length&&s.push(d),_(t,l,e);break e}null!=d.componentWillUpdate&&d.componentWillUpdate(S,d.__s,b),null!=d.componentDidUpdate&&d.__h.push((function(){d.componentDidUpdate(f,v,g)}))}d.context=b,d.props=S,d.state=d.__s,(c=i.__r)&&c(t),d.__d=!1,d.__v=t,d.__P=e,c=d.render(d.props,d.state,d.context),d.state=d.__s,null!=d.getChildContext&&(r=h(h({},r),d.getChildContext())),p||null==d.getSnapshotBeforeUpdate||(g=d.getSnapshotBeforeUpdate(f,v)),C=null!=c&&c.type==y&&null==c.key?c.props.children:c,w(e,Array.isArray(C)?C:[C],t,n,r,o,a,s,l,u),d.base=t.__e,t.__h=null,d.__h.length&&s.push(d),m&&(d.__E=d.__=null),d.__e=!1}else null==a&&t.__v===n.__v?(t.__k=n.__k,t.__e=n.__e):t.__e=N(n.__e,t,n,r,o,a,s,u);(c=i.diffed)&&c(t)}catch(e){t.__v=null,(u||null!=a)&&(t.__e=l,t.__h=!!u,a[a.indexOf(l)]=null),i.__e(e,t,n)}return t.__e}function P(e,t){i.__c&&i.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){i.__e(e,t.__v)}}))}function N(e,t,n,r,o,i,a,s){var l,u,c,f,h,v=n.props,g=t.props;if(o="svg"===t.type||o,null!=i)for(l=0;l=0;i-=1){var a=e[i][r];if("object"==typeof a&&a)o.unshift(a);else if(void 0!==a){n[r]=a;break}}o.length&&(n[r]=Oe(o))}for(i=e.length-1;i>=0;i-=1){var s=e[i];for(var l in s)l in n||(n[l]=s[l])}return n}function Ae(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function Ue(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Le(e){for(var t={},n=0,r=e;n1)||"numeric"!==o.year&&"2-digit"!==o.year||"numeric"!==o.month&&"2-digit"!==o.month||"numeric"!==o.day&&"2-digit"!==o.day||(s=1);var l=this.format(e,n),u=this.format(t,n);if(l===u)return l;var c=mt(function(e,t){var n={};for(var r in e)(!(r in ct)||ct[r]<=t)&&(n[r]=e[r]);return n}(o,s),i,n),d=c(e),p=c(t),f=function(e,t,n,r){var o=0;for(;o=et(t)&&(r=me(r,1))}return e.start&&(n=we(e.start),r&&r<=n&&(r=me(n,1))),{start:n,end:r}}function en(e){var t=Qt(e);return Se(t.start,t.end)>1}function tn(e,t,n,r){return"year"===r?Xe(n.diffWholeYears(e,t),"year"):"month"===r?Xe(n.diffWholeMonths(e,t),"month"):De(e,t)}function nn(e,t){var n,r,o=[],i=t.start;for(e.sort(rn),n=0;ni&&o.push({start:i,end:r.start}),r.end>i&&(i=r.end);return it.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function un(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t=(n||t.end),isToday:t&&un(t,r.start)}}function Cn(e){var t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function wn(e){return e.instance?e.instance.instanceId:e.def.defId+":"+e.range.start.toISOString()}var Rn={start:Pt,end:Pt,allDay:Boolean};function Tn(e,t,n){var o=function(e,t){var n=It(e,Rn),o=n.refined,i=n.extra,a=o.start?t.createMarkerMeta(o.start):null,s=o.end?t.createMarkerMeta(o.end):null,l=o.allDay;null==l&&(l=a&&a.isTimeUnspecified&&(!s||s.isTimeUnspecified));return r({range:{start:a?a.marker:null,end:s?s.marker:null},allDay:l},i)}(e,t),i=o.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return o}function kn(e,t){return an(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}(e,t)}function Mn(e,t,n){return r(r({},xn(e,t,n)),{timeZone:t.timeZone})}function xn(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}function _n(e,t,n){var r=Xt({editable:!1},n),o=Jt(r.refined,r.extra,"",e.allDay,!0,n);return{def:o,ui:vn(o,t),instance:Ne(o.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function In(e,t,n){n.emitter.trigger("select",r(r({},Pn(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function Pn(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.dateSpanTransforms;a=0;r-=1){var o=n[r].parseMeta(e);if(o)return{sourceDefId:r,meta:o}}return null}(i,t);if(s)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:ee(),sourceDefId:s.sourceDefId,meta:s.meta,ui:zt(i,t),extendedProps:a}}return null}function Vn(e){return r(r(r({},Vt),Ln),e.pluginHooks.eventSourceRefiners)}function Fn(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}var zn=function(){function e(){}return e.prototype.getCurrentData=function(){return this.currentDataManager.getCurrentData()},e.prototype.dispatch=function(e){return this.currentDataManager.dispatch(e)},Object.defineProperty(e.prototype,"view",{get:function(){return this.getCurrentData().viewApi},enumerable:!1,configurable:!0}),e.prototype.batchRendering=function(e){e()},e.prototype.updateSize=function(){this.trigger("_resize",!0)},e.prototype.setOption=function(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})},e.prototype.getOption=function(e){return this.currentDataManager.currentCalendarOptionsInput[e]},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.getCurrentData().availableRawLocales)},e.prototype.on=function(e,t){var n=this.currentDataManager;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn("Unknown listener name '"+e+"'")},e.prototype.off=function(e,t){this.currentDataManager.emitter.off(e,t)},e.prototype.trigger=function(e){for(var t,n=[],r=1;r=1?Math.min(o,i):o}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=ye(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),function(e,t,n){void 0===n&&(n=!1);var r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",it(t,!0)))),r}(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?_e(ke(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?_e(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-Me(xe(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(xe(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?Me(xe(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(xe(e))*60):new Date(e.valueOf()-(t||0))},e}(),$n=[],Qn={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"};function er(e){for(var t=e.length>0?e[0].code:"en",n=$n.concat(e),r={en:Qn},o=0,i=n;o0;o-=1){var i=r.slice(0,o).join("-");if(t[i])return t[i]}return null}(n,t)||Qn;return nr(e,n,r)}(e,t):nr(e.code,[e.code],e)}function nr(e,t,n){var r=Oe([Qn,n],["buttonText"]);delete r.code;var o=r.week;return delete r.week,{codeArg:e,codes:t,week:o,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function rr(e){var t=tr(e.locale||"en",er([]).map);return new Jn(r(r({timeZone:wt.timeZone,calendarSystem:"gregory"},e),{locale:t}))}var or,ir={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function ar(e,t){return Nt(function(e){var t;t=!0===e?[{}]:Array.isArray(e)?e.filter((function(e){return e.daysOfWeek})):"object"==typeof e&&e?[e]:[];return t=t.map((function(e){return r(r({},ir),e)}))}(e),null,t)}function sr(e,t){return e.left>=t.left&&e.left=t.top&&e.top
",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);var t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),or}var fr={defs:{},instances:{}},hr=function(){function e(){this.getKeysForEventDefs=st(this._getKeysForEventDefs),this.splitDateSelection=st(this._splitDateSpan),this.splitEventStore=st(this._splitEventStore),this.splitIndividualUi=st(this._splitIndividualUi),this.splitEventDrag=st(this._splitInteraction),this.splitEventResize=st(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),o=this.splitDateSelection(e.dateSelection),i=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),l=this.splitEventResize(e.eventResize),u={};for(var c in this.eventUiBuilders=Ue(n,(function(e,n){return t.eventUiBuilders[n]||st(vr)})),n){var d=n[c],p=a[c]||fr,f=this.eventUiBuilders[c];u[c]={businessHours:d.businessHours||e.businessHours,dateSelection:o[c]||null,eventStore:p,eventUiBases:f(e.eventUiBases[""],d.ui,i[c]),eventSelection:p.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:l[c]||null}}return u},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=0,r=this.getKeysForDateSpan(e);nn:!!t&&e>=t.end)}}function mr(e,t){var n=["fc-day","fc-day-"+ve[e.dow]];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}function yr(e,t){return void 0===t&&(t="day"),JSON.stringify({date:rt(e),type:t})}var Er,Sr=null;function Dr(){return null===Sr&&(Sr=function(){var e=document.createElement("div");q(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="
",document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return F(e),t}()),Sr}function br(){return Er||(Er=function(){var e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);var t=Cr(e);return document.body.removeChild(e),t}()),Er}function Cr(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function wr(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,o=parseInt(n.borderRightWidth,10)||0,i=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=Cr(e),l=s.y-r-o,u={borderLeft:r,borderRight:o,borderTop:i,borderBottom:a,scrollbarBottom:s.x-i-a,scrollbarLeft:0,scrollbarRight:0};return Dr()&&"rtl"===n.direction?u.scrollbarLeft=l:u.scrollbarRight=l,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function Rr(e,t,n){void 0===t&&(t=!1);var r=n?e.getBoundingClientRect():Tr(e),o=wr(e,t),i={left:r.left+o.borderLeft+o.scrollbarLeft,right:r.right-o.borderRight-o.scrollbarRight,top:r.top+o.borderTop,bottom:r.bottom-o.borderBottom-o.scrollbarBottom};return t&&(i.left+=o.paddingLeft,i.right-=o.paddingRight,i.top+=o.paddingTop,i.bottom-=o.paddingBottom),i}function Tr(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function kr(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function Mr(e,t,n){var r=!1,o=function(){r||(r=!0,t.apply(this,arguments))},i=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(o,i);a&&"function"==typeof a.then&&a.then(o,i)}var xr=function(){function e(){this.handlers={},this.thisContext=null}return e.prototype.setThisContext=function(e){this.thisContext=e},e.prototype.setOptions=function(e){this.options=e},e.prototype.on=function(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)},e.prototype.off=function(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter((function(e){return e!==n}))):delete e[t]}(this.handlers,e,t)},e.prototype.trigger=function(e){for(var t=[],n=1;n=n[t]&&e=n[t]&&e0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()0},e.prototype.canScrollRight=function(){return this.getScrollLeft()=c.end?new Date(c.end.valueOf()-1):u),o=this.buildCurrentRangeInfo(e,t),i=/^(year|month|week|day)$/.test(o.unit),a=this.buildRenderRange(this.trimHiddenDays(o.range),o.unit,i),s=a=this.trimHiddenDays(a),d.showNonCurrentDates||(s=on(s,o.range)),s=on(s=this.adjustActiveRange(s),r),l=sn(o.range,r),{validRange:r,currentRange:o.range,currentRangeUnit:o.unit,isRangeAllDay:i,activeRange:s,renderRange:a,slotMinTime:d.slotMinTime,slotMaxTime:d.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(o.duration)}},e.prototype.buildValidRange=function(){var e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.props,o=null,i=null,a=null;return r.duration?(o=r.duration,i=r.durationUnit,a=this.buildRangeFromDuration(e,t,o,i)):(n=this.props.dayCount)?(i="day",a=this.buildRangeFromDayCount(e,t,n)):(a=this.buildCustomVisibleRange(e))?i=r.dateEnv.greatestWholeUnit(a.start,a.end).unit:(i=nt(o=this.getFallbackDuration()).unit,a=this.buildRangeFromDuration(e,t,o,i)),{duration:o,unit:i,range:a}},e.prototype.getFallbackDuration=function(){return Xe({day:1})},e.prototype.adjustActiveRange=function(e){var t=this.props,n=t.dateEnv,r=t.usesMinMaxTime,o=t.slotMinTime,i=t.slotMaxTime,a=e.start,s=e.end;return r&&(Qe(o)<0&&(a=we(a),a=n.add(a,o)),Qe(i)>1&&(s=me(s=we(s),-1),s=n.add(s,i))),{start:a,end:s}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var o,i,a,s=this.props,l=s.dateEnv,u=s.dateAlignment;if(!u){var c=this.props.dateIncrement;u=c&&et(c)e.fetchRange.end}(e,t,n)})),t,n)}function Po(e,t,n,r){var o={};for(var i in e){var a=e[i];t[i]?o[i]=No(a,n,r):o[i]=a}return o}function No(e,t,n){var o=n.options,i=n.calendarApi,a=n.pluginHooks.eventSourceDefs[e.sourceDefId],s=ee();return a.fetch({eventSource:e,range:t,context:n},(function(r){var a=r.rawEvents;o.eventSourceSuccess&&(a=o.eventSourceSuccess.call(i,a,r.xhr)||a),e.success&&(a=e.success.call(i,a,r.xhr)||a),n.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:s,fetchRange:t,rawEvents:a})}),(function(r){console.warn(r.message,r),o.eventSourceFailure&&o.eventSourceFailure.call(i,r),e.failure&&e.failure(r),n.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:s,fetchRange:t,error:r})})),r(r({},e),{isFetching:!0,latestFetchId:s})}function Ho(e,t){return Ae(e,(function(e){return Oo(e,t)}))}function Oo(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function Ao(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function Uo(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function Lo(e,t){var n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return{affectedEvents:(n=t.state).affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Wo(e,t){var n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return{affectedEvents:(n=t.state).affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Vo(e,t,n,r,o){var i=[];return{headerToolbar:e.headerToolbar?Fo(e.headerToolbar,e,t,n,r,o,i):null,footerToolbar:e.footerToolbar?Fo(e.footerToolbar,e,t,n,r,o,i):null,viewsWithButtons:i}}function Fo(e,t,n,r,o,i,a){return Ue(e,(function(e){return function(e,t,n,r,o,i,a){var s="rtl"===t.direction,l=t.customButtons||{},u=n.buttonText||{},c=t.buttonText||{};return(e?e.split(" "):[]).map((function(e){return e.split(",").map((function(e){return"title"===e?{buttonName:e}:((t=l[e])?(d=function(e){t.click&&t.click.call(e.target,e,e.target)},(p=r.getCustomButtonIconClass(t))||(p=r.getIconClass(e,s))||(f=t.text)):(n=o[e])?(a.push(e),d=function(){i.changeView(e)},(f=n.buttonTextOverride)||(p=r.getIconClass(e,s))||(f=n.buttonTextDefault)):i[e]&&(d=function(){i[e]()},(f=u[e])||(p=r.getIconClass(e,s))||(f=c[e])),{buttonName:e,buttonClick:d,buttonIcon:p,buttonText:f});var t,n,d,p,f}))}))}(e,t,n,r,o,i,a)}))}function zo(e,t,n,r,o){var i=null;"GET"===(e=e.toUpperCase())?t=function(e,t){return e+(-1===e.indexOf("?")?"?":"&")+Bo(t)}(t,n):i=Bo(n);var a=new XMLHttpRequest;a.open(e,t,!0),"GET"!==e&&a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.onload=function(){if(a.status>=200&&a.status<400){var e=!1,t=void 0;try{t=JSON.parse(a.responseText),e=!0}catch(e){}e?r(t,a):o("Failure parsing JSON",a)}else o("Request failed",a)},a.onerror=function(){o("Request failed",a)},a.send(i)}function Bo(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}function jo(e,t){for(var n=We(t.getCurrentData().eventSources),r=[],o=0,i=e;o1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}var Jo=function(){function e(e){var t=this;this.computeOptionsData=st(this._computeOptionsData),this.computeCurrentViewData=st(this._computeCurrentViewData),this.organizeRawLocales=st(er),this.buildLocale=st(tr),this.buildPluginHooks=uo(),this.buildDateEnv=st($o),this.buildTheme=st(Qo),this.parseToolbars=st(Vo),this.buildViewSpecs=st(wo),this.buildDateProfileGenerator=lt(ei),this.buildViewApi=st(ti),this.buildViewUiProps=lt(oi),this.buildEventUiBySource=st(ni,Ve),this.buildEventUiBases=st(ri),this.parseContextBusinessHours=lt(ai),this.buildTitle=st(Ko),this.emitter=new xr,this.actionRunner=new Xo(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.getCurrentData=function(){return t.data},this.dispatch=function(e){t.actionRunner.request(e)},this.props=e,this.actionRunner.pause();var n={},o=this.computeOptionsData(e.optionOverrides,n,e.calendarApi),i=o.calendarOptions.initialView||o.pluginHooks.initialView,a=this.computeCurrentViewData(i,o,e.optionOverrides,n);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(a.options);var s,l,u,c=(s=o.calendarOptions,l=o.dateEnv,null!=(u=s.initialDate)?l.createMarker(u):Fn(s.now,l)),d=a.dateProfileGenerator.build(c);un(d.activeRange,c)||(c=d.currentRange.start);for(var p={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},f=0,h=o.pluginHooks.contextInit;f1){var m=a&&n.getClass("buttonGroup")||"";return Ar.apply(void 0,o(["div",{className:m}],i))}return i[0]},t}(Yr),Ei=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e,t,n=this.props,r=n.model,o=n.extraClassName,i=!1,a=r.center;return r.left?(i=!0,e=r.left):e=r.start,r.right?(i=!0,t=r.right):t=r.end,Ar("div",{className:[o||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",a||[]),this.renderSection("end",t||[]))},t.prototype.renderSection=function(e,t){var n=this.props;return Ar(yi,{key:e,widgetGroups:t,title:n.title,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled})},t}(Yr),Si=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={availableWidth:null},t.handleEl=function(e){t.el=e,Kr(t.props.elRef,e),t.updateAvailableWidth()},t.handleResize=function(){t.updateAvailableWidth()},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state,n=e.aspectRatio,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],o="",i="";return n?null!==t.availableWidth?o=t.availableWidth/n:i=1/n*100+"%":o=e.height||"",Ar("div",{ref:this.handleEl,onClick:e.onClick,className:r.join(" "),style:{height:o,paddingBottom:i}},e.children)},t.prototype.componentDidMount=function(){this.context.addResizeHandler(this.handleResize)},t.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleResize)},t.prototype.updateAvailableWidth=function(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})},t}(Yr),Di=function(e){function t(t){var n=e.call(this,t)||this;return n.handleSegClick=function(e,t){var r=n.component,o=r.context,i=fn(t);if(i&&r.isValidSegDownEl(e.target)){var a=z(e.target,".fc-event-forced-url"),s=a?a.querySelector("a[href]").href:"";o.emitter.trigger("eventClick",{el:t,event:new Bn(r.context,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:o.viewApi}),s&&!e.defaultPrevented&&(window.location.href=s)}},n.destroy=K(t.el,"click",".fc-event",n.handleSegClick),n}return n(t,e),t}(ci),bi=function(e){function t(t){var n,r,o,i,a,s=e.call(this,t)||this;return s.handleEventElRemove=function(e){e===s.currentSegEl&&s.handleSegLeave(null,s.currentSegEl)},s.handleSegEnter=function(e,t){fn(t)&&(s.currentSegEl=t,s.triggerEvent("eventMouseEnter",e,t))},s.handleSegLeave=function(e,t){s.currentSegEl&&(s.currentSegEl=null,s.triggerEvent("eventMouseLeave",e,t))},s.removeHoverListeners=(n=t.el,r=".fc-event",o=s.handleSegEnter,i=s.handleSegLeave,K(n,"mouseover",r,(function(e,t){if(t!==a){a=t,o(e,t);var n=function(e){a=null,i(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}}))),s}return n(t,e),t.prototype.destroy=function(){this.removeHoverListeners()},t.prototype.triggerEvent=function(e,t,n){var r=this.component,o=r.context,i=fn(n);t&&!r.isValidSegDownEl(t.target)||o.emitter.trigger(e,{el:n,event:new Bn(o,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:o.viewApi})},t}(ci),Ci=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildViewContext=st(Gr),t.buildViewPropTransformers=st(Ri),t.buildToolbarProps=st(wi),t.handleNavLinkClick=X("a[data-navlink]",t._handleNavLinkClick.bind(t)),t.headerRef=Lr(),t.footerRef=Lr(),t.interactionsStore={},t.registerInteractiveComponent=function(e,n){var r=di(e,n),o=[Di,bi].concat(t.props.pluginHooks.componentInteractions).map((function(e){return new e(r)}));t.interactionsStore[e.uid]=o,fi[e.uid]=r},t.unregisterInteractiveComponent=function(e){for(var n=0,r=t.interactionsStore[e.uid];n10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}var Mi="fc-col-header-cell";function xi(e){return e.text}var _i=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.dateEnv,n=e.options,o=e.theme,i=e.viewApi,a=this.props,s=a.date,l=a.dateProfile,u=gr(s,a.todayRange,null,l),c=[Mi].concat(mr(u,o)),d=t.format(s,a.dayHeaderFormat),p=n.navLinks&&!u.isDisabled&&a.colCnt>1?{"data-navlink":yr(s),tabIndex:0}:{},f=r(r(r({date:t.toDate(s),view:i},a.extraHookProps),{text:d}),u);return Ar(fo,{hookProps:f,classNames:n.dayHeaderClassNames,content:n.dayHeaderContent,defaultContent:xi,didMount:n.dayHeaderDidMount,willUnmount:n.dayHeaderWillUnmount},(function(e,t,n,o){return Ar("th",r({ref:e,className:c.concat(t).join(" "),"data-date":u.isDisabled?void 0:rt(s),colSpan:a.colSpan},a.extraDataAttrs),Ar("div",{className:"fc-scrollgrid-sync-inner"},!u.isDisabled&&Ar("a",r({ref:n,className:["fc-col-header-cell-cushion",a.isSticky?"fc-sticky":""].join(" ")},p),o)))}))},t}(Yr),Ii=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.dateEnv,o=t.theme,i=t.viewApi,a=t.options,s=me(new Date(2592e5),e.dow),l={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},u=[Mi].concat(mr(l,o),e.extraClassNames||[]),c=n.format(s,e.dayHeaderFormat),d=r(r(r(r({date:s},l),{view:i}),e.extraHookProps),{text:c});return Ar(fo,{hookProps:d,classNames:a.dayHeaderClassNames,content:a.dayHeaderContent,defaultContent:xi,didMount:a.dayHeaderDidMount,willUnmount:a.dayHeaderWillUnmount},(function(t,n,o,i){return Ar("th",r({ref:t,className:u.concat(n).join(" "),colSpan:e.colSpan},e.extraDataAttrs),Ar("div",{className:"fc-scrollgrid-sync-inner"},Ar("a",{className:["fc-col-header-cell-cushion",e.isSticky?"fc-sticky":""].join(" "),ref:o},i)))}))},t}(Yr),Pi=function(e){function t(t,n){var r=e.call(this,t,n)||this;return r.initialNowDate=Fn(n.options.now,n.dateEnv),r.initialNowQueriedMs=(new Date).valueOf(),r.state=r.computeTiming().currentState,r}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state;return e.children(t.nowDate,t.todayRange)},t.prototype.componentDidMount=function(){this.setTimeout()},t.prototype.componentDidUpdate=function(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())},t.prototype.componentWillUnmount=function(){this.clearTimeout()},t.prototype.computeTiming=function(){var e=this.props,t=this.context,n=ye(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),o=t.dateEnv.add(r,Xe(1,e.unit)),i=o.valueOf()-n.valueOf();return i=Math.min(864e5,i),{currentState:{nowDate:r,todayRange:Ni(r)},nextState:{nowDate:o,todayRange:Ni(o)},waitMs:i}},t.prototype.setTimeout=function(){var e=this,t=this.computeTiming(),n=t.nextState,r=t.waitMs;this.timeoutId=setTimeout((function(){e.setState(n,(function(){e.setTimeout()}))}),r)},t.prototype.clearTimeout=function(){this.timeoutId&&clearTimeout(this.timeoutId)},t.contextType=jr,t}(Or);function Ni(e){var t=we(e);return{start:t,end:me(t,1)}}var Hi=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.createDayHeaderFormatter=st(Oi),t}return n(t,e),t.prototype.render=function(){var e=this.context,t=this.props,n=t.dates,r=t.dateProfile,o=t.datesRepDistinctDays,i=t.renderIntro,a=this.createDayHeaderFormatter(e.options.dayHeaderFormat,o,n.length);return Ar(Pi,{unit:"day"},(function(e,t){return Ar("tr",null,i&&i("day"),n.map((function(e){return o?Ar(_i,{key:e.toISOString(),date:e,dateProfile:r,todayRange:t,colCnt:n.length,dayHeaderFormat:a}):Ar(Ii,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:a})})))}))},t}(Yr);function Oi(e,t,n){return e||ki(t,n)}var Ai=function(){function e(e,t){for(var n=e.start,r=e.end,o=[],i=[],a=-1;n=t.length?t[t.length-1]+1:t[n]},e}(),Ui=function(){function e(e,t){var n,r,o,i=e.dates;if(t){for(r=i[0].getUTCDay(),n=1;nt)return!0}return!1},t.prototype.needsYScrolling=function(){if(Vi.test(this.props.overflowY))return!1;for(var e=this.el,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),n=e.children,r=0;rt)return!0}return!1},t.prototype.getXScrollbarWidth=function(){return Vi.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight},t.prototype.getYScrollbarWidth=function(){return Vi.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth},t}(Yr),zi=function(){function e(e){var t=this;this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=function(e,n){var r=t,o=r.depths,i=r.currentMap,a=!1,s=!1;null!==e?(a=n in i,i[n]=e,o[n]=(o[n]||0)+1,s=!0):(o[n]-=1,o[n]||(delete i[n],delete t.callbackMap[n],a=!0)),t.masterCallback&&(a&&t.masterCallback(null,String(n)),s&&t.masterCallback(e,String(n)))}}return e.prototype.createRef=function(e){var t=this,n=this.callbackMap[e];return n||(n=this.callbackMap[e]=function(n){t.handleValue(n,String(e))}),n},e.prototype.collect=function(e,t,n){return je(this.currentMap,e,t,n)},e.prototype.getAll=function(){return We(this.currentMap)},e}();function Bi(e){for(var t=0,n=0,r=j(e,".fc-scrollgrid-shrink");n0&&(this.everMovedDown=!0),i<0?this.everMovedLeft=!0:i>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(Ta()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e=0&&u>=0&&c>=0&&d>=0&&(c<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"top",distance:c}),d<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"bottom",distance:d}),l<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>l)&&(r={scrollCache:a,name:"left",distance:l}),u<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>u)&&(r={scrollCache:a,name:"right",distance:u}))}return r},e.prototype.buildCaches=function(){return this.queryScrollEls().map((function(e){return e===window?new Ra(!1):new wa(e,!1)}))},e.prototype.queryScrollEls=function(){for(var e=[],t=0,n=this.scrollQuery;t=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,oe(document.body),ae(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var o=r.pointer=new Sa(t);return o.emitter.on("pointerdown",r.onPointerDown),o.emitter.on("pointermove",r.onPointerMove),o.emitter.on("pointerup",r.onPointerUp),n&&(o.selector=n),r.mirror=new ba,r.autoScroller=new ka,r}return n(t,e),t.prototype.destroy=function(){this.pointer.destroy(),this.onPointerUp({})},t.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout((function(){t.delayTimeoutId=null,t.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)},t.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},t.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},t.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},t.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},t.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},t.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},t.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},t.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},t}(hi),xa=function(){function e(e){this.origRect=Tr(e),this.scrollCaches=kr(e).map((function(e){return new wa(e,!0)}))}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e=0&&c=0&&do.layer)&&(v.rect.left+=l,v.rect.right+=l,v.rect.top+=u,v.rect.bottom+=u,o=v)}}}return o},e}();function Ia(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&kn(e.dateSpan,t.dateSpan)}function Pa(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.datePointTransforms;ao.start)return c.endDelta=u,c;return null}(s,e,o.subjectEl.classList.contains("fc-event-resizer-start"),l.range,i.pluginHooks.eventResizeJoinTransforms)),u&&(c=Hn(a,i.getCurrentData().eventUiBases,u,i),p.mutatedEvents=c,n.component.isInteractionValid(p)||(d=!0,u=null,c=null,p.mutatedEvents=null)),c?i.dispatch({type:"SET_EVENT_RESIZE",state:p}):i.dispatch({type:"UNSET_EVENT_RESIZE"}),d?te():ne(),t||(u&&Ia(s,e)&&(u=null),n.validMutation=u,n.mutatedRelevantEvents=c)},n.handleDragEnd=function(e){var t=n.component.context,o=n.eventRange.def,i=n.eventRange.instance,a=new Bn(t,o,i),s=n.relevantEvents,l=n.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:n.draggingSegEl,event:a,jsEvent:e.origEvent,view:t.viewApi}),n.validMutation){var u=new Bn(t,l.defs[o.defId],i?l.instances[i.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:l});var c={oldEvent:a,event:u,relatedEvents:Gn(l,t,i),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",r(r({},c),{el:n.draggingSegEl,startDelta:n.validMutation.startDelta||Xe(0),endDelta:n.validMutation.endDelta||Xe(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",c)}else t.emitter.trigger("_noEventResize");n.draggingSeg=null,n.relevantEvents=null,n.validMutation=null};var o=t.component,i=n.dragging=new Ma(t.el);i.pointer.selector=".fc-event-resizer",i.touchScrollAllowed=!1,i.autoScroller.isEnabled=o.context.options.dragScroll;var a=n.hitDragging=new _a(n.dragging,pi(t));return a.emitter.on("pointerdown",n.handlePointerDown),a.emitter.on("dragstart",n.handleDragStart),a.emitter.on("hitupdate",n.handleHitUpdate),a.emitter.on("dragend",n.handleDragEnd),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t.prototype.querySegEl=function(e){return z(e.subjectEl,".fc-event")},t}(ci);var Ua=function(){function e(e){var t=this;this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=function(e){e.jsEvent&&(t.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=function(e){var n=t.context.options.unselectCancel,r=e.origEvent.target;t.matchesCancel=!!z(r,n),t.matchesEvent=!!z(r,Oa.SELECTOR)},this.onDocumentPointerUp=function(e){var n=t.context,r=t.documentPointer,o=n.getCurrentData();if(!r.wasTouchScroll){if(o.dateSelection&&!t.isRecentPointerDateSelect){var i=n.options.unselectAuto;!i||i&&t.matchesCancel||n.calendarApi.unselect(e)}o.eventSelection&&!t.matchesEvent&&n.dispatch({type:"UNSELECT_EVENT"})}t.isRecentPointerDateSelect=!1};var n=this.documentPointer=new Sa(document);n.shouldIgnoreMove=!0,n.shouldWatchScroll=!1,n.emitter.on("pointerdown",this.onDocumentPointerDown),n.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}return e.prototype.destroy=function(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()},e}(),La={fixedMirrorParent:Pt},Wa={dateClick:Pt,eventDragStart:Pt,eventDragStop:Pt,eventDrop:Pt,eventResizeStart:Pt,eventResizeStop:Pt,eventResize:Pt,drop:Pt,eventReceive:Pt,eventLeave:Pt},Va=function(){function e(e,t){var n=this;this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){n.dragMeta=n.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,t,o){var i=n.hitDragging.dragging,a=null,s=null,l=!1,u={affectedEvents:{defs:{},instances:{}},mutatedEvents:{defs:{},instances:{}},isEvent:n.dragMeta.create};e&&(a=e.component.context,n.canDropElOnCalendar(o.subjectEl,a)&&(s=function(e,t,n){for(var o=r({},t.leftoverProps),i=0,a=n.pluginHooks.externalDefTransforms;ia.top)return!1}return!0}(e,t,n)){for(var r=e.firstCol;r<=e.lastCol;r+=1){for(var o=u[r],i=0;i=o[i].top;)i+=1;o.splice(i,0,{seg:e,top:n,bottom:n+t})}return!0}return!1}for(var M in i)i[M]||(d[M.split(":")[0]]=!0);return{segsByFirstCol:u.map(as),segsByEachCol:u.map((function(t,n){var o=function(e){for(var t=[],n=0,r=e;n=o[i].top;)i+=1;o.splice(i,0,e)}}}function h(n,r,o){var i=n.seg,a=i.eventRange.instance.instanceId;if(!t[a]){t[a]=!0;for(var l=i.firstCol;l<=i.lastCol;l+=1){e[l]+=1;var u=e[l];if(o&&1===u&&r>0)for(var c=r-1;s[l].length>c;)h(s[l].pop(),s[l].length,!1)}}}}var ls=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.cellElRefs=new zi,t.frameElRefs=new zi,t.fgElRefs=new zi,t.segHarnessRefs=new zi,t.rootElRef=Lr(),t.state={framePositions:null,maxContentHeight:null,segHeights:{}},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.state,o=this.context,i=t.cells.length,a=Ya(t.businessHourSegs,i),s=Ya(t.bgEventSegs,i),l=Ya(this.getHighlightSegs(),i),u=Ya(this.getMirrorSegs(),i),c=is(t.cells,t.fgEventSegs,t.dayMaxEvents,t.dayMaxEventRows,n.segHeights,n.maxContentHeight,i,o.options.eventOrder),d=c.paddingBottoms,p=c.segsByFirstCol,f=c.segsByEachCol,h=c.segIsHidden,v=c.segTops,g=c.segMarginTops,m=c.moreCnts,y=c.moreTops,E=t.eventDrag&&t.eventDrag.affectedInstances||t.eventResize&&t.eventResize.affectedInstances||{};return Ar("tr",{ref:this.rootElRef},t.renderIntro&&t.renderIntro(),t.cells.map((function(n,o){var i=e.renderFgSegs(p[o],h,v,g,E,t.todayRange),c=e.renderFgSegs(u[o],{},v,{},{},t.todayRange,Boolean(t.eventDrag),Boolean(t.eventResize),!1);return Ar($a,{key:n.key,elRef:e.cellElRefs.createRef(n.key),innerElRef:e.frameElRefs.createRef(n.key),dateProfile:t.dateProfile,date:n.date,showDayNumber:t.showDayNumbers,showWeekNumber:t.showWeekNumbers&&0===o,forceDayTop:t.showWeekNumbers,todayRange:t.todayRange,extraHookProps:n.extraHookProps,extraDataAttrs:n.extraDataAttrs,extraClassNames:n.extraClassNames,moreCnt:m[o],buildMoreLinkText:t.buildMoreLinkText,onMoreClick:function(e){t.onMoreClick(r(r({},e),{fromCol:o}))},segIsHidden:h,moreMarginTop:y[o],segsByEachCol:f[o],fgPaddingBottom:d[o],fgContentElRef:e.fgElRefs.createRef(n.key),fgContent:Ar(Wr,null,Ar(Wr,null,i),Ar(Wr,null,c)),bgContent:Ar(Wr,null,e.renderFillSegs(l[o],"highlight"),e.renderFillSegs(a[o],"non-business"),e.renderFillSegs(s[o],"bg-event"))})})))},t.prototype.componentDidMount=function(){this.updateSizing(!0)},t.prototype.componentDidUpdate=function(e,t){var n=this.props;this.updateSizing(!Ve(e,n))},t.prototype.getHighlightSegs=function(){var e=this.props;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs},t.prototype.getMirrorSegs=function(){var e=this.props;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]},t.prototype.renderFgSegs=function(e,t,n,o,i,a,s,l,u){var c=this.context,d=this.props.eventSelection,p=this.state.framePositions,f=1===this.props.cells.length,h=[];if(p)for(var v=0,g=e;v=0&&l=0&&u1,showWeekNumbers:t.showWeekNumbers,todayRange:m,dateProfile:n,cells:a,renderIntro:t.renderRowIntro,businessHourSegs:u[s],eventSelection:t.eventSelection,bgEventSegs:c[s].filter(fs),fgEventSegs:d[s],dateSelectionSegs:p[s],eventDrag:f[s],eventResize:h[s],dayMaxEvents:i,dayMaxEventRows:o,clientWidth:t.clientWidth,clientHeight:t.clientHeight,buildMoreLinkText:v,onMoreClick:function(t){e.handleMoreLinkClick(r(r({},t),{fromRow:s}))}})})))),!t.forPrint&&s&&s.currentFgEventSegs===t.fgEventSegs&&Ar(cs,{ref:e.morePopoverRef,date:s.date,dateProfile:n,segs:s.allSegs,alignmentEl:s.dayEl,topAlignmentEl:1===l?t.headerAlignElRef.current:null,onCloseClick:e.handleMorePopoverClose,selectedInstanceId:t.eventSelection,hiddenInstances:(t.eventDrag?t.eventDrag.affectedInstances:null)||(t.eventResize?t.eventResize.affectedInstances:null)||{},todayRange:m}))})))},t.prototype.prepareHits=function(){this.rowPositions=new _r(this.rootEl,this.rowRefs.collect().map((function(e){return e.getCellEls()[0]})),!1,!0),this.colPositions=new _r(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)},t.prototype.positionToHit=function(e,t){var n=this.morePopoverRef.current,o=n?n.positionToHit(e,t,this.rootEl):null,i=this.state.morePopoverState;if(o)return r({row:i.fromRow,col:i.fromCol},o);var a=this.colPositions,s=this.rowPositions,l=a.leftToIndex(e),u=s.topToIndex(t);return null!=u&&null!=l?{row:u,col:l,dateSpan:{range:this.getCellRange(u,l),allDay:!0},dayEl:this.getCellEl(u,l),relativeRect:{left:a.lefts[l],right:a.rights[l],top:s.tops[u],bottom:s.bottoms[u]}}:null},t.prototype.getCellEl=function(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]},t.prototype.getCellRange=function(e,t){var n=this.props.cells[e][t].date;return{start:n,end:me(n,1)}},t}(so);function ps(e){return"function"==typeof e?e:function(t){return"+"+t+" "+e}}function fs(e){return e.eventRange.def.allDay}var hs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.forceDayIfListItem=!0,t}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(Li),vs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.slicer=new hs,t.tableRef=Lr(),t.handleRootEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e}):t.context.unregisterInteractiveComponent(t)},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return Ar(ds,r({ref:this.tableRef,elRef:this.handleRootEl},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))},t.prototype.prepareHits=function(){this.tableRef.current.prepareHits()},t.prototype.queryHit=function(e,t){var n=this.tableRef.current.positionToHit(e,t);return n?{component:this,dateSpan:n.dateSpan,dayEl:n.dayEl,rect:{left:n.relativeRect.left,right:n.relativeRect.right,top:n.relativeRect.top,bottom:n.relativeRect.bottom},layer:0}:null},t}(so),gs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDayTableModel=st(ms),t.headerRef=Lr(),t.tableRef=Lr(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.context,n=t.options,r=t.dateProfileGenerator,o=this.props,i=this.buildDayTableModel(o.dateProfile,r),a=n.dayHeaders&&Ar(Hi,{ref:this.headerRef,dateProfile:o.dateProfile,dates:i.headerDates,datesRepDistinctDays:1===i.rowCnt}),s=function(t){return Ar(vs,{ref:e.tableRef,dateProfile:o.dateProfile,dayTableModel:i,businessHours:o.businessHours,dateSelection:o.dateSelection,eventStore:o.eventStore,eventUiBases:o.eventUiBases,eventSelection:o.eventSelection,eventDrag:o.eventDrag,eventResize:o.eventResize,nextDayThreshold:n.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:n.dayMaxEvents,dayMaxEventRows:n.dayMaxEventRows,showWeekNumbers:n.weekNumbers,expandRows:!o.isHeightAuto,headerAlignElRef:e.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:o.forPrint})};return n.dayMinWidth?this.renderHScrollLayout(a,s,i.colCnt,n.dayMinWidth):this.renderSimpleLayout(a,s)},t}(Ga);function ms(e,t){var n=new Ai(e.renderRange,t);return new Ui(n,/year|month|week/.test(e.currentRangeUnit))}var ys=lo({initialView:"dayGridMonth",optionRefiners:{moreLinkClick:Pt,moreLinkClassNames:Pt,moreLinkContent:Pt,moreLinkDidMount:Pt,moreLinkWillUnmount:Pt},views:{dayGrid:{component:gs,dateProfileGeneratorClass:function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.buildRenderRange=function(t,n,r){var o,i=this.props.dateEnv,a=e.prototype.buildRenderRange.call(this,t,n,r),s=a.start,l=a.end;(/^(year|month)$/.test(n)&&(s=i.startOfWeek(s),(o=i.startOfWeek(l)).valueOf()!==l.valueOf()&&(l=ge(o,1))),this.props.monthMode&&this.props.fixedWeekCount)&&(l=ge(l,6-Math.ceil(Ee(s,l))));return{start:s,end:l}},t}(To)},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),Es=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},t.prototype.getKeysForDateSpan=function(e){return e.allDay?["allDay"]:["timed"]},t.prototype.getKeysForEventDef=function(e){return e.allDay?dn(e)?["timed","allDay"]:["allDay"]:["timed"]},t}(hr),Ss=bt({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function Ds(e){var t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return Ar(jr.Consumer,null,(function(n){if(!e.isLabeled)return Ar("td",{className:t.join(" "),"data-time":e.isoTimeStr});var r=n.dateEnv,o=n.options,i=n.viewApi,a=null==o.slotLabelFormat?Ss:Array.isArray(o.slotLabelFormat)?bt(o.slotLabelFormat[0]):bt(o.slotLabelFormat),s={level:0,time:e.time,date:r.toDate(e.date),view:i,text:r.format(e.date,a)};return Ar(fo,{hookProps:s,classNames:o.slotLabelClassNames,content:o.slotLabelContent,defaultContent:bs,didMount:o.slotLabelDidMount,willUnmount:o.slotLabelWillUnmount},(function(n,r,o,i){return Ar("td",{ref:n,className:t.concat(r).join(" "),"data-time":e.isoTimeStr},Ar("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},Ar("div",{className:"fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion",ref:o},i)))}))}))}function bs(e){return e.text}var Cs=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return this.props.slatMetas.map((function(e){return Ar("tr",{key:e.key},Ar(Ds,r({},e)))}))},t}(Yr),ws=bt({week:"short"}),Rs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.allDaySplitter=new Es,t.headerElRef=Lr(),t.rootElRef=Lr(),t.scrollerElRef=Lr(),t.state={slatCoords:null},t.handleScrollTopRequest=function(e){var n=t.scrollerElRef.current;n&&(n.scrollTop=e)},t.renderHeadAxis=function(e,n){void 0===n&&(n="");var o=t.context.options,i=t.props.dateProfile.renderRange,a=Se(i.start,i.end),s=o.navLinks&&1===a?{"data-navlink":yr(i.start,"week"),tabIndex:0}:{};return o.weekNumbers&&"day"===e?Ar(ha,{date:i.start,defaultFormat:ws},(function(e,t,o,i){return Ar("th",{ref:e,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(t).join(" ")},Ar("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid",style:{height:n}},Ar("a",r({ref:o,className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner"},s),i)))})):Ar("th",{className:"fc-timegrid-axis"},Ar("div",{className:"fc-timegrid-axis-frame",style:{height:n}}))},t.renderTableRowAxis=function(e){var n=t.context,r=n.options,o=n.viewApi,i={text:r.allDayText,view:o};return Ar(fo,{hookProps:i,classNames:r.allDayClassNames,content:r.allDayContent,defaultContent:Ts,didMount:r.allDayDidMount,willUnmount:r.allDayWillUnmount},(function(t,n,r,o){return Ar("td",{ref:t,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(n).join(" ")},Ar("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame"+(null==e?" fc-timegrid-axis-frame-liquid":""),style:{height:e}},Ar("span",{className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner",ref:r},o)))}))},t.handleSlatCoords=function(e){t.setState({slatCoords:e})},t}return n(t,e),t.prototype.renderSimpleLayout=function(e,t,n){var r=this.context,o=this.props,i=[],a=ea(r.options);return e&&i.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(i.push({type:"body",key:"all-day",chunk:{content:t}}),i.push({type:"body",key:"all-day-divider",outerContent:Ar("tr",{className:"fc-scrollgrid-section"},Ar("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),i.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),Ar(Do,{viewSpec:r.viewSpec,elRef:this.rootElRef},(function(e,t){return Ar("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},Ar(na,{liquid:!o.isHeightAuto&&!o.forPrint,cols:[{width:"shrink"}],sections:i}))}))},t.prototype.renderHScrollLayout=function(e,t,n,r,o,i,a){var s=this,l=this.context.pluginHooks.scrollGridImpl;if(!l)throw new Error("No ScrollGrid implementation");var u=this.context,c=this.props,d=!c.forPrint&&ea(u.options),p=!c.forPrint&&ta(u.options),f=[];e&&f.push({type:"header",key:"header",isSticky:d,syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return Ar("tr",null,s.renderHeadAxis("day",e.rowSyncHeights[0]))}},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(f.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return Ar("tr",null,s.renderTableRowAxis(e.rowSyncHeights[0]))}},{key:"cols",content:t}]}),f.push({key:"all-day-divider",type:"body",outerContent:Ar("tr",{className:"fc-scrollgrid-section"},Ar("td",{colSpan:2,className:"fc-timegrid-divider "+u.theme.getClass("tableCellShaded")}))}));var h=u.options.nowIndicator;return f.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(u.options.expandRows),chunks:[{key:"axis",content:function(e){return Ar("div",{className:"fc-timegrid-axis-chunk"},Ar("table",{style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,Ar("tbody",null,Ar(Cs,{slatMetas:i}))),Ar("div",{className:"fc-timegrid-now-indicator-container"},Ar(Pi,{unit:h?"minute":"day"},(function(e){var t=h&&a&&a.safeComputeTop(e);return"number"==typeof t?Ar(aa,{isAxis:!0,date:e},(function(e,n,r,o){return Ar("div",{ref:e,className:["fc-timegrid-now-indicator-arrow"].concat(n).join(" "),style:{top:t}},o)})):null}))))}},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),p&&f.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:Qi},{key:"cols",content:Qi}]}),Ar(Do,{viewSpec:u.viewSpec,elRef:this.rootElRef},(function(e,t){return Ar("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},Ar(l,{liquid:!c.isHeightAuto&&!c.forPrint,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:o}]}],sections:f}))}))},t.prototype.getAllDayMaxEventProps=function(){var e=this.context.options,t=e.dayMaxEvents,n=e.dayMaxEventRows;return!0!==t&&!0!==n||(t=void 0,n=5),{dayMaxEvents:t,dayMaxEventRows:n}},t}(so);function Ts(e){return e.text}var ks=function(){function e(e,t,n){this.positions=e,this.dateProfile=t,this.slotDuration=n}return e.prototype.safeComputeTop=function(e){var t=this.dateProfile;if(un(t.currentRange,e)){var n=we(e),r=e.valueOf()-n.valueOf();if(r>=et(t.slotMinTime)&&ri.top&&o.top0?" fc-timegrid-event-harness-inset":""),key:s,style:r({visibility:t[s]?"hidden":""},u)},Ar(Ws,r({seg:e,isDragging:n,isResizing:o,isDateSelecting:i,isSelected:s===l.eventSelection,isCondensed:e.bottom-e.top=0;t-=1)if(n=Xe(Zs[t]),null!==(r=tt(n,e))&&r>1)return n;return e}(r),u=[];et(a)0?e.renderSegList(s,i):e.renderEmptyMessage()))}))},t.prototype.renderEmptyMessage=function(){var e=this.context,t=e.options,n=e.viewApi,r={text:t.noEventsText,view:n};return Ar(fo,{hookProps:r,classNames:t.noEventsClassNames,content:t.noEventsContent,defaultContent:al,didMount:t.noEventsDidMount,willUnmount:t.noEventsWillUnmount},(function(e,t,n,r){return Ar("div",{className:["fc-list-empty"].concat(t).join(" "),ref:e},Ar("div",{className:"fc-list-empty-cushion",ref:n},r))}))},t.prototype.renderSegList=function(e,t){var n=this.context,o=n.theme,i=n.options,a=function(e){var t,n,r=[];for(t=0;t - - - - - - - - - - -
- - -
- \ No newline at end of file diff --git a/src/main/webapp/resources/my/selectOneMenu.xhtml b/src/main/webapp/resources/my/selectOneMenu.xhtml deleted file mode 100644 index c6036fc..0000000 --- a/src/main/webapp/resources/my/selectOneMenu.xhtml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file