ããã¯äœã§ããïŒ
ãŸã£ããææããããªã人åãïŒã¯ãŒã¯ãããŒãæäŸãã補åïŒäž»ã«JIRAãšConfluenceã§ãããããããITå°é家ãªã誰ã§ãç°¡åã«ååãä»ããããšãã§ããïŒã§ç¥ãããAtlassianã«ã¯ããããã®è£œåã®ãã©ã°ã€ã³ãéçºããããã®SDKããããŸãã ãã®SDKã®äžéšãšããŠéçºè ãå©çšã§ããããŒã«ã®äžã«ã¯ãAtlassian User InterfaceïŒAUIïŒWebã€ã³ã¿ãŒãã§ã€ã¹ãéçºããããã®ãµãã·ã¹ãã ããããŸãã ãŸããAUIã®æ©èœã«ã¯ãããããRESTfulããŒãã«ããããŸããããã¯ãã€ã³ã¿ã©ã¯ãã£ããªããŒãã«ãå®è£ ããããã®ã¿ãŒã³ããŒãœãªã¥ãŒã·ã§ã³ã§ããããã¹ãŠã®å€æŽã¯RESTãµãŒãã¹ã®ã»ããã䜿çšããŠãµãŒããŒåŽã§ãªã¢ã«ã¿ã€ã ã«ä¿åãããŸãã
æè¿ãç§ã¯ãã®ãããªããŒãã«ãæžãå¿ èŠããããŸãã-ãã®åã«ç§ã¯ãããããå¿ èŠããªãã£ãã®ã§ã å ¬åŒããã¥ã¢ã«ã®çŸåšã®ïŒAUI 7.6.2ïŒããŒãžã§ã³ã«ç®ãåããŸããããããã¯ååã§ã¯ãªãããšãããããŸããã ç§ã¯æ å ±ãå ¥æããªããã°ãªããŸããã§ãã-ãã©ãŒã©ã ãšAUIèªäœã®ãœãŒã¹ã³ãŒãã§ãåŸè ãå©çšå¯èœã§ãããã ïŒãããŠãã¡ãªã¿ã«ãRESTfulãªäœæ¥ããŒãã«ã®è¯ãäŸãå«ãŸããŠããŸãããæ®å¿µãªããã詳现ãªã³ã¡ã³ãã¯ãããŸããïŒã ãããã¯ãŒã¯ã§èŠã€ãã£ãã®ã£ãããåããã¬ã€ããèŠã€ãããŸããã§ãããä»ã®äººããããŠããããèªåèªèº«ã®ããã«ãåæ§ã®ã¿ã¹ã¯ã容æã«ããããã«æãäžãããã®ããŸãšããããšæããŸããã ä»äºã«åºã¥ããŠããã¡ãããããã¯ãŸã å ¬åŒã¬ã€ãã«åºã¥ããŠããã¯ãã§ããããã®ããã¹ãã¯ããããè¿œå ãããŸã...ãããã«ããããããæŽæ°ããããŸã§ã
補åãšããŒãžã§ã³
äœæ¥äžã«ãç§ã¯äœ¿çšããŸããïŒ
- Java 8
- Atlassian Plugin SDK 6.3.6ïŒç¹ã«ãã¢ã»ã³ããªãããã«å«ãŸããMaven 3.2.1ã®ã€ã³ã¹ã¿ã³ã¹ã«ããŸããïŒ
- JIRA 7.7.0 CoreïŒãã©ã°ã€ã³ã¯JIRAã§äœæããããã®ããŒãžã§ã³ã§ã®ã¿ãã¹ããããŸããïŒ
åé¡ã®å£°æ
ãããã£ãŠãè¡ãè¿œå /åé€ããæ¢åã®è¡ã®å 容ãå€æŽããè¡ã亀æããã«ã¯ãJIRAã®ã©ããã«ããŒãã«ãå«ãããŒãžãå¿ èŠã§ãã ããŒãã«ã®å 容ã®å€æŽã¯ããµãŒããŒåŽã®ã¹ãã¬ãŒãžã«åæçã«èšé²ããå¿ èŠããããŸã-ååãšããŠãããã¯ããŒã¿ããŒã¹ãŸãã¯ãã®ä»ã®äžæ®çºæ§ãœãªã¥ãŒã·ã§ã³ã§ãããããŒãã«ãšãµãŒããŒåŽãšã®çžäºäœçšã«èå³ããããããã¡ã¢ãªå ã®ã¹ãã¬ãŒãžã«å¶éããŸã-ããã«ãããååŸã§ããããã«ãªããŸã以åã«ããŒãã«ã®ããããŒãžã«æ»ã£ãŠããŒã¿ãä¿åããŸãããããµãŒããŒã®é»æºãåã£ããšããããã©ã°ã€ã³ãåã€ã³ã¹ããŒã«ãããšããªã©ã¯ä¿åããªãã§ãã ããã
æºåãã
æåã«ã1ã€ã®æ°ããããŒãžïŒApache Velocity圢åŒã§ããŒãžãæç»ãããµãŒãã¬ããã¢ãžã¥ãŒã«ãšããŸãïŒãå«ãJIRAçšã®ãã©ã°ã€ã³ãäœæããŸãã JIRAããããŒå ã®ãªã³ã¯ã ããã«ã€ããŠã¯è©³ãã説æããŸãã-ååãšããŠããããã¯ç°¡åãªæäœã§ãã ãããã®å Žåã§ãã Bitbucketã§åäœãããµã³ãã«ã³ãŒããå©çšã§ããŸã ã
å®è£ ïŒããã³ããšã³ã
ã¢ãã©ã·ã¢ã³ã®å ¬åŒã®ãªãŒããŒã·ããã«åºã¥ããŠè¡åããããšããŸãã ãŸããããŒãžã«éåžžã®HTMLããŒãã«ãè¿œå ããŸãããããRESTfulããŒãã«ã«ãªããŸã
<table id="event-rt"></table>
...ãã©ã°ã€ã³èšè¿°åïŒatlassian-plugin.xmlïŒã®JSã¹ã¯ãªããã®web-resourceã¢ãžã¥ãŒã«ãž-察å¿ããã©ã€ãã©ãªã«äŸåããŸãïŒ
<web-resource key="events-restful-table-script" name="events-restful-table-script"> <resource type="download" name="events-restful-table.js" location="/js/events-restful-table.js"/> <dependency>com.atlassian.auiplugin:ajs</dependency> <dependency>com.atlassian.auiplugin:aui-experimental-restfultable</dependency> </web-resource>
...ããã³ã¹ã¯ãªããèªäœ-æ¢åã®ããŒãã«ã«åºã¥ããŠã1ã€ã®æååãã©ã¡ãŒã¿ãŒã䜿çšããæå°ã®RESTfulããŒãã«ãäœæããŸãã
AJS.$(document).ready(function () { new AJS.RestfulTable({ autoFocus: false, el: jQuery("#event-rt"), allowReorder: true, resources: { all: "rest/evt-restful-table/1.0/events-restful-table/all", self: "rest/evt-restful-table/1.0/events-restful-table/self" }, columns: [ { id: "name", header: "Event name" } ] }); });
å®äº-ãã©ã°ã€ã³ãã¢ã»ã³ãã«ããããšã§ãããŒãžã«æ¬åœã«ç®çã®ã³ã³ãã³ãã®è¡ãè¿œå ããç·šéãåé€ã亀æã§ããæ°ããããŒãã«ãããããšã確èªã§ããŸãã ãµãŒããŒåŽã§ã¯ããããã®å€æŽã¯ãã¡ããä¿®æ£ãããŠããŸããã
å®è£ ïŒããã¯ãšã³ã
ããã¯ç§ãä»ããããšã§ãã ããã¥ã¢ã«ã«ãããšãã·ã¹ãã ã«ä¿åããããã¹ãŠã®ããŒã¿ãããŒãã«ã¢ãã«çšã«æäŸããRESTãªãœãŒã¹ãšãã¢ãã«ã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã§CRUDæäœãå®è¡ã§ããå¥ã®ãªãœãŒã¹ïŒããæ£ç¢ºã«ã¯ã1ã€ã®ãªãœãŒã¹ã§ã¯ãªãããããã®ã»ããïŒãå¿ èŠã§ãã ãã®å Žåã1ã€ã®äžè¬çãªã³ã³ãããŒã©ãŒã¯ã©ã¹ãšããŒã¿ã¢ãã«ã¯ã©ã¹ãšããŠå®è£ ããŸãã
@Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) @Path("/events-restful-table/") public class RestfulTableController { private List<RestfulTableRowModel> storage = new ArrayList<>(); @GET @Path("/all") public Response getAllEvents() { return Response.ok(storage.stream() .sorted(Comparator.comparing(RestfulTableRowModel::getId).reversed()) .collect(Collectors.toList())).build(); } @GET @Path("/self/{id}") public Response getEvent(@PathParam("id") String id) { return Response.ok(findInStorage(id)).build(); } @PUT @Path("/self/{id}") public Response updateEvent(@PathParam("id") String id, RestfulTableRowModel update) { RestfulTableRowModel model = findInStorage(id); Optional.ofNullable(update.getName()).ifPresent(model::setName); return Response.ok(model).build(); } @POST @Path("/self") public Response createEvent(RestfulTableRowModel model) { model.setId(generateNewId()); storage.add(model); return Response.ok(model).build(); } @DELETE @Path("/self/{id}") public Response deleteEvent(@PathParam("id") String id) { storage.remove(findInStorage(id)); return Response.ok().build(); } private RestfulTableRowModel findInStorage(String id) { return storage.stream() .filter(item -> item.getId() == Long.valueOf(id)) .findAny() .orElse(null); } private long generateNewId() { return storage.stream() .mapToLong(RestfulTableRowModel::getId) .max().orElse(0) + 1; } }
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class RestfulTableRowModel { @XmlElement(name = "id") private long id; @XmlElement(name = "name") private String name; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
ãã©ã°ã€ã³èšè¿°åã®å¯Ÿå¿ããæ®ãã®ã¢ãžã¥ãŒã«ïŒ
<rest name="Events RESTful Table Resource" key="events-restful-table-resource" path="/evt-restful-table" version="1.0"/>
RESTãªãœãŒã¹ã³ãŒãã§ã¯ã次ã®ç¹ã«æ³šæããŠãã ããã
- ãªããžããªå ã®ã¬ã³ãŒããäœæããã³æŽæ°ããRESTãªãœãŒã¹ã¡ãœããããå¿çã®äžéšãšããŠãã®ã¬ã³ãŒãã®çµæãªããžã§ã¯ããè¿ããŸããäžè¬ã«ãããã¯å®å šã«äžè¬çãªæ¹æ³ã§ãã åé¡ã¯ããã®æ £è¡ã«ã€ããŠç¥ããªãå Žåãããã匷å¶ãããã®ã¯äœããªããšããããšã§ãã ããããªããšãããŒãã«ã¯æ£ããæ©èœããŸããã
- ããŒãã«å ã®ã¬ã³ãŒããç·šéãããšãå€æŽããããã£ãŒã«ãã®å€ã®ã¿ããµãŒããŒã«æž¡ãããæ®ãã®ä»£ããã«nullãæ¥ãããããªããžããªã®ã¬ã³ãŒããªããžã§ã¯ãã«æ°ããå€ãæžã蟌ãåã«ãããã®ååšã確èªããå¿ èŠããããŸã 空ã®å€ã¯ç©ºã®æååã®åœ¢ã§ãµãŒããŒã«éãããnullã§ã¯ãªããããæååãã£ãŒã«ãã®å Žåã¯æ°ãã空ã®å€ãšå€æŽããªãããšãåºå¥ããåé¡ã¯ãããŸãã-ããããããªããã£ãåã®ãã£ãŒã«ãã®å Žåãå°é£ãçããå¯èœæ§ããããŸã;
- ã¬ã³ãŒãã¯ã©ã¹ã«ã¯idãã£ãŒã«ãããããŸããããŒãã«ã«ã¯è¡šç€ºãããŸããããã¬ã³ãŒããèå¥ããããã«äœ¿çšãããŸãã IDã¯ãµãŒããŒã«ãã£ãŠçæãããäœæãããã¹ãã¬ãŒãžã¬ã³ãŒããªããžã§ã¯ãã®äžéšãšããŠã¯ã©ã€ã¢ã³ãã«è¿ãããŸãã éèŠïŒidã¯ãJavascriptè¡šçŸãããŒã«å€trueã«ãã£ã¹ããããfalseã§ã¯ãªãããã«ããå¿ èŠããããŸããç¹ã«ã0ã¯è¯ããããŸããã
- ãµãŒããŒäžã®ã¬ã³ãŒãã¯ïŒãã®å Žåã¯idã§ïŒãœãŒããããŸã-ãã¡ããããã¯å¿ èŠã§ã¯ãããŸããããå®éã®ã¿ã¹ã¯ã§ã¯å¿ èŠã«ãªãã§ãããã é åºã¯èªç¶ãªé åºãšã¯éã«ãªã£ãŠããããšã«æ³šæããŠãã ãã-ããã«ãããããŒãã«ã«ã¬ã³ãŒããè¿œå ãããšãã«çŽæ¥çºçããååºåïŒããŒãžã®ãªããŒããªã©ïŒæã«åãé åºã®ã¬ã³ãŒããä¿åã§ããŸãã ãã ããè¡šã«ã¯ãªãã·ã§ã³ãcreatePositionããããããã®äŸã®ããã«å€ãbottomãã§æ°ãããšã³ããªãäžããã§ã¯ãªãäžããè¿œå ã§ããŸãããã®å Žåããã®ãããªå転ã¯ãã¡ããäžèŠã§ãã
ãã©ã°ã€ã³ããŸãšãã...é©ãïŒ ãã©ã°ã€ã³ç®¡çããŒãžã§ç¢ºèªã§ããããã«ãRESTãªãœãŒã¹ãã·ã¹ãã ã«è¿œå ãããŠããŸãããããŒã¿ãä¿åããããšã¯æãã§ããŸããã ãã©ãŠã¶ã³ã³ãœãŒã«ãéããšãçç±ãç°¡åã«å€æã§ããŸããRESTãªãœãŒã¹ã¯404ãšã©ãŒãè¿ããŸããã€ãŸãã䜿çšãããŠããã¢ãã¬ã¹ã«ã¯ååšããŸããã å®éãã¢ãã¬ã¹ã¯åé¡ã§ãããã©ãŠã¶ãŒã¯ããã©ãŒã ã<your_JIRA> /plugins/servlet/rest/evt-restful-table/1.0/events-restful-table/ãã®ã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ããŸããããªãœãŒã¹ã¯ã<your_JIRAããšãã圢åŒã®ã¢ãã¬ã¹ã«ãããŸã> /rest/evt-restful-table/1.0/events-restful-table/ "ïŒããšãã°ã Atlassian REST API Browserãã©ã°ã€ã³ã䜿çšããŠããã確èªã§ããŸãïŒã ããŒãã«ãã¯ãšãªã«äœ¿çšããå®éã®ãã¹ã¯ãçŸåšã®ããŒãžã®ã¢ãã¬ã¹ã«åºã¥ããŠæ§ç¯ãããŸãïŒããšãã°ãããŒãžãæç»ãããµãŒãã¬ãããžã®ãã¹ãäœæãããšãã¯ãšãªã®ãã¹ã¯ããã«å¿ããŠå€æŽãããŸãïŒã ãã ãããã¹ãã¹ã©ãã·ã¥ïŒã/ãïŒã§éå§ãããšç¶æ³ãå€ãããŸãããã®å ŽåããªãœãŒã¹ãžã®ãã«ãã¹ã¯ãã¹ãåãšãªãœãŒã¹ãžã®æå®ãã¹ã§æ§æãããŸãã ãã®çŸè±¡ã®çç±ã¯ãççŽã«èšã£ãŠãæ ãè
ã§ãã ããã§ã®ãã€ã³ãã¯AUIã§ãããªããåºç€ãšãªãBackbone.jsã§ãããšããçãããããŸãã ãããã«ããŠããJIRAããŒã¹URLããã¹ãåãšäžèŽããªãéããåãã¹ã®å
é ã«åã«ã¹ã©ãã·ã¥ãè¿œå ããã ãã§ã¯ååã§ã¯ãããŸããã æ®éçãªè§£æ±ºçã¯ãã¢ã¯ã»ã¹å¯èœãªïŒãããŠã¹ã©ãã·ã¥ã§å§ãŸãïŒã³ã³ããã¹ããã¹ã§ãã
resources: { all: AJS.contextPath() + "/rest/evt-restful-table/1.0/events-restful-table/all", self: AJS.contextPath() + "/rest/evt-restful-table/1.0/events-restful-table/self" },
å¥ã®ãœãªã¥ãŒã·ã§ã³ãå¯èœã§ããã¢ããªã±ãŒã·ã§ã³ã®ããŒã¹URLããçžå¯ŸURLã§ã¯ãªãå®å šãªURLãäœæããRESTãªãœãŒã¹ãžã®ãã¹ãèªåã§äœæããŸãã
resources: { all: AJS.params.baseURL + "/rest/evt-restful-table/1.0/events-restful-table/all", self: AJS.params.baseURL + "/rest/evt-restful-table/1.0/events-restful-table/self" },
ãããã®URLã¯ãè¿œå ã®å€æãªãã§äœ¿çšãããŸãã
ãã©ã°ã€ã³ãå床ã³ã³ãã€ã«ããé©åãªãã¹ã瀺ããŠããŸãã çŸåšãããŒãã«å ã®ã¬ã³ãŒãã¯å®æçã«äœæãç·šéãåé€ãããŸãã ãã¹ãŠãæ©èœããŠããããã§ã...ãã¡ãïŒ ããã§ããªãã
åç·
ããŒãã«ã¯ããã©ãã°ïŒããããè¡ããµããŒãããå¿ èŠããããŸãïŒãããç¡å¹ã«ã§ããèšå®ããããŸããã䜿çšããŸããã§ããïŒã ããã§ãè¡ã®ãããããã©ããã«ãã©ãã°ããããšããŠãæ©èœããŸãããããŒãžããªããŒãããåŸãè¡ã¯åãäœçœ®ã«ãªããŸãã è¡äœçœ®ã®å€æŽããµãŒããŒã«åæ ããã«ã¯ãããã¥ã¢ã«ã«èšèŒãããŠããªãå¥ã®RESTãªãœãŒã¹-移åãå¿ èŠã§ããããã¯ã移åã®è©³çŽ°ã«é¢ããæ å ±ãåãåããŸãã 圌ã¯2ã€ã®ãã©ã¡ãŒã¿ãæã€ãªããžã§ã¯ããåãåãããšãæåŸ ããŠããŸãïŒafter-ãã©ãã°å¯èœããã³ãã©ãã°ãé 眮ããäžã®è¡ã«å¯Ÿå¿ããããŒã¿èŠçŽ ã®RESTãªãœãŒã¹ãžã®ãã¹ãããã³position-4ã€ã®å®æ°ã®1ã€ã䜿çšããèŠçŽ ã®æ°ããäœçœ®ã®èª¬æïŒFirstãLastãEarlierãŸãã¯åŸã§ïŒãã ããå®éã«ã¯ãRESTfulããŒãã«ã®çŸåšã®å®è£ ã§ã¯First ...ã®ã¿ã䜿çšããŸããã4ã€ãã¹ãŠã«å¯ŸããŠåŠçãå®è£ ããå¿ èŠããããŸãïŒã åæåã§ããã®ã¯2ã€ã®ãã£ãŒã«ãã®ãã¡1ã€ã ãã§ãã ããããããããããã«ãJavaã¢ãã«æååã®ãã£ãŒã«ããäœæããŸããããããã¯æã䟿å©ãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããã
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class MoveInfo { @XmlElement(name = "position") private String position; @XmlElement(name = "after") private String after; public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public String getAfter() { return after; } public void setAfter(String after) { this.after = after; } }
ãããŠããããç§ã®RESTãªãœãŒã¹ãå®è£ ããå®éã®ã¡ãœããã§ãïŒ
@POST @Path("/self/{id}/move") public Response moveEvent(@PathParam("id") String idString, MoveInfo moveInfo) { long oldId = Long.valueOf(idString); long newId; if (moveInfo.getAfter() != null) { String[] afterPathParts = moveInfo.getAfter().split("/"); long afterId = Long.valueOf(afterPathParts[afterPathParts.length - 1]); newId = afterId > oldId ? afterId - 1 : afterId; } else if (moveInfo.getPosition() != null) { switch (moveInfo.getPosition()) { case "First": newId = getLastId(); break; case "Last": newId = 1L; break; case "Earlier": newId = oldId < getLastId() ? oldId + 1 : oldId; break; case "Later": newId = oldId > 1 ? oldId - 1 : oldId; break; default: throw new IllegalArgumentException("Unknown position type!"); } } else { throw new IllegalArgumentException("Invalid move data!"); } if (newId > oldId) { storage.stream() .filter(entry -> entry.getId() <= newId && entry.getId() >= oldId) .forEach(entry -> entry.setId(entry.getId() == oldId ? newId : entry.getId() - 1)); } else if (newId < oldId) { storage.stream() .filter(entry -> entry.getId() >= newId && entry.getId() <= oldId) .forEach(entry -> entry.setId(entry.getId() == oldId ? newId : entry.getId() + 1)); } return Response.ok().build(); }
泚ïŒãã®å Žåã«äœ¿çšãããããŒãã«å ã®èŠçŽ ã®ãœãŒãæ¹æ³ã«æ£ç¢ºã«é¢é£ããŠããŸãã éã®é åºã§äžŠã¹æ¿ããã«ã¯ããã®ã¡ãœãããå€æŽããå¿ èŠããããŸãã
ã芧ã®ããã«ããã®ã¡ãœããã¯ãã©ãŠã¶ã«ãšã£ãŠæå³ã®ãããã®ãè¿ããŸãããïŒå¯èœã§ããïŒãäžè¬ã«ç§»åèŠæ±ã®çµæãåŠçããå¿ èŠããããŸãïŒè¿ããããšãããã¥ã¢ã«ã«èšèŒãããŠããªãREORDER_SUCCESSã€ãã³ããçºçããŸããããŒãã«ã®ç§»åãããè¡ã®ã¢ãã«ã¯å€ãIDãä¿æããŸãïŒæ®å¿µãªããããããã¯èªåçã«é ä¿¡ãããŸããã§ããïŒãããã¯ããã©ãŠã¶ãŒãšãµãŒããŒã§åæãããŠããªãããŒã¿ãæå³ãããããããŒãã«ã®ã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ãããã«æäœããŠããäœãè¯ãçµæã«ã¯ãªããŸããã ãããã£ãŠããã®å ŽåïŒå®éã«ã¯ããªãäžçµæžã§ããïŒãæãç°¡åãªæ¹æ³ã¯ããµãŒããŒããå€æŽã«é¢ããããŒã¿ãè¿ããŠæ£ããå Žæã«ããã·ã¥ããã®ã§ã¯ãªããåã«ããŒãã«ãåä¿¡ããŠââãã¹ãŠã®ããŒã¿ãå床æç»ããããšã§ãã æåã§è¡ãå¿ èŠãããã®ã¯ãtbodyããŒãã«ã®å€ãå 容ãåé€ããããšã ãã§ãã
AJS.$(document).ready(function () { AJS.TableExample = {}; AJS.TableExample.table = new AJS.RestfulTable({ // ... }); AJS.$(document).bind(AJS.RestfulTable.Events.REORDER_SUCCESS, function () { AJS.TableExample.table.$tbody.empty(); AJS.TableExample.table.fetchInitialResources(); });
ããã§ãã¹ãŠã§ãïŒ
ä»ã®ãã£ãŒã«ãã¿ã€ã
ç§ã®ããŒãã«ã¯å®å šã«æ©èœããŠããŸãããã»ãšãã©åœ¹ã«ç«ã¡ãŸãããå®éãããã¯åãªãè¡ã®ãªã¹ãã§ãã ãã¡ãããæååãã£ãŒã«ããè¿œå ããããšãã§ããŸãããå®éã®ããŒãã«ã§ã¯ãè¡ã ãã§ãªããæ¥ä»ããã§ãã¯ããã¯ã¹ãã³ã³ãããã¯ã¹ãªã©ãä»ã®äœãã衚瀺ãããã§ããããããšãã°ãæ¥ä»ãè¿œå ããŸã-ä»ã®ãã£ãŒã«ããåæ§ã«äœæãããŸãã
ã«ã¹ã¿ã ãã¥ãŒãã£ãŒã«ããããŒãã«ã«è¿œå ããã«ã¯ãçŸåšäœæãç·šéãããã³éã¢ã¯ãã£ãã«ãªã£ãŠããè¡ã§ãããããäœæãç·šéãèªã¿åãçšã®ã«ã¹ã¿ã ãã¥ãŒãæäŸããå¿ èŠããããŸãã æ¥ä»ãäœæããã³ç·šéããã«ã¯ãaui-date-pickerã䜿çšããŸããããã¯ãAUIã«ã€ããŠèª¬æããŠããããã§ããéã¢ã¯ãã£ããªè¡ã®å Žåãéåžžã®ã¹ãã³ã§ååã§ãã
{ id: "date", header: "Event date", createView: AJS.RestfulTable.CustomCreateView.extend({ render: function (self) { var $field = AJS.$('<input type="date" class="text aui-date-picker" name="date" />'); $field.datePicker({'overrideBrowserDefault': true}); return $field; } }), editView: AJS.RestfulTable.CustomEditView.extend({ render: function (self) { var $field = AJS.$('<input type="date" class="text aui-date-picker" name="date">'); $field.datePicker({'overrideBrowserDefault': true}); if (!_.isUndefined(self.value)) { $field.val(new Date(self.value).print("%Y-%m-%d")); } return $field; } }), readView: AJS.RestfulTable.CustomReadView.extend({ render: function (self) { var val = (!_.isUndefined(self.value)) ? new Date(self.value).print("%Y-%m-%d") : undefined; return '<span data-field-name="date">' + (val ? val : '') + '</span>'; } }) }
ãããã£ãŠãããŒã¿ã¢ãã«ã®javaã¯ã©ã¹ãæŽæ°ããŸãã
@XmlElement(name = "date") private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; }
...ãããŠãæŽæ°ã¡ãœããã«æ¥ä»åŠçãè¿œå ããŸãã
Optional.ofNullable(update.getDate()).ifPresent(model::setDate);
å®äº-ç®çã®ã¿ã€ãã®æ°ãããã£ãŒã«ããããŒãã«ã«è¡šç€ºãããŸãã
説æãšè¿œå ãåãã§ããããŸãã