Skip to content

Commit 61be768

Browse files
author
Vitalii Samolovskikh
committed
AsynchronousMailController
1 parent 107cfc9 commit 61be768

File tree

6 files changed

+424
-0
lines changed

6 files changed

+424
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import grails.plugin.asyncmail.AsynchronousMailMessage
2+
import grails.plugin.asyncmail.MessageStatus
3+
4+
class AsynchronousMailController {
5+
static defaultAction = 'list'
6+
7+
static allowedMethods = [update: 'POST']
8+
9+
/**
10+
* Show all message in table.
11+
*/
12+
def list() {
13+
params.max = Math.min(params.max ? params.max.toInteger() : 10, 100)
14+
params.sort = params.sort ?: 'createDate'
15+
params.order = params.order ?: 'desc'
16+
[list: AsynchronousMailMessage.list(params), total: AsynchronousMailMessage.count()]
17+
}
18+
19+
private withMessage(Closure cl) {
20+
AsynchronousMailMessage message = AsynchronousMailMessage.get(params.id)
21+
if (message) {
22+
return cl(message)
23+
}
24+
25+
flash.message = "Message with id ${params.id} not found."
26+
flash.error = true
27+
redirect(action: 'list')
28+
}
29+
30+
/**
31+
* Show message data.
32+
*/
33+
def show() {
34+
withMessage { AsynchronousMailMessage message ->
35+
return [message: message]
36+
}
37+
}
38+
39+
/**
40+
* Show form for editing.
41+
*/
42+
def edit() {
43+
withMessage { AsynchronousMailMessage message ->
44+
return [message: message]
45+
}
46+
}
47+
48+
/**
49+
* Update message
50+
*/
51+
def update() {
52+
withMessage { AsynchronousMailMessage message ->
53+
bindData(
54+
message, params,
55+
[include:
56+
[
57+
'status',
58+
'beginDate',
59+
'endDate',
60+
'maxAttemptsCount',
61+
'attemptInterval',
62+
'priority',
63+
'markDelete'
64+
]
65+
]
66+
)
67+
message.attemptsCount = 0
68+
if (!message.hasErrors() && message.save()) {
69+
flash.message = "Message ${params.id} was updated."
70+
redirect(action: 'show', id: message.id)
71+
} else {
72+
render(view: 'edit', model: [message: message])
73+
}
74+
}
75+
}
76+
77+
/**
78+
* Abort message sent
79+
*/
80+
def abort() {
81+
withMessage { AsynchronousMailMessage message ->
82+
if (message.abortable) {
83+
message.status = MessageStatus.ABORT
84+
if (message.save()) {
85+
flash.message = "Message ${message.id} was aborted."
86+
} else {
87+
flash.message = "Can't abort message with id ${message.id}."
88+
flash.error = true
89+
}
90+
} else {
91+
flash.message = "Can't abort message with id ${message.id} and status ${message.status}."
92+
flash.error = true
93+
}
94+
redirect(action: 'list')
95+
}
96+
}
97+
98+
/**
99+
* Delete message
100+
*/
101+
def delete() {
102+
withMessage { AsynchronousMailMessage message ->
103+
try {
104+
message.delete()
105+
flash.message = "Message with id ${message.id} was deleted."
106+
redirect(action: 'list')
107+
} catch (Exception e) {
108+
flash.message = "Can't delete message with id ${message.id}."
109+
flash.error = true
110+
redirect(action: 'show', id: message.id)
111+
}
112+
}
113+
}
114+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<%@ page contentType="text/html;charset=UTF-8" %>
2+
<%-- Show flash message --%>
3+
<g:if test="${flash.message}">
4+
<g:set var="flashClass" value="message"/>
5+
<g:if test="${flash.error}">
6+
<g:set var="flashClass" value="${flashClass+' error'}"/>
7+
</g:if>
8+
<div class="${flashClass}">${flash.message}</div>
9+
</g:if>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<%@ page contentType="text/html;charset=UTF-8" %>
2+
<g:each in="${it}" var="addr" status="j"><g:if test="${j != 0}">,</g:if>
3+
<a href="mailto:${addr.encodeAsURL()}">${addr.encodeAsHTML()}</a></g:each>
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
<%@ page import="grails.plugin.asyncmail.MessageStatus; grails.plugin.asyncmail.MessageStatus; grails.plugin.asyncmail.MessageStatus; grails.plugin.asyncmail.MessageStatus; grails.plugin.asyncmail.AsynchronousMailMessage" %>
2+
<html>
3+
<head>
4+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
5+
<link rel="stylesheet" href="${resource(dir: 'css', file: 'asyncmail.css', plugin: 'asynchronous-mail')}"/>
6+
<title>Edit Asynchronous Mail Message</title>
7+
</head>
8+
9+
<body>
10+
11+
<%-- Header --%>
12+
<h1>Edit Asynchronous Mail Message</h1>
13+
14+
<%-- Navigation --%>
15+
<div class="nav">
16+
<span class="menuButton"><a class="home" href="${resource(dir: '')}">Home</a></span>
17+
<span class="menuButton"><g:link class="list" action="list">List</g:link></span>
18+
</div>
19+
20+
<%-- Flash message --%>
21+
<g:render template="flashMessage"/>
22+
23+
<div class="body">
24+
<g:hasErrors bean="${message}">
25+
<div class="error">
26+
<g:renderErrors bean="${message}" as="list"/>
27+
</div>
28+
</g:hasErrors>
29+
<g:form method="post">
30+
<input type="hidden" name="id" value="${message.id}"/>
31+
32+
<table>
33+
<tbody>
34+
<tr class="odd">
35+
<td class="fieldName">Subject:</td>
36+
<td>${fieldValue(bean: message, field: 'subject')}</td>
37+
</tr>
38+
39+
<tr class="even ${hasErrors(bean: message, field: 'status', 'error')}">
40+
<td class="fieldName">Status:</td>
41+
<td>
42+
<g:select
43+
from="${[MessageStatus.CREATED, MessageStatus.ABORT]}"
44+
value="${message.status}" name="status"/>
45+
</td>
46+
</tr>
47+
48+
<tr class="odd ${hasErrors(bean: message, field: 'beginDate', 'error')}">
49+
<td class="fieldName">Begin date:</td>
50+
<td><g:datePicker name="beginDate" value="${message.beginDate}" precision="minute"/></td>
51+
</tr>
52+
53+
<tr class="even ${hasErrors(bean: message, field: 'endDate', 'error')}">
54+
<td class="fieldName">End date:</td>
55+
<td><g:datePicker name="endDate" value="${message.endDate}" precision="minute"/></td>
56+
</tr>
57+
58+
<tr class="odd ${hasErrors(bean: message, field: 'maxAttemptsCount', 'error')}">
59+
<td class="fieldName">Max attempts count:</td>
60+
<td valign="top" class="value">
61+
<input type="text" id="maxAttemptsCount" name="maxAttemptsCount"
62+
value="${fieldValue(bean: message, field: 'maxAttemptsCount')}"/>
63+
</td>
64+
</tr>
65+
66+
<tr class="even ${hasErrors(bean: message, field: 'attemptInterval', 'error')}">
67+
<td class="fieldName">Attempt interval (ms):</td>
68+
<td valign="top" class="value">
69+
<input type="text" id="attemptInterval" name="attemptInterval"
70+
value="${fieldValue(bean: message, field: 'attemptInterval')}"/>
71+
</td>
72+
</tr>
73+
74+
<tr class="odd ${hasErrors(bean: message, field: 'priority', 'error')}">
75+
<td class="fieldName">Priority:</td>
76+
<td valign="top" class="value">
77+
<input type="text" id="priority" name="priority"
78+
value="${fieldValue(bean: message, field: 'priority')}"/>
79+
</td>
80+
</tr>
81+
82+
<tr class="even ${hasErrors(bean: message, field: 'markDelete', 'error')}">
83+
<td class="fieldName">Delete after sent:</td>
84+
<td valign="top" class="value">
85+
<g:checkBox name="markDelete" checked="${message.markDelete}"/>
86+
</td>
87+
</tr>
88+
</tbody>
89+
</table>
90+
91+
<div class="buttons">
92+
<span class="button"><g:actionSubmit class="save" value="Update"/></span>
93+
<g:if test="${message.abortable}">
94+
<span class="button"><g:actionSubmit class="delete" action="abort"
95+
onclick="return confirm('Are you sure?');" value="Abort"/></span>
96+
</g:if>
97+
<span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');"
98+
action="delete" value="Delete"/></span>
99+
</div>
100+
</g:form>
101+
</div>
102+
</body>
103+
</html>
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<%@ page import="grails.plugin.asyncmail.MessageStatus; grails.plugin.asyncmail.AsynchronousMailMessage" %>
2+
<html>
3+
<head>
4+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
5+
<link rel="stylesheet" href="${resource(dir:'css',file:'asyncmail.css',plugin: 'asynchronous-mail')}" />
6+
<title>Asynchronous Mail Message List</title>
7+
</head>
8+
9+
<body>
10+
11+
<%-- Header --%>
12+
<h1>Asynchronous Mail Message List</h1>
13+
14+
<%-- Navigation --%>
15+
<div class="nav">
16+
<span class="menuButton"><a class="home" href="${resource(dir: '')}">Home</a></span>
17+
</div>
18+
19+
<%-- Flash message --%>
20+
<g:render template="flashMessage"/>
21+
22+
<%-- Table --%>
23+
<div class="body">
24+
<table>
25+
<thead>
26+
<tr>
27+
<g:sortableColumn property="id" title="Id"/>
28+
<g:sortableColumn property="subject" title="Subject"/>
29+
<th>To</th>
30+
<g:sortableColumn property="createDate" title="Create Date"/>
31+
<th>Status</th>
32+
<th>Actions</th>
33+
</tr>
34+
</thead>
35+
<tbody>
36+
<g:each in="${list}" status="i" var="message">
37+
<tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
38+
<td class="id">${message.id}</td>
39+
<td><g:link action="show" id="${message.id}">${fieldValue(bean: message, field: 'subject')}</g:link></td>
40+
<td><g:render template="listAddr" bean="${message.to}"/></td>
41+
<td><g:formatDate date="${message.createDate}" format="yyyy-MM-dd HH:mm:ss"/></td>
42+
<td>${fieldValue(bean: message, field: 'status')}</td>
43+
<td>
44+
<g:link action="show" id="${message.id}">show</g:link>
45+
<g:link action="edit" id="${message.id}">edit</g:link>
46+
<g:if test="${message.abortable}">
47+
<g:link action="abort" id="${message.id}"
48+
onclick="return confirm('Are you sure?');">abort</g:link>
49+
</g:if>
50+
<g:link action="delete" id="${message.id}"
51+
onclick="return confirm('Are you sure?');">delete</g:link>
52+
</td>
53+
</tr>
54+
</g:each>
55+
</tbody>
56+
</table>
57+
58+
<div class="paginate">
59+
<g:paginate total="${total}"/>
60+
</div>
61+
</div>
62+
</body>
63+
</html>

0 commit comments

Comments
 (0)