![](https://habrastorage.org/files/11b/b7a/3c4/11bb7a3c43e64dc1b09d1923e3156662.png)
ãæéã¯ç²Ÿç¥åŽåè ã®éŠéœã§ããã
ãªãã¬ã»ãã»ãã«ã¶ãã¯
å€ãã®å Žåã人ã ã¯å€ããã®ã銎æã¿ã®ãããã®ãåªå ããæ°ãããã®ã¯ç¡èŠããŸãã ãã®ãããç§ãã¡ã¯é·ãéãèŠä»¶ãæºãããªãæé远跡ã·ã¹ãã ãæ°žç¶çã«äœ¿çšããããã°ã©ããŒããç°¿èšãŸã§ãæåéããã¹ãŠã®äººã«çµ¶ããåé¡ãçã¿åºããŸããã
![](https://habrastorage.org/files/6aa/244/d70/6aa244d704354f4383fe9b0b05bdafdf.png)
æéã®äžè¶³ã«ããæé远跡ã·ã¹ãã ã®äžè¬çãªèŠçïŒå³ãåç §ïŒã¯ãã·ã¹ãã ã®éçºã®æ£åœãªçç±ã«ã¯ãªããŸããã§ããã ãã®ç¶æ³ã¯ãCUBAãã©ãããã©ãŒã ã®æ©èœãå®èšŒããããã«å®éã®ã¢ããªã±ãŒã·ã§ã³ãäœæãããšããã¢ã€ãã¢ã«ãã£ãŠä¿åãããŸããã ããžãã¹ãšåã³ãçµã¿åããããšãæé远跡ã·ã¹ãã ãæåã®åè£ã«ãªããŸããã
çŸæç¹ã§ã¯ãéçºãå®äºããã¢ããªã±ãŒã·ã§ã³ãåœç€Ÿã«å®è£ ãããŠããããã¹ãŠã®äººãšå ±æããæºåãã§ããŠããŸãã
ãã®èšäºã§ã¯ãéãããåïŒäººãšå人ïŒã«ãã£ãŠçæéïŒ1ãææªæºïŒã§ãã®ã¢ããªã±ãŒã·ã§ã³ãéçºããæ¹æ³ã説æããŸãã
æåã®ã¹ããã
確ç«ãããæ £è¡ã«åŸããã·ã¹ãã ã®éçºãéå§ããã·ã¹ãã ã«è¡šç€ºããããšã³ãã£ãã£ã決å®ãããµããžã§ã¯ãé åã説æããŸãã ãã®ã¢ãããŒãã«ãããå°æ¥ã®ã·ã¹ãã ã®äºæ³ãããè€éããïŒæ£ç¢ºã«ã§ã¯ãããŸãããïŒäºåã«è©äŸ¡ããããšãã§ããŸãã
æé远跡ã·ã¹ãã ã§å¿ èŠãªãšã³ãã£ãã£ã«ã€ããŠèããŠã¿ãŸãããã
- ãŠãŒã¶ãŒ-ãŠãŒã¶ãŒãããªãå Žæã¯æ確ã§ãã 幞ããªããšã«ããã®ãããªãšã³ãã£ãã£ã¯ãã§ã«ãã©ãããã©ãŒã ã«ååšããã®ã§ãããã䜿çšããŸãã
- 顧客ã¯ãéãæ¯æã人ã§ãã
- ãããžã§ã¯ã-ãéã®æ¯æãã
- ã¿ã¹ã¯ã¯ç¹å®ã®çš®é¡ã®äœæ¥ã§ãã
- æéèšé²-ãŠãŒã¶ãŒãç¹å®ã®æ¥ã«ç¹å®ã®ã¿ã¹ã¯ã«è²»ãããæéã
ããã§ååã ãšæãããŸãã ããã¯ãå€ãã·ã¹ãã ã«ãã£ããšã³ãã£ãã£ã®ã»ããã§ãã 䟿å®äžãäœããè¿œå ããå¿ èŠããããŸããã
- ãããžã§ã¯ãã®åœ¹å²-å€ãã®ãããžã§ã¯ãããããåããŠãŒã¶ãŒã1ã€ã®ãããžã§ã¯ãã®ãããŒãžã£ãŒã§ãããå¥ã®ãããžã§ã¯ãã®éçºè ã§ããããšããããŸãïŒããã¯ç§ãã¡ã«ãèµ·ãããŸãïŒã
- ãããžã§ã¯ãåå è -ãããžã§ã¯ããšãŠãŒã¶ãŒéã®æ¥ç¶ã«ã¯ãããããžã®ãªã³ã¯ãšãã®ãããžã§ã¯ãã®åœ¹å²ãå«ãŸããŸãã
- ã¿ã¹ã¯ã®çš®é¡-è€æ°ã®ã¿ã¹ã¯ãçµã¿åãããããšãã§ããæ©èœã ããšãã°ãããã¹ããã¿ã¹ã¯ã®ã¿ã€ãã䜿çšãããšã瀟å ã§ã®ãã¹ãã«è²»ãããæéãææ¡ããããŸããŸãªãããžã§ã¯ãã§ãã®ææšãæ¯èŒã§ããŸãã
- ã¢ã¯ãã£ããã£ã¿ã€ã-è€æ°ã®æéã¬ã³ãŒããçµã¿åãããããšãã§ããæ©èœã ããšãã°ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãéçºããã¿ã¹ã¯ã®äžç°ãšããŠãåæãã³ãŒãã®äœæããã¹ãã®äœæããã°ã®ä¿®æ£ãè¡ããŸãã å¿ èŠã«å¿ããŠãé©åãªã¿ã€ãã®ã¢ã¯ãã£ããã£ããããžã§ã¯ãã«è¿œå ãããšãåã¢ã€ãã ã«è²»ããããæéã远跡ã§ããŸãã
- äŒæ¥æ¥-人ã ãééããªãããã«ãäŒæ¥ã®ã¿ã€ã ã·ãŒããåããããã«ãæå®ãããäŒæ¥æ¥ã䜿çšããŠãã®ãããªæ¥ãã·ã¹ãã ã§åŒ·èª¿è¡šç€ºããŸãã
- ã¿ã°ã¯ãã¿ã€ã ãšã³ããªã«è¿œå ã§ããæ§é ãäžååãªã¿ã°ã§ãã
- ã¿ã°ã®ã¿ã€ã-ç¹å®ã®ã¿ã°ãã°ã«ãŒãåããæ©èœã
ãã®èšäºã§ã¯ãåãšã³ãã£ãã£ã®ããããã£ã«ã€ããŠã¯èª¬æããŸããã ãããžã§ã¯ãã³ãŒããåç §ããããšã§ãèªåã§ããããã£ã確èªã§ããŸãã
ãªããžã§ã¯ãã¢ãã«ã決å®ããåŸãCUBAã¹ã¿ãžãªã§ã®äœæ¥ãéå§ããŸããã ãŸãã察å¿ãããšã³ãã£ãã£ãäœæããŸããã ãã®åŸãã¹ã¿ãžãªã§ã®ã³ãŒãèªåçæã®çŽ æŽãããæ©äŒã掻çšããããŒã¿ããŒã¹ãäœæããããã®SQLã¹ã¯ãªãããšãCRUDã¢ã¯ã·ã§ã³ãåããæšæºç»é¢ïŒãšã³ãã£ãã£ãªã¹ãç»é¢ãšåã ã®ãšã³ãã£ãã£ç·šéç»é¢ïŒãååŸããŸããã ãšã³ãã£ãã£ã®80ïŒ ã«ã¯ãååãªæšæºç»é¢ããããŸããã æ¹åãå¿ èŠãªç»é¢ã¯ãWYSIWYGç»é¢ãšãã£ã¿ãŒã䜿çšããŠç·šéããŸããã
次ã«ããŠãŒã¶ãŒãå¿ èŠãªãšã³ãã£ãã£ã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¡ãã¥ãŒãèšå®ããŸãã
ãã®æç¹ã§ãã¢ããªã±ãŒã·ã§ã³ããã§ã«èµ·åããŠããªããžã§ã¯ãã¢ãã«ã®ãšã³ãã£ãã£ãæäœïŒäœæ/ç·šé/åé€ïŒããããšãã§ããŸãã
ãããæ°æéã§ãæé远跡ã·ã¹ãã ã®å®éã«æ©èœããå®å šã«æ©èœãããããã¿ã€ããäœæããŸããã
ã€ã³ã¿ãŒãã§ã€ã¹ããã䜿ãããããã
åäœãããããã¿ã€ããå ¥æããŸããããåäœããã¢ããªã±ãŒã·ã§ã³ãšã¯ã»ã©é ããã®ã§ããã
éæãããããšãèŠãŠã¿ãŸãããïŒ
- æéãåããã¹ããŒããšå®¹æã
- ç°¡åãªã·ã¹ãã èšå®
- ããã
é±ããšã®ã¿ã€ã ã·ãŒãã®å ¥å
æåã«å¿ èŠã ã£ãã®ã¯ã1é±éã®äŸ¿å©ãªæéã®åãåããã§ããã å€ãã·ã¹ãã ã«ã¯ãã®ãããªç»é¢ããããç§ãã¡ã¯åæ§ã®ç»é¢ãäœæããããšã«ããŸããã ãããç§ãã¡ãåŸããã®ã§ãã
![](https://habrastorage.org/files/ff4/ffc/d15/ff4ffcd15bca47e49fa8570e5aa73661.png)
èŠããŠãããããããŸãããããªããžã§ã¯ãã¢ãã«ã«ã¯ãé±æ¬¡ã¬ããŒãããšã³ãã£ãã£ããããŸããã ãšã³ãã£ãã£ã«ãã€ã³ãããã«ãã®ç»é¢ãå®è£ ããããšãå¯èœã§ãããããŒã¿ããŒã¹ã«çŽæ¥æ¥ç¶ãããŠããªãäžéã®éæ°žç¶ãšã³ãã£ãã£ãäœæããæ¹ãã¯ããã«äŸ¿å©ã§ãããã³ã³ããŒãã³ãã®ã»ããå šäœãéåžžã®ãšã³ãã£ãã£ãšåæ§ã«æ©èœããŸãã ãã®ææ³ã«ãããããŒã¿ããŒã¹æ§é ããæœè±¡åãããŠãŒã¶ãŒãããç解ããããç»é¢ãäœæã§ããŸãã ãã®ãããªãšã³ãã£ãã£ã¯éåžžã«åçŽã«èŠããŸãã
@MetaClass(name = "ts$WeeklyReportEntry") public class WeeklyReportEntry extends AbstractNotPersistentEntity { ..... @MetaProperty(mandatory = true) protected Project project; @MetaProperty(mandatory = true) protected Task task; ..... }
ãã®å ŽåãWeeklyReportEntryã¯ããŒãã«ã®1è¡ã§ãã
ææ¥ããšã«æéãå ¥åããæ¹ã䟿å©ã«ãªãããã«ãããŒãã«ãç·šéå¯èœã«ããŸããã ããã«ãåã«æéã®ã«ãŠã³ããè¿œå ãã誀ã£ãŠå ¥åãããå¯èœæ§ã®ããæ¥ã匷調衚瀺ããŸããã 次ã«ããŠãŒã¶ãŒã®èŠæ±ã«å¿ããŠããããžã§ã¯ãããã³ã¿ã¹ã¯ããšã«ããŒãã«å ã®ã¬ã³ãŒããã°ã«ãŒãåããæ©èœãè¿œå ããŸããã ããã¯ãã¹ãŠãCUBAãã©ãããã©ãŒã ã®æšæºã¡ã«ããºã ã䜿çšããŠè¡ãããŸããã
ã«ã¬ã³ããŒããã¿ã€ã ã·ãããå ¥åãã
次ã«éèŠãªç»é¢ã¯ãã«ã¬ã³ããŒããã¿ã€ã ã·ãããå ¥åããããšã§ããã æ®å¿µãªãããçŸæç¹ã§ã¯ãã©ãããã©ãŒã ã«ãã«ã¬ã³ããŒãã³ã³ããŒãã³ãã¯ãããŸããã ãã ããããã¯Webã¯ã©ã€ã¢ã³ãã®ã¬ã³ããªã³ã°ã«äœ¿çšããVaadinãã¬ãŒã ã¯ãŒã¯ã«ãããŸãã ç¶æ¿ãããããã«å€æŽïŒä»¥äžã§èª¬æïŒããã®ã§ãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããŸããã ã«ã¬ã³ããŒã§ã¯ãäžæ£ç¢ºã«åããããå¯èœæ§ã®ããã¿ã€ã ã·ããã®æ€èšŒãè¿œå ããäŒæ¥ãšé±æ«ã匷調ããé±ãšæããšã«æéãè¿œå ããŸããã
![](https://habrastorage.org/files/cf7/9ae/370/cf79ae37009b436b949cd040706d2885.png)
ãããžã§ã¯ããšã¿ã¹ã¯ã®ã»ããã¢ãã
ç§ãã¡ã«ãšã£ãŠã®ãã1ã€ã®ç®æšã¯ããããžã§ã¯ããšã¿ã¹ã¯ã®èšå®ã®å®¹æãã§ãã åºæ¬çãªãããžã§ã¯ãç»é¢ãšã¿ã¹ã¯ãããã«ããããããããã³ããç°¡åã«æ¥œããããç¹å¥ãªç»é¢ãäœæããããšã«ããŸããã éèŠãªèŠä»¶ã¯æ¬¡ã®ãšããã§ãããããžã§ã¯ãããã°ããåãæ¿ããæ©èœãããŸããŸãªãããžã§ã¯ãã«äººãšã¿ã¹ã¯ããã°ããè¿œå ããæ©èœã ãããžã§ã¯ããã¿ã¹ã¯ãããã³ãããžã§ã¯ãåå è ã®3ã€ã®é¢é£ããŒãã«ã®åœ¢åŒã§ç»é¢ãäœæããããšã決å®ãããŸããã
ãããžã§ã¯ããéžæãããšããã®ãããžã§ã¯ãã«å¯Ÿå¿ããã¬ã³ãŒããã¿ã¹ã¯ããŒãã«ãšåå è ããŒãã«ã«è¡šç€ºãããŸãã CUBAãã©ãããã©ãŒã ã䜿çšãããšãããŒãã«ã«é¢é£ããããŒã¿ãœãŒã¹ãäœæã§ãããããç¹å¥ãªã³ãŒãã¯å¿ èŠãããŸããã å®éã3ã€ã®æšæºç»é¢ïŒãããžã§ã¯ãã®ãªã¹ããã¿ã¹ã¯ã®ãªã¹ãããããžã§ã¯ãåå è ã®ãªã¹ãïŒããã3ã€ãã¹ãŠã眮ãæãããã®ãçµã¿ç«ãŠãŸããã
![](https://habrastorage.org/files/f80/2e6/7e4/f802e67e44854fa4bd1b0d15adc149cf.png)
ã³ãã³ãã©ã€ã³
ç§ãã¡ãå®è£ ããããšã決ããå¥ã®é©æ°ã¯ãããããã³ãã³ãã©ã€ã³ã§ããã ç°¡åãªããã¹ãã³ãã³ããå ¥åããããšã§ã1é±éãŸãã¯1ãæã®ã¿ã€ã ã·ãŒãã«èšå ¥ã§ããŸãã 次ã®ããã«ãªããŸãã
![](https://habrastorage.org/files/a0e/859/281/a0e859281c1b40349858fe54ba17f7f5.png)
ãŸããAceEditorãšåŒã°ããVaadinã³ã³ããŒãã³ãã䜿çšããŠããã³ããäœæããæ¹æ³ãã³ãã³ãã©ã€ã³ã«æããŸããã ããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
Everhourã·ã¹ãã ã§ãã®çŽ æŽãããã³ã³ã»ãããæ¢ã ãããŒãºã«åãããŠå°ãå€æŽããããšã«æ³šæããŠãã ããã
è¿ éãªéçº
åœç¶ããããã®ç»é¢ã®ãã¹ãŠãäžåºŠã«éçºãããããã§ã¯ãããŸããã
ãã€ãã®ããã«ãUIã念é ã«çœ®ãã«ã¯ãæåã®ãªãã·ã§ã³ãäœæãããããã¯ããã«æéãããããŸããã ããã§ã¯ãCUBAãã©ãããã©ãŒã ã«å®è£ ããããµãŒããŒãžã®å€æŽã®ãããããŒãã£ã³ã°ã¡ã«ããºã ãéåžžã«åœ¹ç«ã¡ãŸããã ãã®ãããã§ãUIã®çŽ90ïŒ ïŒãïŒã§ãµãŒããŒãåèµ·åããå¿ èŠã¯ãããŸããã ããã«ããã®æ¹æ³ã§ã³ã¢ããžãã¯ïŒãµãŒãã¹ãšBeanïŒããªããŒãããããšãã§ããŸãã ãã®ã¡ã«ããºã ã«ã€ããŠã¯ã èšäºã§è©³ãã説æããŠããŸã ã
ã¯ã©ã€ã¢ã³ãåŽã³ã³ããŒãã³ãã®æ¡åŒµ
ã«ã¬ã³ããŒãè¿œå
äžèšã®ããã«ãã«ã¬ã³ããŒãå¿ èŠã§ããã 幞ããªããšã«ãããã¯Vaadinã³ã³ããŒãã³ããªã¹ãã§çºèŠãããŸããã 次ã«ãã©ã®ããã«è¿œå ãããã説æããŸãã
Vaadinã¯GWTäžã«æ§ç¯ãããŠããŸãããVaadinã³ã³ããŒãã³ãã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã«ååšããŸãã éåžžãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®éä¿¡ã«äœ¿çšãããäžééšåããããŸãã ãããã£ãŠãã«ã¬ã³ããŒãæ¡åŒµããã«ã¯ããµãŒããŒãšGWTã³ãŒãã®äž¡æ¹ã§äœæ¥ããå¿ èŠããããŸãã
ã«ã¬ã³ããŒã®ç¶æ ã¯com.vaadin.shared.ui.calendar.CalendarStateã§ãã ãšããããäŒæ¥ãšèŠãªãããæ¥ïŒããã¯ã·ã¹ãã ã§æ§æãããŸãïŒãšäŒæ¥ãç¶æ ã«ä¿åããå¿ èŠããããŸãã ãããè¡ãããã«ããã®ã¯ã©ã¹ãç¶æ¿ããŸãã
public class TimeSheetsCalendarState extends CalendarState { ..... public Set<Integer> weekends = new HashSet<>(); public Set<String> holidays = new HashSet<>(); .... }
ããã§ããµãŒããŒã¯ã©ã¹com.vaadin.ui.Calendarãç¶æ¿ããŠãæ°ããããããã£ãèšå®ããå¿ èŠããããŸãã
public class TimeSheetsCalendar extends Calendar { .... public TimeSheetsCalendar(CalendarEventProvider eventProvider) { super(eventProvider); getState().weekends = getWeekends(); } @Override public void beforeClientResponse(boolean initial) { super.beforeClientResponse(initial); getState().holidays = getHolidays(); } .... }
ãã®åŸãcom.vaadin.client.ui.VCalendarãŠã£ãžã§ãããç¶æ¿ããäŒæ¥ãã©ããã«å¿ããŠã»ã«ã¹ã¿ã€ã«ãå€æŽããããšãã§ããŸãã
public class TimeSheetsCalendarWidget extends VCalendar { protected Set<Integer> weekends = new HashSet<Integer>(); protected Set<String> holidays = new HashSet<String>(); protected boolean isWeekend(int dayNumber) { return weekends.contains(dayNumber); } protected boolean isHoliday(String date) { return holidays.contains(date); } @Override protected void setCellStyle(Date today, List<CalendarDay> days, String date, SimpleDayCell cell, int columns, int pos) { CalendarDay day = days.get(pos); if (isWeekend(day.getDayOfWeek()) || isHoliday(date)) { cell.addStyleName("holiday"); cell.setTitle(date); } }
ã¯ã©ã¹com.vaadin.client.ui.calendar.CalendarConnectorãå±éããã ãã§ãäŒæ¥ãšé±æ«ã®ããŒã¿ãç¶æ ãããŠã£ãžã§ããã«ã³ããŒããŸãã
@Connect(value = TimeSheetsCalendar.class, loadStyle = Connect.LoadStyle.LAZY) public class TimeSheetsCalendarConnector extends CalendarConnector { @Override public TimeSheetsCalendarWidget getWidget() { return (TimeSheetsCalendarWidget) super.getWidget(); } @Override public TimeSheetsCalendarState getState() { return (TimeSheetsCalendarState) super.getState(); } @Override public void onStateChanged(StateChangeEvent stateChangeEvent) { getWidget().setWeekends(getState().weekends); getWidget().setHolidays(getState().holidays); super.onStateChanged(stateChangeEvent); } }
ãã®çµæãCUBAãã©ãããã©ãŒã ã§äœæãããä»»æã®ç»é¢ã«TimeSheetsCalendarãè¿œå ã§ããŸãã
public class CalendarScreen extends AbstractWindow { @Inject protected BoxLayout calBox; protected TimeSheetsCalendar calendar; .... protected void initCalendar() { .... calendar = new TimeSheetsCalendar(dataSource); .... AbstractOrderedLayout calendarLayout = WebComponentsHelper.unwrap(calBox); calendarLayout.addComponent(calendar); }
ãã³ãã³ãã©ã€ã³ãã«ããŒã«ããããè¿œå ããŸã
ãŠãŒã¶ãŒããã³ãã³ãã©ã€ã³ãã䜿çšããããããããã«ãå ¥åãªãã·ã§ã³ã®ããã³ããã衚瀺ããããšã決å®ããŸããã
Vaadinã«ã¯ããããå®è¡ã§ããAceEditorã³ã³ããŒãã³ãããããŸãã ãã©ãããã©ãŒã ïŒWebSourceCodeEditorïŒã§äœ¿çšãããJPQLã¯ãšãªã®ãã³ããæäŸããŸãïŒããšãã°ãã¬ããŒãã§ã¯ãšãªãç·šéãããšãïŒã
ç§ãã¡ã¯äººçãç°¡çŽ åããããšã«æ±ºããAceEditorã«åºã¥ããŠæ°ããã³ã³ããŒãã³ããäœæãã代ããã«ãWebSourceCodeEditorãæ¡åŒµããŸããã
ãŸããRPCãµãŒãã¹ãç»é²ããããšã§org.vaadin.aceeditor.SuggestionExtensionãæ¡åŒµããŸãããRPCãµãŒãã¹ã¯ã³ãã³ãã©ã€ã³ã®äœ¿çšãåŠçããå¿ èŠããããŸãã
public class CommandLineSuggestionExtension extends SuggestionExtension { protected Runnable applyHandler; public CommandLineSuggestionExtension(Suggester suggester) { super(suggester); registerRpc(new CommandLineRpc() { @Override public void apply() { if (applyHandler != null) { applyHandler.run(); } } }); } public void setApplyHandler(Runnable applyHandler) { this.applyHandler = applyHandler; } public Runnable getApplyHandler() { return applyHandler; } }
次ã«ããã©ãããã©ãŒã ã¯ã©ã¹com.haulmont.cuba.web.gui.components.WebSourceCodeEditorãç»å ŽããŸããã
public class WebCommandLine extends WebSourceCodeEditor implements CommandLine { @Override public void setSuggester(Suggester suggester) { this.suggester = suggester; if (suggester != null && suggestionExtension == null) { suggestionExtension = new CommandLineSuggestionExtension(new CommandLineSourceCodeEditorSuggester()); suggestionExtension.extend(component); suggestionExtension.setShowDescriptions(false); } } protected class CommandLineSourceCodeEditorSuggester extends SourceCodeEditorSuggester { } public CommandLineSuggestionExtension getSuggestionExtension() { return (CommandLineSuggestionExtension) suggestionExtension; } }
æåŸã«ãã¯ã©ã€ã¢ã³ãåŽã®ã¯ã©ã¹ã¯org.vaadin.aceeditor.client.SuggesterConnectorã§ãã
@Connect(CommandLineSuggestionExtension.class) public class CommandLineSuggesterConnector extends SuggesterConnector { protected CommandLineRpc commandLineRpc = RpcProxy.create( CommandLineRpc.class, this); @Override public Command handleKeyboard(JavaScriptObject data, int hashId, String keyString, int keyCode, GwtAceKeyboardEvent e) { if (suggesting) { return keyPressWhileSuggesting(keyCode); } if (e == null) { return Command.DEFAULT; } if (keyCode == 13) {//Enter commandLineRpc.apply(); return Command.NULL;//ignore enter } else if ((keyCode == 32 && e.isCtrlKey())) {//Ctrl+Space startSuggesting(); return Command.NULL; } else if ((keyCode == 50 && e.isShiftKey())//@ || (keyCode == 51 && e.isShiftKey())//# || (keyCode == 52 && e.isShiftKey())//$ || (keyCode == 56 && e.isShiftKey())) {//* startSuggestingOnNextSelectionChange = true; widget.addSelectionChangeListener(this); return Command.DEFAULT; } return Command.DEFAULT; } }
ãã®äžã§ããšãã£ã¿ãŒã®åäœãåå®çŸ©ããŸããã@ãïŒã$ã*ïŒãããžã§ã¯ããã¿ã¹ã¯ãã¿ã°ãã¢ã¯ãã£ããã£ã®çš®é¡ã®ããŒã«ãããïŒãæŒããšãCtrl-Spaceãé€ããŠããŒã«ãããã衚瀺ãããŸãã EnterããŒãæŒããšãã³ãã³ãã©ã€ã³ãé©çšãããŸãïŒã¿ã€ã ã·ãããå ¥åããŸãïŒã
ãã©ãããã©ãŒã æ©èœã®æ¡åŒµ
èŠããŠãããããããŸãããããã©ãããã©ãŒã ãæäŸããUserã¯ã©ã¹ã䜿çšããããšã«ããŸããã ãŠãŒã¶ãŒã¬ã³ãŒãã«ãé±ãããã®å¿ èŠãªåŽåæéæ°ãä¿åã§ããããã«ãããã£ãã®ã§ãã ããã¯ãå ¥åãããããŒã¿ãæ€èšŒããããã«å¿ èŠã§ãïŒäººãã¿ã€ã ã·ãŒã«ãå ã§å¿ èŠä»¥äžãŸãã¯ä»¥äžã瀺ããå ŽåïŒã ã·ã¹ãã ãŠãŒã¶ãŒãåç §ããæ°ãããšã³ãã£ãã£ãäœæãããããã©ãããã©ãŒã ãšã³ãã£ãã£ãå±éããããéžæããŸããã åŽåãç¯çŽããããã«ããã®ã¡ã«ããºã ã¯ïŒäœ¿çšã«é¢ããŠïŒéåžžã«åçŽã§ãããæ£åžžã«æ©èœãããããæ¡åŒµããããšã«ããŸããã 次ã«ããã®æ¡åŒµæ©èœã®å®è£ æ¹æ³ã瀺ããŸãã
æåã«ãcom.haulmont.cuba.security.entity.Userã¯ã©ã¹ã®ç¶æ¿è ãäœæããããã«æ°ãããã£ãŒã«ããè¿œå ããå¿ èŠããããŸããã
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorValue("Ext") @Entity(name = "ts$ExtUser") @Extends(User.class) public class ExtUser extends User { .... @Column(name = "WORK_HOURS_FOR_WEEK", nullable = false) protected BigDecimal workHoursForWeek; public BigDecimal getWorkHoursForWeek() { return workHoursForWeek; } public void setWorkHoursForWeek(BigDecimal workHoursForWeek) { this.workHoursForWeek = workHoursForWeek; } .... }
次ã«ããŠãŒã¶ãŒã®ç·šéç»é¢ãæ¡å€§ããç»é¢ãäœæããã·ã¹ãã ã«ç»é²ããŸããã
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <window xmlns="http://schemas.haulmont.com/cuba/window.xsd" caption="msg://editCaption" class="com.haulmont.timesheets.gui.extuser.ExtUserEdit" extends="/com/haulmont/cuba/gui/app/security/user/edit/user-edit.xml" messagesPack="com.haulmont.timesheets.gui.extuser" xmlns:ext="http://schemas.haulmont.com/cuba/window-ext.xsd"> <layout> <groupBox id="propertiesBox"> <h4></h4> <grid id="propertiesGrid"> <rows> <row id="propertiesRow"> <fieldGroup id="fieldGroupRight"> <column> <field id="workHoursForWeek" caption="msg://com.haulmont.timesheets.entity/ExtUser.workHoursForWeek" ext:index="5"/> </column> </fieldGroup> </row> </rows> </grid> </groupBox> </layout> </window>
çŸåšãUserãšã³ãã£ãã£ã®ä»£ããã«ãExtUserãã·ã¹ãã ã«ååšããç·šéç»é¢ã«workHoursForWeekãã£ãŒã«ããå«ãŸããŠããŸãã
ããã¯ãæ©èœãæ¡åŒµããæãç°¡åãªäŸã§ããæ¡åŒµæ©èœã«ã€ããŠè©³ããç¥ãããå Žåã¯ã èšäºãã芧ãã ãã ã
èªåã§é åžãã
åœåããããã®ã·ã¹ãã ãä»ã®äººã䜿çšãã補åã«ããããšãèšç»ããŠããŸããã ã·ã¹ãã ã®ã€ã³ã¹ããŒã«ãšèµ·åãç°¡åã«ããããã«ãé åžãããã®ãããªãã®ãäœæããããšã«ããŸããã
ãé åžãã¯ãTomcatãµãŒãã¬ããã³ã³ãããšã·ã¹ãã ãèµ·å/åæ¢ããã¹ã¯ãªãããå«ããã©ã«ããŒãå«ãzipãã¡ã€ã«ã§ãã
Gradleã¯ãã©ãããã©ãŒã äžã§ãããžã§ã¯ããæ§ç¯ããããã«äœ¿çšãããããããã®ãããªãé åžããæ§ç¯ããããšã¯é£ãããããŸããã
def distribDir="./distrib" def scriptsDir="./scripts" task cleanTomcatLogs << { def dir = new File(tomcatDir, '/logs/') if (dir.isDirectory()) { ant.delete(includeemptydirs: true) { fileset(dir: dir, includes: '**/*') } } } task copyTomcat(type: Copy, dependsOn: ['setupTomcat',':app-core:deploy', ':app-web:deploy', ':app-web-toolkit:deploy', 'cleanTomcatLogs']) { from file("$tomcatDir/..") include "tomcat/**" into "$distribDir" } task copyLoriScripts(type: Copy) { from file("$scriptsDir") include "*lori.*" into "$distribDir" } task copyTomcatScripts(type: Copy, dependsOn: 'copyTomcat') { from file("$scriptsDir") include "*classpath.*" into "$distribDir/tomcat/bin/" } task buildDistributionZip(type: Zip, dependsOn: ['copyLoriScripts', 'copyTomcatScripts']) { from "$distribDir" exclude "*.zip" baseName = 'lori' version= "$artifactVersion" destinationDir = file("$distribDir") } task distribution(dependsOn: buildDistributionZip) << { }
å¯äžã®åé¡ã¯Tomcatã«ãããŸããã JAVA_HOMEã·ã¹ãã å€æ°ãèšå®ãããŠããªãã·ã¹ãã ã§ã¯ã圌ã¯å¿ æ»ã«èµ·åããããããŸããã§ããã
ãã®å€æ°ãååšããªãããšã圌ã«ç¡èŠãããã«ã¯ãã¹ã¯ãªããsetclasspath.shãšsetclasspath.batãããåçŽãªãã®ã«çœ®ãæããå¿ èŠããããŸããã
ãããã«
æéã远跡ããããã®è£œåã¯å€æ°ãããããããããçåãçããŸãããªãå¥ã®è£œåãäœæããã®ã§ããããã ããã€ãã®çç±ããããŸãã äž»ãªãã®-ç§ãã¡ã®æŽ»ååéïŒãœãããŠã§ã¢éçºïŒã§ã補åãã§ããéãæ£ç¢ºã§äŸ¿å©ã§ããããšãæãã§ããŸããã ããã«ãä»ã®ã·ã¹ãã ãšã®çµ±åã容æã«ããããã»ã¹ã®å€æŽãæ¹åããå¿ èŠããããŸããã æåŸã«ãCUBAãã©ãããã©ãŒã ã§ã®éçºã®è¯ãäŸãšãªã䟿å©ãªã¢ããªã±ãŒã·ã§ã³ãäœæããããšèããŸããã
ã¢ããªã±ãŒã·ã§ã³ã¯ç¡æã§ããã®ã³ãŒãã¯githubã§å ¥æã§ããŸãã Lori Timesheetsãå€æŽããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ããã¬ãã¢ã ã¢ããªã³ã䜿çšããããã CUBA Studioã®åçšã©ã€ã»ã³ã¹ãå¿ èŠã§ãã
Lori Timesheetsãç§ãã¡ã ãã§ãªããä»ã®èª°ãã«ãå©çãããããããšãé¡ã£ãŠããŸãã ãªãŒãã³ãœãŒã¹ãšæ¡åŒµã¡ã«ããºã ã«ãããã¢ããªã±ãŒã·ã§ã³ãèªåçšã«ç°¡åã«é©åãããããšãã§ããŸãã