1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License
15 module meetup_creation
is i18n
18 import opportunity_model
20 class MeetupCreationPage
23 var meet
: nullable Meetup = null is writable
25 var error
: nullable String = null is writable
27 var ans
: Set[String] = new HashSet[String] is writable
29 # Minimum number of input fields for answer
30 var min_answer_fields
= 5
32 # Templates of answers offered as starting point in the Web interface
33 var templates
: HashMap[String, Array[String]] do
34 var map
= new HashMap[String, Array[String]]
35 map
["4 kinds of pizza"] = ["Cheese", "Pepperoni", "Veggie", "All-dressed"]
36 map
["5 days work week"] = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
37 map
["7 days week"] = ["Sunday", "Monday", "Tuesday", "Wednesday",
38 "Thursday", "Friday", "Saturday"]
47 redef fun rendering
do
48 var n_answers
= ans
.length
51 var nb_answers = {{{n_answers.max(min_answer_fields)}}};
53 function new_answer(sender){
54 var ansdiv = $('#answers')
59 ansdiv.append('<div class="form-group">' +
60 '<label for="answer_' + nb + '" class="col-sm-4 control-label">' + nb + '</label>' +
61 '<div class="col-sm-8">' +
62 '<input name="answer_' + nb + '" id="answer_' + nb + '" class="form-control" type="text" placeholder="{{{"Another opportunity"}}}">' +
68 for(count = 1;; count ++){
69 var ctrl = "#answer_"+count
70 if ($(ctrl).length == 0) break
75 // Apply a template of opportunities
76 function apply_template(opportunities){
80 for (op of opportunities){
81 if (count > nb_answers) new_answer()
82 $("#answer_"+count).val(op)
88 # Do stuff with body before rendering
89 var bdy
= new Template
91 bdy
.add
"<div class=\"container\
">"
96 bdy
.add
"""<div class="alert alert-danger alert-dismissible" role="alert">
97 <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">{{{"Close"}}}</span></button>
99 bdy
.add error
.as(not null)
104 <div class="page-header">
105 <center><h1>{{{"Create a meetup"}}}</h1></center>
108 bdy
.add
"""<form class="form-horizontal" action="meetup_create" method="POST" role="form">
109 <div class = "form-group">
110 <label for="meetup_name" class="col-sm-4 control-label">{{{"Meetup name"}}}</label>
111 <div class="col-sm-8">
112 <input name="meetup_name" id="meetup_name" type="text" class="form-control" placeholder="{{{"My Event"}}}" value="{{{if meet != null then meet.name else ""}}}" />
115 <div class = "form-group">
116 <label for="meetup_date" class="col-sm-4 control-label">{{{"When?"}}}</label>
117 <div class="col-sm-8">
118 <input name="meetup_date" id="meetup_date" type="text" class="form-control" placeholder="{{{"Time of the event"}}}" value="{{{if meet != null then meet.date else ""}}}">
121 <div class = "form-group">
122 <label for="meetup_place" class="col-sm-4 control-label">{{{"Where?"}}}</label>
123 <div class="col-sm-8">
124 <input name="meetup_place" id="meetup_place" type="text" class="form-control" placeholder="{{{"Place of the event"}}}" value="{{{if meet != null then meet.place else ""}}}">
127 <div class = "form-group">
128 <label for="meetup_mode" class="col-sm-4 control-label">{{{"Add a Maybe option?"}}}</label>
129 <div class="col-sm-8 text-left">
130 <input name="meetup_mode" id="meetup_mode" type="checkbox">
134 <div class = "form-group">
135 <label for="meetup_template" class="col-sm-4 control-label text-left">{{{"Template of opportunities"}}}</label>
136 <div class="col-sm-8 text-left">
137 <div class="dropdown">
138 <button class="btn btn-default dropdown-toggle" type="button" id="meetup_template" data-toggle="dropdown" aria-expanded="true">
139 {{{"Apply a template"}}}
140 <span class="caret"></span>
142 <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
144 for name
, answers
in templates
do bdy
.add
"""
145 <li role="presentation"><a role="menuitem" tabindex="-1" onclick="apply_template([{{{[for ans in answers do "'"+ans+"'"].join(", ")}}}])">{{{name}}}</a></li>
154 <h2>{{{"Opportunities"}}}</h2>
161 <div class="form-group">
162 <label for="answer_{{{cnt}}}" class="col-sm-4 control-label">{{{cnt}}}</label>
163 <div class="col-sm-8">
164 <input name="answer_{{{cnt}}}" id="answer_{{{cnt}}}" type="text" class="form-control" value="{{{v}}}"/>
171 var empties_to_show
= min_answer_fields
- ans
.length
172 if empties_to_show
> 0 then
173 for e
in [0..empties_to_show
[ do
176 placeholder
= "First opportunity"
177 else placeholder
= "Another opportunity"
180 <div class="form-group">
181 <label for="answer_{{{cnt}}}" class="col-sm-4 control-label">{{{cnt}}}</label>
182 <div class="col-sm-8">
183 <input name="answer_{{{cnt}}}" id="answer_{{{cnt}}}" type="text" class="form-control" placeholder="{{{placeholder}}}"/>
193 <div class="form-group">
194 <button type="button" class="btn btn-lg" onclick="new_answer(this)">{{{"Add an opportunity"}}}</button>
195 <button type="submit" class="btn btn-lg btn-success">{{{"Create meetup"}}}</button>