liquid_feedback_frontend
view app/main/draft/new.lua @ 1495:17e7082c377a
Added image attachments for initiatives
author | bsw |
---|---|
date | Mon Feb 10 21:10:49 2020 +0100 (2020-02-10) |
parents | 32cc544d5a5b |
children | ed3c40911ae1 |
line source
1 local initiative = Initiative:by_id(param.get("initiative_id"))
2 initiative:load_everything_for_member_id(app.session.member_id)
3 initiative.issue:load_everything_for_member_id(app.session.member_id)
5 if initiative.issue.closed then
6 slot.put_into("error", _"This issue is already closed.")
7 return
8 elseif initiative.issue.half_frozen then
9 slot.put_into("error", _"This issue is already frozen.")
10 return
11 elseif initiative.issue.phase_finished then
12 slot.put_into("error", _"Current phase is already closed.")
13 return
14 end
16 local draft = initiative.current_draft
17 if config.initiative_abstract then
18 draft.abstract = string.match(draft.content, "(.+)<!%--END_OF_ABSTRACT%-->")
19 if draft.abstract then
20 draft.content = string.match(draft.content, "<!%--END_OF_ABSTRACT%-->(.*)")
21 end
22 end
24 ui.form{
25 record = draft,
26 attr = { class = "vertical section", enctype = 'multipart/form-data' },
27 module = "draft",
28 action = "add",
29 params = { initiative_id = initiative.id },
30 routing = {
31 ok = {
32 mode = "redirect",
33 module = "initiative",
34 view = "show",
35 id = initiative.id
36 }
37 },
38 content = function()
40 ui.grid{ content = function()
41 ui.cell_main{ content = function()
42 ui.container{ attr = { class = "mdl-card mdl-shadow--2dp mdl-card__fullwidth" }, content = function()
43 ui.container{ attr = { class = "mdl-card__title mdl-card--border" }, content = function()
44 ui.heading { attr = { class = "mdl-card__title-text" }, level = 2, content = initiative.display_name }
45 end }
46 ui.container{ attr = { class = "mdl-card__content mdl-card--border" }, content = function()
47 if param.get("preview") then
48 ui.sectionRow( function()
49 if config.initiative_abstract then
50 ui.field.hidden{ name = "abstract", value = param.get("abstract") }
51 ui.container{
52 attr = { class = "abstract" },
53 content = param.get("abstract")
54 }
55 slot.put("<br />")
56 end
57 local draft_text = param.get("content")
58 local draft_text = util.wysihtml_preproc(draft_text)
59 ui.field.hidden{ name = "content", value = draft_text }
60 ui.container{
61 attr = { class = "draft" },
62 content = function()
63 slot.put(draft_text)
64 end
65 }
66 slot.put("<br />")
68 if config.attachments then
69 local file_upload_session = param.get("file_upload_session") or multirand.string(
70 32,
71 '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
72 )
73 file_upload_session = string.gsub(file_upload_session, "[^A-Za-z0-9]", "")
74 ui.field.hidden{ name = "file_upload_session", value = file_upload_session }
75 local files = File:new_selector()
76 :left_join("draft_attachment", nil, "draft_attachment.file_id = file.id")
77 :add_where{ "draft_attachment.draft_id = ?", initiative.current_draft.id }
78 :reset_fields()
79 :add_field("file.id")
80 :add_field("draft_attachment.title")
81 :add_field("draft_attachment.description")
82 :add_order_by("draft_attachment.id")
83 :exec()
85 if #files > 0 then
86 ui.container {
87 content = function()
88 for i, file in ipairs(files) do
89 if param.get("file_delete_" .. file.id, atom.boolean) then
90 ui.field.hidden{ name = "file_delete_" .. file.id, value = "1" }
91 else
92 ui.image{ module = "file", view = "show.jpg", id = file.id, params = { preview = true } }
93 ui.container{ content = file.title or "" }
94 ui.container{ content = file.description or "" }
95 slot.put("<br /><br />")
96 end
97 end
98 end
99 }
100 end
101 local filename = encode.file_path(WEBMCP_BASE_PATH, 'tmp', "file_upload-" .. file_upload_session .. ".json")
102 local fh = io.open(filename, "r")
103 if fh then
104 local file_uploads = json.import(fh:read("*a"))
105 for i, file_upload in ipairs(file_uploads) do
106 ui.image{ module = "draft", view = "show_file_upload", params = {
107 file_upload_session = file_upload_session, file_id = file_upload.id, preview = true
108 } }
109 ui.container{ content = file_upload.title or "" }
110 ui.container{ content = file_upload.description or "" }
111 slot.put("<br />")
112 end
113 end
114 end
116 ui.tag{
117 tag = "input",
118 attr = {
119 type = "submit",
120 class = "mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--colored",
121 value = _'Publish now'
122 },
123 content = ""
124 }
125 slot.put(" ")
127 ui.tag{
128 tag = "input",
129 attr = {
130 type = "submit",
131 name = "edit",
132 class = "mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect",
133 value = _'Edit again'
134 },
135 content = ""
136 }
137 slot.put(" ")
139 ui.link{
140 attr = { class = "mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect" },
141 content = _"Cancel",
142 module = "initiative",
143 view = "show",
144 id = initiative.id
145 }
146 end )
148 else
149 ui.sectionRow( function()
150 if config.initiative_abstract then
151 ui.container { content = _"Enter abstract:" }
152 ui.container{ attr = { class = "mdl-textfield mdl-js-textfield mdl-textfield--expandable mdl-textfield__fullwidth" }, content = function()
153 ui.field.text{
154 name = "abstract",
155 multiline = true,
156 attr = { id = "abstract", style = "height: 20ex; width: 100%;" },
157 value = param.get("abstract")
158 }
159 end }
160 end
162 ui.container { content = _"Enter your proposal and/or reasons:" }
163 ui.field.wysihtml{
164 name = "content",
165 multiline = true,
166 attr = { id = "draft", style = "height: 50ex; width: 100%;" },
167 value = param.get("content")
168 }
169 if not issue or issue.state == "admission" or issue.state == "discussion" then
170 ui.container { content = _"You can change your text again anytime during admission and discussion phase" }
171 else
172 ui.container { content = _"You cannot change your text again later, because this issue is already in verfication phase!" }
173 end
175 slot.put("<br />")
176 if config.attachments then
177 local file_upload_session = param.get("file_upload_session") or multirand.string(
178 32,
179 '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
180 )
181 file_upload_session = string.gsub(file_upload_session, "[^A-Za-z0-9]", "")
182 ui.field.hidden{ name = "file_upload_session", value = file_upload_session }
183 local files = File:new_selector()
184 :left_join("draft_attachment", nil, "draft_attachment.file_id = file.id")
185 :add_where{ "draft_attachment.draft_id = ?", initiative.current_draft.id }
186 :reset_fields()
187 :add_field("file.id")
188 :add_field("draft_attachment.title")
189 :add_field("draft_attachment.description")
190 :add_order_by("draft_attachment.id")
191 :exec()
193 if #files > 0 then
194 ui.container {
195 content = function()
196 for i, file in ipairs(files) do
197 ui.image{ module = "file", view = "show.jpg", id = file.id, params = { preview = true } }
198 ui.container{ content = file.title or "" }
199 ui.container{ content = file.description or "" }
200 ui.field.boolean{ label = _"delete", name = "file_delete_" .. file.id, value = param.get("file_delete_" .. file.id) and true or false }
201 slot.put("<br /><br />")
202 end
203 end
204 }
205 end
207 local filename = encode.file_path(WEBMCP_BASE_PATH, 'tmp', "file_upload-" .. file_upload_session .. ".json")
208 local fh = io.open(filename, "r")
209 if fh then
210 local file_uploads = json.import(fh:read("*a"))
211 for i, file_upload in ipairs(file_uploads) do
212 ui.image{ module = "draft", view = "show_file_upload", params = {
213 file_upload_session = file_upload_session, file_id = file_upload.id, preview = true
214 } }
215 ui.container{ content = file_upload.title or "" }
216 ui.container{ content = file_upload.description or "" }
217 ui.field.boolean{ label = _"delete", name = "file_upload_delete_" .. file_upload.id }
218 slot.put("<br />")
219 end
220 end
221 ui.container{ attr = { id = "file_upload_template", style = "display: none;" }, content = function()
222 ui.field.text{ label = _"Title", name = "__ID_title__" }
223 ui.field.text{ label = _"Description", name = "__ID_description__" }
224 ui.field.image{ field_name = "__ID_file__" }
225 end }
226 ui.container{ attr = { id = "file_upload" }, content = function()
227 end }
228 ui.field.hidden{ attr = { id = "file_upload_last_id" }, name = "file_upload_last_id" }
229 ui.script{ script = [[ var file_upload_id = 1; ]] }
230 ui.tag{ tag = "a", content = _"Attach image", attr = {
231 href = "#",
232 onclick = "var html = document.getElementById('file_upload_template').innerHTML; html = html.replace('__ID_file__', 'file_' + file_upload_id); html = html.replace('__ID_title__', 'title_' + file_upload_id); html = html.replace('__ID_description__', 'description_' + file_upload_id); var el = document.createElement('div'); el.innerHTML = html; document.getElementById('file_upload').appendChild(el); document.getElementById('file_upload_last_id').value = file_upload_id; file_upload_id++; return false;"
233 } }
234 slot.put("<br />")
236 slot.put("<br />")
238 end
240 ui.tag{
241 tag = "input",
242 attr = {
243 type = "submit",
244 name = "preview",
245 class = "mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--colored",
246 value = _'Preview'
247 },
248 content = ""
249 }
250 slot.put(" ")
252 ui.link{
253 content = _"Cancel",
254 module = "initiative",
255 view = "show",
256 id = initiative.id,
257 attr = { class = "mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect" }
258 }
260 end )
261 end
262 end }
263 end }
264 end }
265 end }
266 end
267 }