diff options
-rw-r--r-- | appinfo/routes.php | 2 | ||||
-rw-r--r-- | controller/pagecontroller.php | 13 | ||||
-rw-r--r-- | css/create.css | 86 | ||||
-rw-r--r-- | css/list.css | 24 | ||||
-rw-r--r-- | css/main.css | 305 | ||||
-rw-r--r-- | css/vote.css | 172 | ||||
-rw-r--r-- | db/commentmapper.php | 2 | ||||
-rw-r--r-- | img/home.svg | 5 | ||||
-rw-r--r-- | img/no.svg | 77 | ||||
-rw-r--r-- | img/share.svg | 6 | ||||
-rw-r--r-- | img/yes.svg | 4 | ||||
-rw-r--r-- | js/create_edit.js | 133 | ||||
-rwxr-xr-x | js/start.js | 38 | ||||
-rw-r--r-- | js/vote.js | 257 | ||||
-rw-r--r-- | templates/create.tmpl.php | 215 | ||||
-rw-r--r-- | templates/goto.tmpl.php | 741 | ||||
-rw-r--r-- | templates/main.tmpl.php | 32 | ||||
-rw-r--r-- | templates/no.acc.tmpl.php | 30 |
18 files changed, 1131 insertions, 1011 deletions
diff --git a/appinfo/routes.php b/appinfo/routes.php index 0d1b873a..d594d1ec 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -21,7 +21,7 @@ $application = new Application(); $application->registerRoutes($this, array('routes' => array( array('name' => 'page#index', 'url' => '/', 'verb' => 'GET'), - array('name' => 'page#goto_poll', 'url' => '/goto/{hash}', 'verb' => 'GET'), + array('name' => 'page#goto_poll', 'url' => '/poll/{hash}', 'verb' => 'GET'), array('name' => 'page#edit_poll', 'url' => '/edit/{hash}', 'verb' => 'GET'), array('name' => 'page#create_poll', 'url' => '/create', 'verb' => 'GET'), array('name' => 'page#delete_poll', 'url' => '/delete', 'verb' => 'POST'), diff --git a/controller/pagecontroller.php b/controller/pagecontroller.php index d4a00217..f97ba91a 100644 --- a/controller/pagecontroller.php +++ b/controller/pagecontroller.php @@ -36,6 +36,7 @@ use \OCP\IURLGenerator; use OCP\Security\ISecureRandom; use \OCP\AppFramework\Http\TemplateResponse; use \OCP\AppFramework\Http\RedirectResponse; +use \OCP\AppFramework\Http\JSONResponse; use \OCP\AppFramework\Controller; $userMgr = \OC::$server->getUserManager(); @@ -162,8 +163,9 @@ class PageController extends Controller { } catch(\OCP\AppFramework\Db\DoesNotExistException $e) { $notification = null; } - if($this->hasUserAccess($poll)) return new TemplateResponse('polls', 'goto.tmpl', ['poll' => $poll, 'dates' => $dates, 'comments' => $comments, 'votes' => $votes, 'notification' => $notification, 'userId' => $this->userId, 'userMgr' => $this->manager, 'urlGenerator' => $this->urlGenerator, 'avatarManager' => $this->avatarManager]); - else { + if($this->hasUserAccess($poll)) { + return new TemplateResponse('polls', 'goto.tmpl', ['poll' => $poll, 'dates' => $dates, 'comments' => $comments, 'votes' => $votes, 'notification' => $notification, 'userId' => $this->userId, 'userMgr' => $this->manager, 'urlGenerator' => $this->urlGenerator, 'avatarManager' => $this->avatarManager]); + } else { \OCP\User::checkLoggedIn(); return new TemplateResponse('polls', 'no.acc.tmpl', []); } @@ -361,7 +363,7 @@ class PageController extends Controller { } } } else { - $userId = $userId . ' (extern)'; + $userId = $userId; } $poll = $this->eventMapper->find($pollId); if($changed === 'true') { @@ -408,7 +410,7 @@ class PageController extends Controller { $this->sendNotifications($pollId, $userId); $hash = $this->eventMapper->find($pollId)->getHash(); $url = $this->urlGenerator->linkToRoute('polls.page.goto_poll', ['hash' => $hash]); - return new RedirectResponse($url); + return new JSONResponse(array('comment' => $commentBox, 'date' => date('Y-m-d H:i:s'), 'userName' => $this->manager->get($userId)->getDisplayName())); } public function getPollsForUser() { @@ -435,8 +437,7 @@ class PageController extends Controller { foreach ($user_groups as $user_group) { if ($user_group === $grp) return true; } - } - else if (strpos($item, 'user_') === 0) { + } else if (strpos($item, 'user_') === 0) { $usr = substr($item, 5); if ($usr === \OCP\User::getUser()) return true; } diff --git a/css/create.css b/css/create.css new file mode 100644 index 00000000..ed095602 --- /dev/null +++ b/css/create.css @@ -0,0 +1,86 @@ +#access_rights { + display :none; + border: 1px solid #DDD; + margin: 15px; + padding: 5px; + border-radius: 3px; + max-height: 150px; + overflow-y: auto; +} + +#access_rights h3 { + margin: 0 0 5px; +} +.cl_access_item { + padding: 5px; + background-color: white; + color: #333; + cursor: pointer; +} + +.cl_access_item:hover { + background-color: #EEE; +} + +.cl_access_item.selected { + background-color: #409AE7; + color: #FFF; +} + +.cl_access_item.selected:hover { + background-color: #337AB7; + color: #FFF; +} + +textarea { + min-height: 66px; +} + +.choices { + margin-top: 10px; +} + +.choices td { + min-width: 30px; +} + +table td { + text-align: center; +} + +.text-row, .date-row { + font-weight: bold; + padding: 2px 5px; + background-color: #337AB7; + color: #FFF; + text-align: left; +} + +.text-row:hover, .date-row:hover { + background-color: #D9534F; + text-decoration: line-through; +} + +#selected-dates-table tr:first-child td { + font-weight: bold; + padding: 2px 5px; + background-color: #337AB7; + color: #FFF; + +} + +table .icon-close { + cursor: pointer; + background-color: #D9534F; + padding: 0 5px; +} + +table .icon-checkmark { + cursor: pointer; + background-color: #5CB85C; + padding: 0 5px; +} + +#expiration { + max-width: 200px; +} diff --git a/css/list.css b/css/list.css new file mode 100644 index 00000000..b523f039 --- /dev/null +++ b/css/list.css @@ -0,0 +1,24 @@ +table { + width: 100%; +} + +table thead th { + font-weight: bold; + text-align: left; + padding: 3px 5px; + background-color: #337AB7; + color: #FFF; +} + +table tbody td { + text-align: left; + padding: 3px 5px; +} + +tbody tr:nth-child(even) { + background-color: #D4F7FF; +} + +tbody tr:nth-child(even):hover { + background-color: #CDF5FF; +} diff --git a/css/main.css b/css/main.css index 717db03e..108292a7 100644 --- a/css/main.css +++ b/css/main.css @@ -1,14 +1,6 @@ -#content-wrapper { - position: relative; -} - -body { - margin: 10px; -} - h1 { - font-size: 2em; - margin-bottom: 15px; + font-size: 1.8em; + margin-bottom: 5px; } h2 { @@ -16,43 +8,78 @@ h2 { margin: 10px 0 5px 0; } -footer { - text-align: center; - color: #777; +a { + color: #35537a; } -th, tr, td { - padding: 4px; - text-align: center; +a:not(.button):hover { + text-decoration: underline; } -th { - font-weight: bold; +#app header { + padding-top: 15px; } -tr:nth-child(even), tr:nth-child(even):hover, tr:nth-child(even) a { - background: #35537a; - color: #eee; +.row:after { + content: "."; + display:block; + height:0; + clear:both; + visibility:hidden; } -tr:nth-child(odd) { +.col-100 { + width: 100%; + padding: 0px 15px; } -table { - border: 1px solid #aaa; - border-radius: 3px; +.col-70 { + width: 65%; + float: left; + padding: 0px 15px; } -.goto_poll { +.col-50 { + width: 50%; + float: left; + padding: 0px 15px; +} + +.col-30 { + width: 35%; + float: left; + padding: 0px 15px; +} + +@media(max-width: 1000px) { + .col-70, .col-30, .col-50 { + float: none; + width: 100%; + } +} + +input[type="text"] { + display: block; width: 100%; } -input.input_field { - width: 20%; +textarea { + min-width: 100%; + max-width: 100%; } -.label_h1 { - display:block; + +table { + border: 1px solid #DDD; + border-radius: 3px; +} + +.form-actions { + padding: 15px; +} + +.goto_poll { + width: 100%; } div.new_poll { @@ -70,11 +97,11 @@ div.partic_all { } div.partic_yes { - background-color: #6fff70; /*green*/ + background-color: #5CB85C; /*green*/ } div.partic_no { - background-color: #ff6f6f; /*red*/ + background-color: #D9534F; /*red*/ } input.table_button { @@ -97,6 +124,14 @@ div.scroll_div_dialog { overflow-y: auto; } +.bordered { + border-left: 1px solid #FFF; +} + +tbody th { + text-align: left; +} + td.td_shown { visibility: visible; } @@ -145,26 +180,16 @@ td.td_shown { } .input_title{ + display: block; font-size: 1.2em; + margin-top: 5px; } .padded td { padding: 10px; } -.cl_create_form { - min-width: 60%; - margin-bottom: 10px; -} - -.vote_table { - margin-top: 10px; -} - -.cl_create_form td { - padding: 3px; - text-align: left; - vertical-align: center; - text-align: center; +.vote_table thead th { + min-width: 40px; } .time-slot-cell { @@ -172,12 +197,14 @@ td.td_shown { } .toggle-all { - width: 20px; + min-width: 40px; + cursor: pointer; } .user-cell { - padding-left: 20px; - padding-right: 20px; + text-align: left; + min-width: 100px; + height: 40px; } .userNameImg { @@ -212,7 +239,7 @@ td.td_shown { background-color: #82de82; } -.cl_poll_access, .cl_poll_url, .cl_click, .cl_delete, .cl_date_time_header { +.cl_poll_url, .cl_click, .cl_delete, .cl_date_time_header { cursor: pointer; } @@ -237,12 +264,6 @@ td.td_shown { .cl_maybe:before, .cl_maybe:after{ content: "?"; } -.cl_total_y { - background-color: #6fff70; /*green*/ -} -.cl_total_n { - background-color: #ff6f6f; /*red*/ -} .win_row { color: #5ef56c; @@ -276,11 +297,6 @@ td.td_shown { margin-left: 5px; } -.date { - font-size: 0.8em; - color: #555; -} - #id_tab_total { height: 2em; width: 100%; @@ -301,138 +317,79 @@ td.td_shown { padding-left: 2px; } -/* users, groups... */ -#dialog-overlay { - /* set it to fill the whil screen */ - width:100%; - height:100%; - - /* transparency for different browsers */ - filter:alpha(opacity=50); - -moz-opacity:0.5; - -khtml-opacity: 0.5; - opacity: 0.5; - background:#000; - /* make sure it appear behind the dialog box but above everything else */ - position:absolute; - top:0; left:0; - z-index:3000; - /* hide it by default */ - display:none; -} - -#text-title, #id_expire_date { - margin-left: 5px; -} - -#dialog-box { - padding: 10px; - /* css3 drop shadow */ - -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); - -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); - box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); - /* css3 border radius */ - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - - background:#eee; - /* styling of the dialog box, i have a fixed dimension for this demo */ - width:400px; - /* make sure it has the highest z-index */ - position:absolute; - z-index:5000; - /* hide it by default */ - display:none; -} - -div#dialog-message { - padding: 0 0 20px 0; -} - -#table_groups, #table_users { +.input-group { + position: relative; + display: table; + border-collapse: separate; width: 100%; - padding: 20px 5px 10px 5px; - table-layout: fixed; - overflow-y: auto; -} - -#table_users { - padding-left: 10px; -} - -.cl_group_item, .cl_user_item { - background-color: white; - color: #000000; -} -.cl_group_item_selected, .cl_user_item_selected { - background-color: #1d2d44; - color: #8e96a1; -} - -/* STUFF FROM mypolls */ -ul { - padding: 5px; - padding-left: 12px; } -#app-content { - padding: 5px; +.input-group>input, .input-group-addon, .input-group-btn { + display: table-cell; } -#polls { - width: 100%; -} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; + white-space: nowrap; + vertical-align: middle; + width: 1%; + } -#poll-table { - width: 100%; +.input-group-addon input[type="checkbox"] { + margin: 0; } -#poll-desc, #comments-container, #poll-dates { - margin-bottom: 15px; +.input-group-btn { + vertical-align: top; } -#comment-text { +.input-group-btn .btn { + height: 31.25px; + border: 1px solid #DDD; + margin: 0; + border-radius: 3px; + vertical-align: middle; display: block; + width: 100%; } -#datepicker { +.input-group>input { + position: relative; + z-index: 2; float: left; - padding-right: 15px; -} - -#new-poll-form-warn { - color: red; -} - -#poll-dates table { - min-width: 50%; -} - -#check_notif { - margin-bottom: 10px; -} - -.poll-cell-not, .poll-cell-is, .poll-cell-maybe, .poll-cell-un, .poll-cell-active-not, .poll-cell-active-is, .poll-cell-active-maybe, .poll-cell-active-un { + width: 100%; + margin: 0; } -.poll-cell-un, .poll-cell-active-un { - background-color: #fff; +.input-group input:first-child, .input-group .input-group-btn:first-child .btn, .input-group-addon:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } - -.poll-cell-is, .poll-cell-active-is, .date-text-selected, .selected-all { - background-color: #6fff70; /*green*/ +.input-group input:last-child, .input-group .input-group-btn:last-child .btn, .input-group-addon:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } - -.poll-cell-maybe, .poll-cell-active-maybe, .selected-maybe { - background-color: #fcff6f; /*yellow*/ +.input-group .input-group-btn:first-child .btn, .input-group-addon:first-child { + border-right: none; } - -.poll-cell-not, .poll-cell-active-not, .date-text-not-selected, .selected-none { - background-color: #ff6f6f; /*red*/ +.input-group .input-group-btn:last-child .btn, .input-group-addon:last-child { + border-left: none; } -.date-row:hover, .date-col:hover, .text-row:hover { - background-color: red; - color: black; +.alert-info { + margin-left: 50%; + transform:translateX(-50%); + width: auto; + padding: 5px 15px; + text-align: center; + border: 1px solid #1D2D44; + border-top: 0; + border-radius: 0 0 3px 3px; } diff --git a/css/vote.css b/css/vote.css new file mode 100644 index 00000000..f796a9a3 --- /dev/null +++ b/css/vote.css @@ -0,0 +1,172 @@ +.vote_table { + width: 100%; +} + +.vote_table thead tr:nth-child(even) th, .vote_table tfoot tr:nth-child(even) th, .vote_table tfoot tr:nth-child(even) td { + background-color: #337AB7; + color: #FFF; +} + +.vote_table thead tr:nth-child(odd) th, .vote_table tfoot tr:nth-child(odd) th, .vote_table tfoot tr:nth-child(odd) td { + background: #35537a; + color: #FFF; +} + +tbody.votes tr:nth-child(even) { + background-color: #D4F7FF; +} + +tbody.votes tr:nth-child(even):hover { + background-color: #CDF5FF; +} + +tbody.total th { + text-align: right; +} + +th, tr, td { + padding: 4px; + text-align: center; +} + +th { + font-weight: bold; +} + +#polls { + width: 100%; +} + +#poll-table { + width: 100%; +} + +#poll-desc, #comments-container, #poll-dates { + margin-bottom: 15px; +} + +#datepicker { + float: left; + padding-right: 15px; +} + +#new-poll-form-warn { + color: red; +} + +#poll-dates table { + min-width: 50%; +} + +#check_notif { + margin-bottom: 10px; +} + +tr.current-user th { + background-color: #337AB7; + color: #FFF +} + +tr.current-user td, tr.current-user th { + border-top: 3px solid #337AB7; + border-bottom: 3px solid #337AB7; +} + +th.external { + padding-left: 40px; + font-style: italic; +} + +th.external input{ + min-width: 100px; +} + +.poll-cell-un, .poll-cell-active-un { + background-color: #FFF3CD; +} + +.poll-cell-is, .poll-cell-active-is, .date-text-selected, .selected-all { + background-color: #6AD56A; /*green*/ + background-image: url('../img/yes.svg'); + background-repeat: no-repeat; + background-position: center; + transition: background-color 0.2s; +} + +.poll-cell-not, .poll-cell-active-not, .date-text-not-selected, .selected-none { + background-image: url('../img/no.svg'); + background-repeat: no-repeat; + background-position: center; + transition: background-color 0.2s; +} + +.share { + margin: 10px 0; +} + +.share .input-group-addon{ + background-image: url('../img/share.svg'); + background-repeat: no-repeat; + background-position: 10px center; + padding-left: 35px; +} + +.comment { + border: 1px solid #DDD; + border-radius: 3px; + margin-bottom: 10px; +} + +.comment .comment-header { + background-color: #EEE; + border-bottom: 1px solid #DDD; + border-radius: 3px 3px 0 0; + padding: 2px 5px; +} + +.comment .comment-date { + float: right; + font-size: 0.9em; + color: #555; +} + +.comment .comment-content { + padding: 5px; +} + +.new-comment .icon-loading-small { + float: left; + margin-top: 10px; + display: none; +} + +.new-comment .comment-content textarea { + display: block; + min-width: 100%; + max-width: 100%; + min-height: 66px; +} + +td.total { + padding: 2px 0 1px; + color: #FFF; + font-weight: bold; +} + +.color_yes, .poll-cell-is, .poll-cell-active-is { + background-color: #6AD56A; /*green*/ +} +.color_no, .poll-cell-not, .poll-cell-active-not { + background-color: #D9534F; /*red*/ +} +.color_maybe, .poll-cell-maybe, .poll-cell-active-maybe, .poll-cell-un, .poll-cell-active-un { + background-color: #FFF0C3; /*yellow*/ +} + +.home-link { + background-image: url('../img/home.svg'); + background-repeat: no-repeat; + background-position: 5px center; + padding-left: 26px; + float: right; +} diff --git a/db/commentmapper.php b/db/commentmapper.php index 94060dd8..056f07a7 100644 --- a/db/commentmapper.php +++ b/db/commentmapper.php @@ -65,7 +65,7 @@ class CommentMapper extends Mapper { * @return Comment[]
*/
public function findByPoll($pollId, $limit=null, $offset=null) {
- $sql = 'SELECT * FROM `*PREFIX*polls_comments` WHERE poll_id=?';
+ $sql = 'SELECT * FROM `*PREFIX*polls_comments` WHERE poll_id=? ORDER BY Dt DESC';
return $this->findEntities($sql, [$pollId], $limit, $offset);
}
diff --git a/img/home.svg b/img/home.svg new file mode 100644 index 00000000..2edc3af2 --- /dev/null +++ b/img/home.svg @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> + <rect style="color:#000000" fill-opacity="0" height="97.986" width="163.31" y="-32.993" x="-62.897"/> + <path opacity=".5" d="m8 1.0306-8 7.9694h3v6.0001h10v-6h3l-3-3.0306v-3.9695h-3v1.0812l-2-2.0505z" fill-rule="evenodd"/> +</svg> diff --git a/img/no.svg b/img/no.svg new file mode 100644 index 00000000..c270f76f --- /dev/null +++ b/img/no.svg @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="16" + width="16" + version="1.1" + id="svg2" + inkscape:version="0.91 r13725" + sodipodi:docname="no.svg"> + <metadata + id="metadata15"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1600" + inkscape:window-height="825" + id="namedview13" + showgrid="true" + inkscape:zoom="14.75" + inkscape:cx="-4" + inkscape:cy="8" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg2"> + <inkscape:grid + type="xygrid" + id="grid3343" /> + </sodipodi:namedview> + <defs + id="defs4"> + <filter + id="a" + style="color-interpolation-filters:sRGB" + height="1" + width="1" + y="-2.8582539e-09" + x="-2.8637974e-09"> + <feGaussianBlur + stdDeviation="1.1812806e-08" + id="feGaussianBlur7" /> + </filter> + </defs> + <path + filter="url(#a)" + stroke="#fff" + stroke-width="2" + d="m12.95 11.536-1.414 1.414-3.536-3.5358-3.5355 3.5358-1.4142-1.414 3.5355-3.536-3.5355-3.5356 1.4142-1.4142 3.5355 3.5356 3.516-3.5547 1.434 1.4333-3.5357 3.5356z" + fill="#fff" + id="path9" + style="stroke-linejoin:round;" /> + <path + d="m12.95 11.536-1.414 1.414-3.536-3.5358-3.5355 3.5358-1.4142-1.414 3.5355-3.536-3.5355-3.5356 1.4142-1.4142 3.5355 3.5356 3.516-3.5547 1.434 1.4333-3.5357 3.5356z" + id="path11" + style="fill:#ffffff;stroke:#ffffff;stroke-width:1;stroke-miterlimit:0.4;stroke-dasharray:none;stroke-linejoin:round" /> +</svg> diff --git a/img/share.svg b/img/share.svg new file mode 100644 index 00000000..d67d35c6 --- /dev/null +++ b/img/share.svg @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> + <g transform="translate(0 -1036.4)"> + <path d="m12.228 1037.4c-1.3565 0-2.4592 1.0977-2.4592 2.4542 0 0.075 0.0084 0.1504 0.0149 0.2236l-4.7346 2.4145c-0.4291-0.3667-0.98611-0.5863-1.5947-0.5863-1.3565 0-2.4542 1.0977-2.4542 2.4543 0 1.3565 1.0977 2.4542 2.4542 2.4542 0.54607 0 1.0528-0.1755 1.4606-0.477l4.8637 2.4741c-0.0024 0.044-0.0099 0.089-0.0099 0.1342 0 1.3565 1.1027 2.4542 2.4592 2.4542s2.4542-1.0977 2.4542-2.4542-1.0977-2.4592-2.4542-2.4592c-0.63653 0-1.218 0.2437-1.6544 0.6409l-4.6953-2.4c0.01892-0.1228 0.03478-0.2494 0.03478-0.3775 0-0.072-0.0089-0.1437-0.0149-0.2137l4.7395-2.4145c0.42802 0.3627 0.98488 0.5813 1.5898 0.5813 1.3565 0 2.4542-1.1027 2.4542-2.4592s-1.0977-2.4542-2.4542-2.4542z"/> + </g> +</svg> diff --git a/img/yes.svg b/img/yes.svg new file mode 100644 index 00000000..964624a9 --- /dev/null +++ b/img/yes.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="16px" viewBox="-0.5 -0.5 16 16" width="16px" version="1.1" y="0px" x="0px" xmlns:cc="http://creativecommons.org/ns#" enable-background="new -0.5 -0.5 16 16" overflow="visible" xmlns:dc="http://purl.org/dc/elements/1.1/"> +<path fill="#fff" transform="translate(-.5 -.5)" d="m12.438 3.6875c-0.363 0-0.726 0.1314-1 0.4063l-4.5005 4.5-1.9687-2c-0.5498-0.5484-1.4489-0.5498-2 0l-0.5 0.5c-0.5512 0.5496-0.5512 1.4502 0 2l2.9687 2.9682c0.0063 0.007-0.0065 0.025 0 0.032l0.5 0.5c0.5497 0.55 1.4503 0.55 2 0l0.5-0.5 0.1875-0.219 5.313-5.2812c0.549-0.5498 0.549-1.4503 0-2l-0.5-0.5c-0.275-0.2749-0.638-0.4063-1-0.4063z"/> +</svg> diff --git a/js/create_edit.js b/js/create_edit.js index 51f34bb3..50674abd 100644 --- a/js/create_edit.js +++ b/js/create_edit.js @@ -2,8 +2,6 @@ var g_chosen_datetimes = []; var g_chosen_texts = []; var g_chosen_groups = []; var g_chosen_users = []; -var g_tmp_groups = []; -var g_tmp_users = []; var chosen_type = 'event'; var access_type = ''; @@ -11,21 +9,15 @@ $(document).ready(function () { // enable / disable date picker $('#id_expire_set').click(function(){ $('#id_expire_date').prop("disabled", !this.checked); - - // TODO: this would be nice, for some reason it doesn't work - //if (this.checked) { - // $("id_expire_date").focus(); - //} + if (this.checked) { + $("#id_expire_date").focus(); + } }); var privateRadio = document.getElementById('private'); var hiddenRadio = document.getElementById('hidden'); var publicRadio = document.getElementById('public'); var selectRadio = document.getElementById('select'); - privateRadio.onclick = hideSelectTable; - hiddenRadio.onclick = hideSelectTable; - publicRadio.onclick = hideSelectTable; - selectRadio.onclick = showSelectTable; if(privateRadio.checked) access_type = 'registered'; if(hiddenRadio.checked) access_type = 'hidden'; if(publicRadio.checked) access_type = 'public'; @@ -176,40 +168,24 @@ $(document).ready(function () { text.value = ''; }); - $(document).on('click', '#button_cancel_access', function(e) { - g_tmp_groups = []; - g_tmp_users = []; - closeAccessDialog(); - }); - - $(document).on('click', '#button_ok_access', function(e) { - g_chosen_groups = g_tmp_groups; - g_chosen_users = g_tmp_users; - g_tmp_groups = []; - g_tmp_users = []; - closeAccessDialog(); - }); - $(document).on('click', '.cl_user_item', function(e) { - $(this).switchClass('cl_user_item', 'cl_user_item_selected'); - g_tmp_users.push(this.id); - }); - - $(document).on('click', '.cl_user_item_selected', function(e) { - $(this).switchClass('cl_user_item_selected', 'cl_user_item'); - var index = g_tmp_users.indexOf(this.id); - if(index > -1) g_tmp_users.splice(index, 1); + if($(this).hasClass('selected')) { + var index = g_chosen_users.indexOf(this.id); + if(index > -1) g_chosen_users.splice(index, 1); + } else { + g_chosen_users.push(this.id); + } + $(this).toggleClass('selected'); }); - + $(document).on('click', '.cl_group_item', function(e) { - $(this).switchClass('cl_group_item', 'cl_group_item_selected'); - g_tmp_groups.push(this.id); - }); - - $(document).on('click', '.cl_group_item_selected', function(e) { - $(this).switchClass('cl_group_item_selected', 'cl_group_item'); - var index = g_tmp_groups.indexOf(this.id); - if(index > -1) g_tmp_groups.splice(index, 1); + if($(this).hasClass('selected')) { + var index = g_chosen_groups.indexOf(this.id); + if(index > -1) g_chosen_groups.splice(index, 1); + } else { + g_chosen_groups.push(this.id); + } + $(this).toggleClass('selected'); }); $('.toggleable-row').hover( @@ -254,9 +230,9 @@ $(document).ready(function () { $('input[type=radio][name=accessType]').change(function() { access_type = this.value; if(access_type == 'select') { - showAccessDialog(); + $("#access_rights").show(); } else { - closeAccessDialog(); + $("#access_rights").hide(); } }); @@ -434,72 +410,3 @@ function addColToList(ts, text, dateTs) { td.id = ts; } } - -//Popup dialog -function showAccessDialog() { - var message = t('polls', 'Please choose the groups or users you want to add to your poll.'); - - // get the screen height and width - var maskHeight = $(document).height(); - var maskWidth = $(window).width(); - - // calculate the values for center alignment - //var dialogTop = (maskHeight / 3) - ($('#dialog-box').height()); - // todo: height doesn't work - var dialogTop = 100; - var dialogLeft = (maskWidth / 2) - ($('#dialog-box').width() / 2); - - // assign values to the overlay and dialog box - $('#dialog-overlay').css({height: maskHeight, width: maskWidth}).show(); - $('#dialog-box').css({top: dialogTop, left: dialogLeft}).show(); - - // display the message - $('#dialog-message').html(message); - - var unselectedGrps = [].slice.call(document.getElementsByClassName('cl_group_item')); - var selectedGrps = [].slice.call(document.getElementsByClassName('cl_group_item_selected')); - var unselectedUsers = [].slice.call(document.getElementsByClassName('cl_user_item')); - var selectedUsers = [].slice.call(document.getElementsByClassName('cl_user_item_selected')); - cells_grp = unselectedGrps.concat(selectedGrps); - cells_usr = unselectedUsers.concat(selectedUsers); - - var tmpGroups = g_chosen_groups.slice(); - for(var i=0; i<cells_grp.length; i++) { - var curr = cells_grp[i]; - curr.className = 'cl_group_item'; - for(var j=0; j<tmpGroups.length; j++) { - if(tmpGroups[j] == curr.id) { - curr.className = 'cl_group_item_selected'; - tmpGroups.splice(j, 1); - break; - } - } - } - var tmpUsers = g_chosen_users.slice(); - for(var i=0; i<cells_usr.length; i++) { - var curr = cells_usr[i]; - curr.className = 'cl_user_item'; - for(var j=0; j<tmpUsers.length; j++) { - if(tmpUsers[j] == curr.id) { - curr.className = 'cl_user_item_selected'; - tmpUsers.splice(j, 1); - break; - } - } - } - g_tmp_groups = g_chosen_groups.slice(); - g_tmp_users = g_chosen_users.slice(); -} - -function closeAccessDialog() { - $('#dialog-box').hide(); - return false; -} - -function showSelectTable() { - document.getElementById("table_access").style.display = "table"; -} - -function hideSelectTable() { - document.getElementById("table_access").style.display = "none"; -} diff --git a/js/start.js b/js/start.js index 65a1101b..57a8d47e 100755 --- a/js/start.js +++ b/js/start.js @@ -1,39 +1,9 @@ -var edit_access_id = null; // set if called from the summary page - $(document).ready(function () { - edit_access_id = null; - // users, groups - var elem = document.getElementById('select'); - if (elem) elem.onclick = showAccessDialog; - elem = document.getElementById('button_close_access'); - if (elem) elem.onclick = closeAccessDialog; - - cells = document.getElementsByClassName('cl_group_item'); - for (var i = 0; i < cells.length; i++) { - cells[i].onclick = groupItemClicked; - } - cells = document.getElementsByClassName('cl_user_item'); - for (var i = 0; i < cells.length; i++) { - cells[i].onclick = userItemClicked; - } + $('.cl_delete').click(deletePoll); - var cells = document.getElementsByClassName('cl_delete'); - for (var i = 0; i < cells.length; i++) { - var cell = cells[i]; - cells[i].onclick = deletePoll; - } - - // set "show poll url" handler - cells = document.getElementsByClassName('cl_poll_url'); - for (var i = 0; i < cells.length; i++) { - var cell = cells[i]; - cells[i].onclick = function(e) { - // td has inner 'input'; value is poll url - var cell = e.target; - var url = cell.getElementsByTagName('input')[0].value; - window.prompt(t('polls','Copy to clipboard: Ctrl+C, Enter'), url); - } - } + $('.cl_link').click(function() { + window.prompt(t('polls','Copy to clipboard: Ctrl+C, Enter'), $(this).data('url')); + }); }); function deletePoll(e) { @@ -4,27 +4,13 @@ var newUserTypes = []; var max_votes = 0; var values_changed = false; -$(document).ready(function () { - var cells = []; - cells = document.getElementsByClassName('cl_click'); - // loop over 'user' cells - for (var i = 0; i < cells.length; i++){ - // fill arrays (if this is edit) - if (cells[i].className.indexOf('poll-cell-active-not') >= 0){ - newUserTypes.push(0); - newUserDates.push(cells[i].id); - } else if (cells[i].className.indexOf('poll-cell-active-is') >= 0){ - newUserTypes.push(1); - newUserDates.push(cells[i].id); - } else if(cells[i].className.indexOf('poll-cell-active-maybe') >= 0){ - newUserTypes.push(2); - newUserDates.push(cells[i].id); - } else { - newUserTypes.push(-1); - newUserDates.push(cells[i].id); - } - } +$.fn.switchClass = function(a, b) { + this.removeClass(a); + this.addClass(b); + return this; +} +$(document).ready(function () { $('#submit_finish_vote').click(function() { var form = document.finish_vote; var ac = document.getElementById('user_name'); @@ -37,6 +23,19 @@ $(document).ready(function () { } } check_notif = document.getElementById('check_notif'); + var newUserDates = [], newUserTypes = []; + $(".cl_click").each(function() { + if($(this).hasClass('poll-cell-active-not')) { + newUserTypes.push(0); + } else if ($(this).hasClass('poll-cell-active-is')){ + newUserTypes.push(1); + } else if($(this).hasClass('poll-cell-active-maybe')){ + newUserTypes.push(2); + } else { + newUserTypes.push(-1); + } + newUserDates.push(parseInt($(this).attr('id'))); + }); form.elements['dates'].value = JSON.stringify(newUserDates); form.elements['types'].value = JSON.stringify(newUserTypes); form.elements['notif'].value = (check_notif && check_notif.checked) ? 'true' : 'false'; @@ -44,179 +43,75 @@ $(document).ready(function () { form.submit(); }); - $('#submit_send_comment').click(function() { + $('#submit_send_comment').click(function(e) { + e.preventDefault(); var form = document.send_comment; var comm = document.getElementById('commentBox'); - if(comm.value.length <= 0) { + if(comm.value.trim().length <= 0) { alert(t('polls', 'Please add some text to your comment before submitting it.')); return; } - form.submit(); + var data = { + pollId: form.elements['pollId'].value, + userId: form.elements['userId'].value, + commentBox: comm.value.trim() + }; + $('.new-comment .icon-loading-small').show(); + $.post(form.action, data, function(data) { + $('.comments .comment:first').after('<div class="comment"><div class="comment-header"><span class="comment-date">' + data.date + '</span>' + data.userName + '</div><div class="wordwrap comment-content">' + data.comment + '</div></div>'); + $('.new-comment textarea').val('').focus(); + $('.new-comment .icon-loading-small').hide(); + }).error(function() { + alert(t('polls', 'An error occurred, your comment was not posted...')); + $('.new-comment .icon-loading-small').hide(); + }); + }); + + $(".share input").click(function() { + $(this).select(); }); }); -$(document).on('click', '.toggle-all', function(e) { - if($(this).attr('class').indexOf('selected-all') > -1) { - var selected = $(this).parent().children('.poll-cell-active-is'); - var maybes = $(this).parent().children('.poll-cell-active-maybe'); - for(var i=0; i<selected.length; i++) { - var curr = $(selected[i]); - curr.switchClass('poll-cell-active-is', 'poll-cell-active-not'); - deselectItem(curr); - } - for(var i=0; i<maybes.length; i++) { - var curr = $(maybes[i]); - curr.switchClass('poll-cell-active-maybe', 'poll-cell-active-not'); - deselectItem(curr); - } - $(this).removeClass('selected-all'); - $(this).addClass('selected-none'); - } else if($(this).attr('class').indexOf('selected-none') > -1) { - var selected = $(this).parent().children('.poll-cell-active-is'); - var unselected = $(this).parent().children('.poll-cell-active-not'); - for(var i=0; i<selected.length; i++) { - var curr = $(selected[i]); - curr.switchClass('poll-cell-active-is', 'poll-cell-active-maybe'); - maybeItem(curr); - } - for(var i=0; i<unselected.length; i++) { - var curr = $(unselected[i]); - curr.switchClass('poll-cell-active-not', 'poll-cell-active-maybe'); - maybeItem(curr); - } - $(this).removeClass('selected-none'); - $(this).addClass('selected-maybe'); - } else { - var maybes = $(this).parent().children('.poll-cell-active-maybe'); - var unselected = $(this).parent().children('.poll-cell-active-not'); - var notselected = $(this).parent().children('.poll-cell-active-un'); - for(var i=0; i<maybes.length; i++) { - var curr = $(maybes[i]); - curr.switchClass('poll-cell-active-maybe', 'poll-cell-active-is'); - selectItem(curr); - } - for(var i=0; i<unselected.length; i++) { - var curr = $(unselected[i]); - curr.switchClass('poll-cell-active-not', 'poll-cell-active-is'); - selectItem(curr, 'poll-cell-active-not'); - } - for(var i=0; i<notselected.length; i++) { - var curr = $(notselected[i]); - curr.switchClass('poll-cell-active-un', 'poll-cell-active-is'); - selectItem(curr); - } - $(this).removeClass('selected-maybe'); - $(this).addClass('selected-all'); - } -}); - -$(document).on('click', '.poll-cell-active-un', function(e) { - maybeItem($(this)); -}); - -$(document).on('click', '.poll-cell-active-not', function(e) { - maybeItem($(this)); -}); - -$(document).on('click', '.poll-cell-active-maybe', function(e) { - selectItem($(this)); -}); - -$(document).on('click', '.poll-cell-active-is', function(e) { - deselectItem($(this)); -}); - -function selectItem(cell, cl) { - if(typeof cl === 'undefined') cl = ''; - values_changed = true; - var ts = cell.attr('id'); - var index = newUserDates.indexOf(ts); - if(index > -1) { - newUserDates.splice(index, 1); - newUserTypes.splice(index, 1); - } - newUserDates.push(ts); - newUserTypes.push(1); - if(cl.indexOf('poll-cell-active-not') > -1) { - var total_no = document.getElementById('id_n_' + ts); - var intNo = parseInt(total_no.innerHTML); - if(intNo >= 1) total_no.innerHTML = intNo - 1; - else total_no.innerHTML = '0'; - } - var total_yes = document.getElementById('id_y_' + ts); - total_yes.innerHTML = parseInt(total_yes.innerHTML) + 1; - cell.switchClass('poll-cell-active-maybe', 'poll-cell-active-is'); - findNewMaxCount(); - updateStrongCounts(); -} - -function deselectItem(cell) { +$(document).on('click', '.toggle-all, .cl_click', function(e) { values_changed = true; - var ts = cell.attr('id'); - var index = newUserDates.indexOf(ts); - if(index > -1) { - newUserDates.splice(index, 1); - newUserTypes.splice(index, 1); + var cl = ""; + if($(this).hasClass('poll-cell-active-is')) { + cl = "not"; + } else if($(this).hasClass('poll-cell-active-not')) { + cl = "maybe"; + } else if($(this).hasClass('poll-cell-active-maybe')) { + cl = "is"; + } else { + cl = "is"; } - newUserDates.push(ts); - newUserTypes.push(0); - var total_yes = document.getElementById('id_y_' + ts); - var total_no = document.getElementById('id_n_' + ts); - var intYes = parseInt(total_yes.innerHTML); - if(intYes >= 1) total_yes.innerHTML = intYes - 1; - else total_yes.innerHTML = '0'; - total_no.innerHTML = parseInt(total_no.innerHTML) + 1; - cell.switchClass('poll-cell-active-is', 'poll-cell-active-not'); - findNewMaxCount(); - updateStrongCounts(); -} - -function maybeItem(cell) { - values_changed = true; - var ts = cell.attr('id'); - var index = newUserDates.indexOf(ts); - if(index > -1) { - newUserDates.splice(index, 1); - newUserTypes.splice(index, 1); + if($(this).hasClass('toggle-all')) { + $(".cl_click").attr('class', 'cl_click poll-cell-active-' + cl); + $(this).attr('class', 'toggle-all poll-cell-active-' + cl); + } else { + $(this).attr('class', 'cl_click poll-cell-active-' + cl); } - newUserDates.push(ts); - newUserTypes.push(2); - var total_no = document.getElementById('id_n_' + ts); - var intNo = parseInt(total_no.innerHTML); - if(intNo >= 1) total_no.innerHTML = intNo - 1; - else total_no.innerHTML = '0'; - cell.switchClass('poll-cell-active-not', 'poll-cell-active-maybe'); - cell.switchClass('poll-cell-active-un', 'poll-cell-active-maybe'); - findNewMaxCount(); - updateStrongCounts(); -} + $('.cl_click').each(function() { + var yes_c = $('#id_y_' + $(this).attr('id')); + var no_c = $('#id_n_' + $(this).attr('id')); + $(yes_c).text(parseInt($(yes_c).attr('data-value')) + ($(this).hasClass('poll-cell-active-is') ? 1 : 0)); + $(no_c).text(parseInt($(no_c).attr('data-value')) + ($(this).hasClass('poll-cell-active-not') ? 1 : 0)); + }); + updateCounts(); +}); -function findNewMaxCount(){ - var cell_tot_y = document.getElementsByClassName('cl_total_y'); - var cell_tot_n = document.getElementsByClassName('cl_total_n'); +function updateCounts(){ max_votes = 0; - for(var i=0; i<cell_tot_y.length; i++) { - var currYes = parseInt(cell_tot_y[i].innerHTML); - var currNo = parseInt(cell_tot_n[i].innerHTML); - var curr = currYes - currNo; - if(curr > max_votes) max_votes = curr; - } -} - -function updateStrongCounts(){ - var cell_tot_y = document.getElementsByClassName('cl_total_y'); - var cell_tot_n = document.getElementsByClassName('cl_total_n'); - - for(var i=0; i<cell_tot_y.length; i++) { - var cell_win = document.getElementById('id_total_' + i); - var curr = parseInt(cell_tot_y[i].innerHTML) - parseInt(cell_tot_n[i].innerHTML); - if(curr < max_votes) { - cell_win.className = 'win_row'; - cell_tot_y[i].style.fontWeight = 'normal'; - } - else { - cell_tot_y[i].style.fontWeight = 'bold'; - cell_win.className = 'win_row icon-checkmark'; + $('td.total').each(function() { + var yes = parseInt($(this).find('.color_yes').text()); + var no = parseInt($(this).find('.color_no').text()); + if(yes - no > max_votes) { + max_votes = yes - no; } - } + }); + var i = 0; + $('td.total').each(function() { + var yes = parseInt($(this).find('.color_yes').text()); + var no = parseInt($(this).find('.color_no').text()); + $('#id_total_' + i++).toggleClass('icon-checkmark', yes - no == max_votes); + }); } diff --git a/templates/create.tmpl.php b/templates/create.tmpl.php index 2caf6de5..498a2531 100644 --- a/templates/create.tmpl.php +++ b/templates/create.tmpl.php @@ -1,5 +1,6 @@ <?php \OCP\Util::addStyle('polls', 'main'); + \OCP\Util::addStyle('polls', 'create'); \OCP\Util::addStyle('polls', 'jquery.datetimepicker'); \OCP\Util::addScript('polls', 'create_edit'); \OCP\Util::addScript('polls', 'jquery.datetimepicker.full.min'); @@ -30,6 +31,9 @@ } ?> +<div id="app"> + <div id="app-content"> + <div id="app-content-wrapper"> <?php if($isUpdate): ?> <form name="finish_poll" action="<?php p($urlGenerator->linkToRoute('polls.page.update_poll')); ?>" method="POST"> <input type="hidden" name="pollId" value="<?php p($poll->getId()); ?>" /> @@ -40,124 +44,113 @@ <input type="hidden" name="expireTs" id="expireTs" value="<?php if(isset($expireTs)) p($expireTs); ?>" /> <input type="hidden" name="userId" id="userId" value="<?php p($userId); ?>" /> - <div class="new_poll"> - <?php if($isUpdate): ?> - <h1><?php p($l->t('Edit poll') . ' ' . $poll->getTitle()); ?></h1> - <?php else: ?> - <h1><?php p($l->t('Create new poll')); ?></h1> - <?php endif; ?> - <label for="text_title" class="label_h1 input_title"><?php p($l->t('Title')); ?></label> - <input type="text" class="input_field" id="pollTitle" name="pollTitle" value="<?php if(isset($title)) p($title); ?>" /> - <label for="pollDesc" class="label_h1 input_title"><?php p($l->t('Description')); ?></label> - <textarea cols="50" rows="5" style="width: auto;" class="input_field" id="pollDesc" name="pollDesc"><?php if(isset($desc)) p($desc); ?></textarea> - - <div class="input_title"><?php p($l->t('Access')); ?></div> - - <input type="radio" name="accessType" id="private" value="registered" <?php if(!$isUpdate || $access === 'registered') print_unescaped('checked'); ?> /> - <label for="private"><?php p($l->t('Registered users only')); ?></label> - - <input type="radio" name="accessType" id="hidden" value="hidden" <?php if($isUpdate && $access === 'hidden') print_unescaped('checked'); ?> /> - <label for="hidden"><?php p($l->t('hidden')); ?></label> - - <input type="radio" name="accessType" id="public" value="public" <?php if($isUpdate && $access === 'public') print_unescaped('checked'); ?> /> - <label for="public"><?php p($l->t('Public access')); ?></label> - - <input type="radio" name="accessType" id="select" value="select" <?php if($isUpdate && $access === 'select') print_unescaped('checked'); ?>> - <label for="select"><?php p($l->t('Select')); ?></label> - <span id="id_label_select">...</span> - - <input type="hidden" name="accessValues" id="accessValues" value="<?php if($isUpdate && $access === 'select') p($accessTypes) ?>" /> - - <div class="input_title"><?php p($l->t('Type')); ?></div> - - <input type="radio" name="pollType" id="event" value="event" <?php if(!$isUpdate || $poll->getType() === '0') print_unescaped('checked'); ?> /> - <label for="event"><?php p($l->t('Event schedule')); ?></label> - - <!-- TODO texts to db --> - <input type="radio" name="pollType" id="text" value="text" <?php if($isUpdate && $poll->getType() === '1') print_unescaped('checked'); ?>> - <label for="text"><?php p($l->t('Text based')); ?></label> - - <br/> - <input id="id_expire_set" name="check_expire" type="checkbox" <?php ($isUpdate && $poll->getExpire() !== null) ? print_unescaped('value="true" checked') : print_unescaped('value="false"'); ?> /> - <label for="id_expire_set"><?php p($l->t('Expires')); ?>:</label> - <input id="id_expire_date" type="text" required="" <?php (!$isUpdate || $poll->getExpire() === null) ? print_unescaped('disabled="true"') : print_unescaped('value="' . $expireStr . '"'); ?> name="expire_date_input" /> - <br/> - <div id="date-select-container" <?php if($isUpdate && $poll->getType() === '1') print_unescaped('style="display:none;"'); ?> > - <label for="datetimepicker"><?php p($l->t('Dates')); ?>:</label> - <br/> - <input id="datetimepicker" type="text" /> - - <table id="selected-dates-table"> - </table> - </div> - <div id="text-select-container" <?php if(!$isUpdate || $poll->getType() === '0') print_unescaped('style="display:none;"'); ?> > - <label for="text-title"><?php p($l->t('Text item')); ?>:</label> - <input type="text" id="text-title" placeholder="<?php print_unescaped('Insert text...'); ?>" /> - <br/> - <input type="button" id="text-submit" value="<?php p($l->t('Add')); ?>"/> - <table id="selected-texts-table"> - </table> + <header class="row"> + <div class="col-100"> + <?php if($isUpdate): ?> + <h1><?php p($l->t('Edit poll') . ' ' . $poll->getTitle()); ?></h1> + <?php else: ?> + <h1><?php p($l->t('Create new poll')); ?></h1> + <?php endif; ?> </div> - - <br/> - <a href="<?php p($urlGenerator->linkToRoute('polls.page.index')); ?>"><input type="button" id="submit_cancel_poll" value="<?php p($l->t('Cancel')); ?>" /></a> - <input type="submit" id="submit_finish_poll" value="<?php p($l->t('Next')); ?>" /> - </div> -</form> - -<div id="dialog-box"> - <div id="dialog-message"></div> - <?php if (isset($url)) : ?> - <input type="radio" name="radio_pub" id="private" value="registered"/> - <label for="private"><?php p($l->t('Registered users only')); ?></label> - <br/> - <input type="radio" name="radio_pub" id="hidden" value="hidden" /> - <label for="hidden"><?php p($l->t('hidden')); ?></label> - <br/> - <input type="radio" name="radio_pub" id="public" value="public" /> - <label for="public"><?php p($l->t('Public access')); ?></label> - <br/> - <input type="radio" name="radio_pub" id="select" value="select" checked /> - <label for="select"><?php p($l->t('Select')); ?></label> - <br/> - <?php endif; ?> - - <table id="table_access"> - <tr> - <td> - <div class="scroll_div_dialog"> - <table id="table_groups"> - <tr> - <th><?php p($l->t('Groups')); ?></th> - </tr> + </header> + + <div class="new_poll row"> + <div class="col-50"> + <h2><?php p($l->t('Basic information')); ?></h2> + <label for="pollTitle" class="input_title"><?php p($l->t('Title')); ?></label> + <input type="text" class="input_field" id="pollTitle" name="pollTitle" value="<?php if(isset($title)) p($title); ?>" /> + <label for="pollDesc" class="input_title"><?php p($l->t('Description')); ?></label> + <textarea class="input_field" id="pollDesc" name="pollDesc"><?php if(isset($desc)) p($desc); ?></textarea> + + <label class="input_title"><?php p($l->t('Access')); ?></label> + + <input type="radio" name="accessType" id="private" value="registered" <?php if(!$isUpdate || $access === 'registered') print_unescaped('checked'); ?> /> + <label for="private"><?php p($l->t('Registered users only')); ?></label> + + <input type="radio" name="accessType" id="hidden" value="hidden" <?php if($isUpdate && $access === 'hidden') print_unescaped('checked'); ?> /> + <label for="hidden"><?php p($l->t('hidden')); ?></label> + + <input type="radio" name="accessType" id="public" value="public" <?php if($isUpdate && $access === 'public') print_unescaped('checked'); ?> /> + <label for="public"><?php p($l->t('Public access')); ?></label> + + <input type="radio" name="accessType" id="select" value="select" <?php if($isUpdate && $access === 'select') print_unescaped('checked'); ?>> + <label for="select"><?php p($l->t('Select')); ?></label> + <span id="id_label_select">...</span> + + <div id="access_rights" class="row"> + <div class="col-50"> + <h3><?php p($l->t('Groups')); ?></h3> + <ul> <?php $groups = OC_Group::getUserGroups($userId); ?> <?php foreach($groups as $gid) : ?> - <tr> - <td class="cl_group_item" id="group_<?php p($gid); ?>"><?php p($gid); ?></td> - </tr> + <li class="cl_group_item cl_access_item" id="group_<?php p($gid); ?>"> + <?php p($gid); ?> + </li> <?php endforeach; ?> - </table> + </ul> </div> - </td> - <td> - <div class="scroll_div_dialog"> - <table id="table_users"> - <tr> - <th><?php p($l->t('Users')); ?></th> - </tr> + <div class="col-50"> + <h3><?php p($l->t('Users')); ?></h3> + <ul> <?php $users = $userMgr->search(''); ?> <?php foreach ($users as $user) : ?> - <tr> - <td class="cl_user_item" id="user_<?php p($user->getUID()); ?>" > - <?php p($user->getDisplayName()); ?> - </td> - </tr> + <li class="cl_user_item cl_access_item" id="user_<?php p($user->getUID()); ?>" > + <?php p($user->getDisplayName()); ?> + </li> <?php endforeach; ?> - </table> + </ul> + </div> + </div> + + <input type="hidden" name="accessValues" id="accessValues" value="<?php if($isUpdate && $access === 'select') p($accessTypes) ?>" /> + + <label class="input_title"><?php p($l->t('Type')); ?></label> + + <input type="radio" name="pollType" id="event" value="event" <?php if(!$isUpdate || $poll->getType() === '0') print_unescaped('checked'); ?> /> + <label for="event"><?php p($l->t('Event schedule')); ?></label> + + <!-- TODO texts to db --> + <input type="radio" name="pollType" id="text" value="text" <?php if($isUpdate && $poll->getType() === '1') print_unescaped('checked'); ?>> + <label for="text"><?php p($l->t('Text based')); ?></label> + + <label for="id_expire_set" class="input_title"><?php p($l->t('Expires')); ?></label> + <div class="input-group" id="expiration"> + <div class="input-group-addon"> + <input id="id_expire_set" name="check_expire" type="checkbox" <?php ($isUpdate && $poll->getExpire() !== null) ? print_unescaped('value="true" checked') : print_unescaped('value="false"'); ?> /> + </div> + <input id="id_expire_date" type="text" required="" <?php (!$isUpdate || $poll->getExpire() === null) ? print_unescaped('disabled="true"') : print_unescaped('value="' . $expireStr . '"'); ?> name="expire_date_input" /> + </div> + </div> + <div class="col-50"> + <h2><?php p($l->t('Choices')); ?></h2> + <div id="date-select-container" <?php if($isUpdate && $poll->getType() === '1') print_unescaped('style="display:none;"'); ?> > + <label for="datetimepicker" class="input_title"><?php p($l->t('Dates')); ?></label> + <input id="datetimepicker" type="text" /> + <table id="selected-dates-table" class="choices"> + </table> + </div> + <div id="text-select-container" <?php if(!$isUpdate || $poll->getType() === '0') print_unescaped('style="display:none;"'); ?> > + <label for="text-title" class="input_title"><?php p($l->t('Text item')); ?></label> + <div class="input-group"> + <input type="text" id="text-title" placeholder="<?php print_unescaped('Insert text...'); ?>" /> + <div class="input-group-btn"> + <input type="button" id="text-submit" value="<?php p($l->t('Add')); ?>" class="btn"/> + </div> </div> - </td> - </tr> - </table> - <input type="button" id="button_cancel_access" value="<?php p($l->t('Cancel')); ?>" /> - <input type="button" id="button_ok_access" value="<?php p($l->t('Ok')); ?>" /> + <table id="selected-texts-table" class="choices"> + </table> + </div> + </div> + </div> + <div class="form-actions"> + <?php if($isUpdate): ?> + <input type="submit" id="submit_finish_poll" value="<?php p($l->t('Update poll')); ?>" /> + <?php else: ?> + <input type="submit" id="submit_finish_poll" value="<?php p($l->t('Create poll')); ?>" /> + <?php endif; ?> + <a href="<?php p($urlGenerator->linkToRoute('polls.page.index')); ?>" id="submit_cancel_poll" class="button"><?php p($l->t('Cancel')); ?></a> + </div> +</form> +</div> +</div> </div> diff --git a/templates/goto.tmpl.php b/templates/goto.tmpl.php index c70d660e..29c012a2 100644 --- a/templates/goto.tmpl.php +++ b/templates/goto.tmpl.php @@ -1,21 +1,25 @@ <?php + +use \OCP\User; + \OCP\Util::addStyle('polls', 'main'); +\OCP\Util::addStyle('polls', 'vote'); \OCP\Util::addScript('polls', 'vote'); $userId = $_['userId']; $userMgr = $_['userMgr']; $urlGenerator = $_['urlGenerator']; $avaMgr = $_['avatarManager']; -use \OCP\User; $poll = $_['poll']; $dates = $_['dates']; $votes = $_['votes']; $comments = $_['comments']; $notification = $_['notification']; -$poll_type = $poll->getType(); -if ($poll->getExpire() === null) $expired = false; -else { + +if ($poll->getExpire() === null) { + $expired = false; +} else { $expired = time() > strtotime($poll->getExpire()); } @@ -24,10 +28,8 @@ if ($poll->getType() === '0') { $arr_dates = null; // will be like: [21.02] => 3 $arr_years = null; // [1992] => 6 foreach($dates as $d) { - $date = date('d.m.Y', strtotime($d->getDt())); - $arr = explode('.', $date); - $day_month = $arr[0] . '.' . $arr[1] . '.'; // 21.02 - $year = $arr[2]; // 1992 + $day_month = date('d.m', strtotime($d->getDt())); + $year = date('Y', strtotime($d->getDt())); if (isset($arr_dates[$day_month])) { $arr_dates[$day_month] += 1; @@ -35,396 +37,397 @@ if ($poll->getType() === '0') { $arr_dates[$day_month] = 1; } - // ----- if (isset($arr_years[$year])) { $arr_years[$year] += 1; } else { $arr_years[$year] = 1; } - } $for_string_dates = ''; - foreach (array_keys($arr_dates) as $dt) { // date (13.09) - $for_string_dates .= '<th colspan="' . $arr_dates[$dt] . '">' . $dt . '</th>'; + foreach (array_keys($arr_dates) as $dt) { + $for_string_dates .= '<th colspan="' . $arr_dates[$dt] . '" class="bordered">' . $dt . '</th>'; } $for_string_years = ''; - foreach (array_keys($arr_years) as $year) { // year (1992) - $for_string_years .= '<th colspan="' . $arr_years[$year] . '">' . $year . '</th>'; + foreach (array_keys($arr_years) as $year) { + $for_string_years .= '<th colspan="' . $arr_years[$year] . '" class="bordered">' . $year . '</th>'; } - } -if($poll->getDescription() !== null && $poll->getDescription() !== '') $line = str_replace("\n", '<br/>', $poll->getDescription()); -else $line = $l->t('No description provided.'); - -// ----------- title / descr -------- -?> -<!-- TODO reimplement? -<?php if(!User::isLoggedIn()) : ?> - <p> - <header> - <div id="header"> - <a href="<?php print_unescaped(link_to('', 'index.php')); ?>" - title="" id="owncloud"> - <div class="logo-wide svg"></div> - </a> - <div id="logo-claim" style="display:none;"><?php p($theme->getLogoClaim()); ?></div> - <div class="header-right"> - <?php p($l->t('Already have an account?')); ?> - <?php $url = OCP\Util::linkToAbsolute( '', 'index.php' ).'?redirect_url='.$urlGenerator->linkToRoute('polls_goto', array('poll_id' => $poll_id)); ?> - <a href="<?php p($url); ?>"><?php p($l->t('Login')); ?></a> - </div> - </div> - </header> - </p> - <p> </p><p> </p> <?php // for some reason the header covers the title otherwise ?> -<?php endif; ?> ---> - - -<h1><?php p($poll->getTitle()); ?></h1> -<div class="wordwrap desc"><?php p($line); ?></div> +if ($poll->getDescription() !== null && $poll->getDescription() !== '') { + $line = str_replace("\n", '<br/>', $poll->getDescription()); +} else { + $line = $l->t('No description provided.'); +} -<? -// -------------- url --------------- +// init array for counting 'yes'-votes for each date +$total_y = array(); +$total_n = array(); +for ($i = 0 ; $i < count($dates) ; $i++) { + $total_y[$i] = 0; + $total_n[$i] = 0; +} +$user_voted = array(); +$pollUrl = OCP\Util::linkToAbsolute('', $urlGenerator->linkToRoute('polls.page.goto_poll', ['hash' => $poll->getHash()])); ?> -<h2><?php p($l->t('Poll URL')); ?></h2> -<p class="url"> - <?php - $url = $urlGenerator->linkToRoute('polls.page.goto_poll', ['hash' => $poll->getHash()]); - ?> - <a href="<?php p($url);?>"><?php p($url); ?></a> -</p> - -<div class="scroll_div"> - <table class="vote_table" id="id_table_1"> <?php //from above title ?> - <tr> - <th></th> - <th></th> - <?php - if ($poll_type === '0') { - print_unescaped($for_string_years); - } - else { - foreach ($dates as $el) { - print_unescaped('<th title="' . $el->getText(). '">' . $el->getText() . '</th>'); - } - } - ?> - </tr> - <?php - if ($poll_type === '0'){ - print_unescaped('<tr><th></th><td></td>' . $for_string_dates . '</tr>'); +<div id="app"> + <div id="app-content"> + <div id="app-content-wrapper"> + <?php if(!User::isLoggedIn()) : ?> + <div class="row"> + <div class="col-100"> + <div class="alert-info"> + <?php + p($l->t('Already have an account?')); + $loginUrl = OCP\Util::linkToAbsolute('', 'index.php' ) . '?redirect_url=' . $urlGenerator->linkToRoute('polls.page.goto_poll', ['hash' => $poll->getHash()]); + ?> + <a href="<?php p($loginUrl); ?>"><?php p($l->t('Login')); ?></a> + </div> + </div> + </div> + <?php endif; ?> + <header class="row"> + <div class="col-100"> + <h1><?php p($poll->getTitle()); ?></h1> + <div class="wordwrap desc"><?php p($line); ?></div> + </div> + </header> + <div class="row"> + <div class="col-70"> + <h2><?php p($l->t('Poll')); ?></h2> + <div class="scroll_div"> + <table class="vote_table" id="id_table_1"> + <thead> + <tr> + <?php + if ($poll->getType() === '0') { + print_unescaped('<th rowspan=3></th>'); + print_unescaped($for_string_years); + print_unescaped('<th class="bordered" rowspan=3>' . $l->t('All') . '</th>'); + } else { + print_unescaped('<th></th>'); + foreach ($dates as $el) { + print_unescaped('<th title="' . $el->getText(). '" class="bordered">' . $el->getText() . '</th>'); + } + print_unescaped('<th class="bordered">' . $l->t('All') . '</th>'); + } + ?> + </tr> + <?php + if ($poll->getType() === '0'){ + print_unescaped('<tr>' . $for_string_dates . '</tr><tr>'); + $prev = ""; + for ($i = 0; $i < count($dates); $i++) { + $c = ($prev != date('Y-m-d', strtotime($dates[$i]->getDt())) ? ' bordered' : ''); + $prev = date('Y-m-d', strtotime($dates[$i]->getDt())); + $ch_obj = date('H:i', strtotime($dates[$i]->getDt())); + print_unescaped('<th class="time-slot-cell' . $c . '">' . $ch_obj . '</th>'); + + } + print_unescaped('</tr>'); + } + ?> + </thead> + <tbody class="votes"> + <?php + if ($votes !== null) { + //group by user + $others = array(); + foreach ($votes as $vote) { + if (!isset($others[$vote->getUserId()])) { + $others[$vote->getUserId()] = array(); + } + array_push($others[$vote->getUserId()], $vote); + } + foreach (array_keys($others) as $usr) { + if ($usr === $userId) { + // if poll expired, just put current user among the others; + // otherwise skip here to add current user as last row (to vote) + if (!$expired) { + $user_voted = $others[$usr]; + continue; + } + } + print_unescaped('<tr>'); + if($userMgr->get($usr) != null) { + print_unescaped('<th class="user-cell">'); + $avatar = $avaMgr->getAvatar($usr)->get(32); + if($avatar !== false) { + print_unescaped('<img class="userNameImg" src="data:' . $avatar->mimeType() . ';base64,' . $avatar . '" />'); + } else { + print_unescaped('<div class="userNameImg noAvatar" style="background-color:' . getHsl($usr) . ';">' . strtoupper($usr[0]) . '</div>'); + } + p($userMgr->get($usr)->getDisplayName()); + } else { + print_unescaped('<th class="user-cell external"> '. $usr); + } + print_unescaped('</th>'); - print_unescaped('<tr><th></th><td></td>'); - for ($i = 0; $i < count($dates); $i++) { - $ch_obj = date('H:i', strtotime($dates[$i]->getDt())); - print_unescaped('<th class="time-slot-cell">' . $ch_obj . '</th>'); - } - print_unescaped('</tr>'); - } + // loop over dts + $i_tot = 0; + foreach($dates as $dt) { + if ($poll->getType() === '0') { + $date_id = strtotime($dt->getDt()); + } else { + $date_id = $dt->getText(); + } + // look what user voted for this dts + $found = false; + foreach ($others[$usr] as $vote) { + if ($date_id === strtotime($vote->getDt())) { + if ($vote->getType() === '1') { + $cl = 'poll-cell-is'; + $total_y[$i_tot]++; + } else if ($vote->getType() === '0') { + $cl = 'poll-cell-not'; + $total_n[$i_tot]++; + } else { + $cl = 'poll-cell-maybe'; + } + $found = true; + break; + } + } + if(!$found) { + $cl = 'poll-cell-un'; + } + print_unescaped('<td class="' . $cl . '"></td>'); + $i_tot++; + } + print_unescaped('<td></td>'); + print_unescaped('</tr>'); + } + } + $total_y_others = array_merge(array(), $total_y); + $total_n_others = array_merge(array(), $total_n); + if (!$expired) { + print_unescaped('<tr class="current-user">'); + if (User::isLoggedIn()) { + print_unescaped('<th class="user-cell">'); + $avatar = $avaMgr->getAvatar($userId)->get(32); + if($avatar !== false) { + print_unescaped('<img class="userNameImg" src="data:' . $avatar->mimeType() . ';base64,' . $avatar . '" />'); + } else { + print_unescaped('<div class="userNameImg noAvatar" style="background-color:' . getHsl($userId) . ';">' . strtoupper($userId[0]) . '</div>'); + } + p($userMgr->get($userId)->getDisplayName()); + print_unescaped('</th>'); + } else { + print_unescaped('<th id="id_ac_detected" class="external current-user"><input type="text" name="user_name" id="user_name" placeholder="' . $l->t('Your name here') . '" /></th>'); + } + $i_tot = 0; + foreach ($dates as $dt) { + if ($poll->getType() === '0') { + $date_id = strtotime($dt->getDt()); + } else { + $date_id = $dt->getText(); + } + // see if user already has data for this event + $cl = 'poll-cell-active-un'; + if (isset($user_voted)) { + foreach ($user_voted as $obj) { + $voteVal = null; + if($poll->getType() === '0') { + $voteVal = strtotime($obj->getDt()); + } else { + $voteVal = $obj->getText(); + } + if ($voteVal === $date_id) { + if ($obj->getType() === '1') { + $cl = 'poll-cell-active-is'; + $total_y[$i_tot]++; + } else if ($obj->getType() === '0') { + $cl = 'poll-cell-active-not'; + $total_n[$i_tot]++; + } else if($obj->getType() === '2'){ + $cl = 'poll-cell-active-maybe'; + } + break; + } + } + } + print_unescaped('<td class="cl_click ' . $cl . '" id="' . $date_id . '"></td>'); + $i_tot++; + } + print_unescaped('<td class="toggle-all selected-maybe"></td></tr>'); + } + ?> + </tbody> + <tbody class="total"> + <?php + $diff_array = $total_y; + for($i = 0 ; $i < count($diff_array) ; $i++) { + $diff_array[$i] = ($total_y[$i] - $total_n[$i]); + } + $max_votes = max($diff_array); + ?> + <tr> + <th><?php p($l->t('Total')); ?></th> + <?php for ($i = 0 ; $i < count($dates) ; $i++) : ?> + <td class="total"> + <?php + $classSuffix = $poll->getType() === '0' ? strtotime($dates[$i]->getDt()) : str_replace(' ', '_', $dates[$i]->getText()); + if (isset($total_y[$i])) { + $val = $total_y[$i]; + } else { + $val = 0; + } + ?> + <div id="id_y_<?php p($classSuffix); ?>" class="color_yes" data-value=<?php p(isset($total_y_others[$i]) ? $total_y_others[$i] : '0'); ?>> + <?php p($val); ?> + </div> + <div id="id_n_<?php p($classSuffix); ?>" class="color_no" data-value=<?php p(isset($total_n_others[$i]) ? $total_n_others[$i] : '0'); ?>> + <?php p(isset($total_n[$i]) ? $total_n[$i] : '0'); ?> + </div> + </td> + <?php endfor; ?> + <td></td> + </tr> + <tr> + <th><?php p($l->t('Best option')); ?></th> + <?php + for ($i = 0; $i < count($dates); $i++) { + $check = ''; + if ($total_y[$i] - $total_n[$i] === $max_votes){ + $check = 'icon-checkmark'; + } + print_unescaped('<td class="win_row ' . $check . '" id="id_total_' . $i . '"></td>'); + } + ?> + <td class="bordered"></td> + </tr> + </tbody> + <tfoot> + <?php + if ($poll->getType() === '0') { + print_unescaped('<tr><th rowspan=3></th>'); + $prev = ""; + for ($i = 0; $i < count($dates); $i++) { + $c = ($prev != date('Y-m-d', strtotime($dates[$i]->getDt())) ? ' bordered' : ''); + $prev = date('Y-m-d', strtotime($dates[$i]->getDt())); + $ch_obj = date('H:i', strtotime($dates[$i]->getDt())); + print_unescaped('<th class="time-slot-cell' . $c . '">' . $ch_obj . '</th>'); + } + print_unescaped('<th rowspan=3 class="bordered">' . $l->t('All') . '</th></tr>'); + print_unescaped('<tr>' . $for_string_dates . '</tr>'); + } + ?> + <tr> + <?php + if ($poll->getType() === '0') { + print_unescaped($for_string_years); + } else { + print_unescaped('<th></th>'); + foreach ($dates as $el) { + print_unescaped('<th title="' . $el->getText() . '" class="bordered">' . $el->getText() . '</th>'); + } + print_unescaped('<th class="bordered"></th>'); + } + ?> + </tr> + </tfoot> + </table> + </div> + <div class="input-group share"> + <div class="input-group-addon"> + <span class="icon-share"></span> Link + </div> + <input type="text" value="<?php p($pollUrl);?>" readonly="readonly"> + </div> + <?php if(User::isLoggedIn()) : ?> + <p> + <input type="checkbox" id="check_notif" <?php if($notification !== null) print_unescaped(' checked'); ?> /> + <label for="check_notif"><?php p($l->t('Receive notification email on activity')); ?></label> + </p> + <?php endif; ?> - // init array for counting 'yes'-votes for each dt - $total_y = array(); - $total_n = array(); - for ($i = 0; $i < count($dates); $i++){ - $total_y[$i] = 0; - $total_n[$i] = 0; - } - $user_voted = array(); - // -------------- other users --------------- - // loop over users - ?> - <?php - if ($votes !== null) { - //group by user - $others = array(); - foreach ($votes as $vote) { - if (!isset($others[$vote->getUserId()])) { - $others[$vote->getUserId()] = array(); - } - array_push($others[$vote->getUserId()], $vote); - } - foreach (array_keys($others) as $usr) { - if ($usr === $userId) { - // if poll expired, just put current user among the others; - // otherwise skip here to add current user as last row (to vote) - if (!$expired) { - $user_voted = $others[$usr]; - continue; - } - } - print_unescaped('<tr>'); - print_unescaped('<th class="user-cell">'); - if($userMgr->get($usr) != null) { - $avatar = $avaMgr->getAvatar($usr)->get(32); - if($avatar !== false) { - $avatarImg = '<img class="userNameImg" src="data:' . $avatar->mimeType() . ';base64,' . $avatar . '" />'; - } else { - $avatarImg = '<div class="userNameImg noAvatar" style="background-color:' . getHsl($usr) . ';">' . strtoupper($usr[0]) . '</div>'; - } - print_unescaped($avatarImg); - p($userMgr->get($usr)->getDisplayName()); - } - else p($usr); - print_unescaped('</th>'); - print_unescaped('<td></td>'); //empty cell for toggle vote (only current user) - $i_tot = -1; + <form name="finish_vote" action="<?php p($urlGenerator->linkToRoute('polls.page.insert_vote')); ?>" method="POST"> + <input type="hidden" name="pollId" value="<?php p($poll->getId()); ?>" /> + <input type="hidden" name="userId" value="<?php p($userId); ?>" /> + <input type="hidden" name="dates" value="<?php p($poll->getId()); ?>" /> + <input type="hidden" name="types" value="<?php p($poll->getId()); ?>" /> + <input type="hidden" name="notif" /> + <input type="hidden" name="changed" /> + <input type="button" id="submit_finish_vote" value="<?php p($l->t('Vote!')); ?>" /> + <?php if(User::isLoggedIn()) : ?> + <a href="<?php p($urlGenerator->linkToRoute('polls.page.index')); ?>" class="button home-link"><?php p($l->t('Polls summary')); ?></a> + <?php endif; ?> + </form> - // loop over dts - foreach($dates as $dt) { - $i_tot++; - $date_id = ''; - if ($poll_type === '0') { - $date_id = strtotime($dt->getDt()); - } - else { - $date_id = $dt->getText(); - } - // look what user voted for this dts - $found = false; - foreach ($others[$usr] as $vote) { - if ($date_id === strtotime($vote->getDt())) { - if ($vote->getType() === '1') { - $cl = 'poll-cell-is'; - $total_y[$i_tot]++; - } - else if ($vote->getType() === '0') { - $cl = 'poll-cell-not'; - $total_n[$i_tot]++; - } else { - $cl = 'poll-cell-maybe'; - } - $found = true; - break; - } - } - if(!$found) { - $cl = 'poll-cell-un'; - } - print_unescaped('<td class="' . $cl . '"></td>'); - } - print_unescaped('</tr>'); - } - } - // -------------- current user -------------- - ?> - <tr> - <?php - if (!$expired) { - if (User::isLoggedIn()) { - print_unescaped('<th class="user-cell">'); - $avatar = $avaMgr->getAvatar($userId)->get(32); - if($avatar !== false) { - $avatarImg = '<img class="userNameImg" src="data:' . $avatar->mimeType() . ';base64,' . $avatar . '" />'; - } else { - $avatarImg = '<div class="userNameImg noAvatar" style="background-color:' . getHsl($userId) . ';">' . strtoupper($userId[0]) . '</div>'; - } - print_unescaped($avatarImg); - p($userMgr->get($userId)->getDisplayName()); - print_unescaped('</th>'); - } else { - print_unescaped('<th id="id_ac_detected" ><input type="text" name="user_name" id="user_name" /></th>'); - } - print_unescaped('<td class="toggle-all selected-maybe"></td>'); - $i_tot = -1; - $date_id = ''; - foreach ($dates as $dt) { - $i_tot++; - if ($poll_type === '0') { - $date_id = strtotime($dt->getDt()); - } else { - $date_id = $dt->getText(); - } - // see if user already has data for this event - $cl = 'poll-cell-active-un'; - if (isset($user_voted)) { - foreach ($user_voted as $obj) { - $voteVal = null; - if($poll_type === '0') $voteVal = strtotime($obj->getDt()); - else $voteVal = $obj->getText(); - if ($voteVal === $date_id) { - if ($obj->getType() === '1') { - $cl = 'poll-cell-active-is'; - $total_y[$i_tot]++; - } else if ($obj->getType() === '0') { - $cl = 'poll-cell-active-not'; - $total_n[$i_tot]++; - } else if($obj->getType() === '2'){ - //$total_m[$i_tot]++; - $cl = 'poll-cell-active-maybe'; - } - break; - } - } - } - print_unescaped('<td class="cl_click ' . $cl . '" id="' . $date_id . '"></td>'); - } - } - ?> - </tr> - <?php // --------------- total -------------------- ?> - <?php - $diff_array = $total_y; - for($i = 0; $i < count($diff_array); $i++){ - $diff_array[$i] = ($total_y[$i] - $total_n[$i]); - } - $max_votes = max($diff_array); - ?> - <tr> - <th><?php p($l->t('Total')); ?>:</th> - <td></td> - <?php for ($i = 0; $i < count($dates); $i++) : ?> - <td> - <table id="id_tab_total"> - <tr> - <?php if($poll_type === '0'): ?> - <?php $classSuffix = strtotime($dates[$i]->getDt()); ?> - <?php else : ?> - <?php $classSuffix = str_replace(' ', '_', $dates[$i]->getText()); ?> + <?php if($expired) : ?> + <div id="expired_info"> + <h2><?php p($l->t('Poll expired')); ?></h2> + <p> + <?php p($l->t('The poll expired on %s. Voting is disabled, but you can still comment.', array(date('d.m.Y H:i', strtotime($poll->getExpire()))))); ?> + </p> + </div> + <?php endif; ?> + </div> + <div class="col-30"> + <h2><?php p($l->t('Comments')); ?></h2> + <div class="comments"> + <div class="comment new-comment"> + <?php if(!User::isLoggedIn()) : ?> + <div class="comment-content"> + <?php + p($l->t('You must be logged in to post a comment.')); + ?> + <a href="<?php p($loginUrl); ?>"><?php p($l->t('Login')); ?></a> + </div> + <?php else: ?> + <form name="send_comment" action="<?php p($urlGenerator->linkToRoute('polls.page.insert_comment')); ?>" method="POST"> + <input type="hidden" name="pollId" value="<?php p($poll->getId()); ?>" /> + <input type="hidden" name="userId" value="<?php p($userId); ?>" /> + <div class="comment-content"> + <textarea id="commentBox" name="commentBox"></textarea> + <p> + <input type="button" id="submit_send_comment" value="<?php p($l->t('Send!')); ?>" /> + <span class="icon-loading-small" style="float:right;"></span> + </p> + </div> + </form> <?php endif; ?> - <td id="id_y_<?php p($classSuffix); ?>" - <?php if(isset($total_y[$i])) : ?> - <?php if( $total_y[$i] - $total_n[$i] === $max_votes) : ?> + </div> + <?php if($comments !== null) : ?> + <?php foreach ($comments as $comment) : ?> + <div class="comment"> + <div class="comment-header"> <?php - $class = 'cl_total_y cl_win'; + print_unescaped('<span class="comment-date">' . date('d.m.Y H:i:s', strtotime($comment->getDt())) . '</span>'); + p($userMgr->get($comment->getUserId())->getDisplayName()); ?> - <?php else : ?> - <?php $class='cl_total_y'; ?> - <?php endif; ?> - <?php $val = $total_y[$i]; ?> - <?php else : ?> - <?php $val = 0; ?> - <?php endif; ?> - class="<?php p($class); ?>"><?php p($val); ?> - </td> - </tr> - <tr> - <td id="id_n_<?php p($classSuffix); ?>" class="cl_total_n"><?php p(isset($total_n[$i]) ? $total_n[$i] : '0'); ?></td> - </tr> - </table> - </td> - <?php endfor; ?> - </tr> - - <?php // ------------ winner ----------------------- ?> - <tr> - <th><?php p($l->t('Win:')); ?></th> - <td></td> - <?php for ($i = 0; $i < count($dates); $i++) : - $check = ''; - if ($total_y[$i] - $total_n[$i] === $max_votes){ - $check = 'icon-checkmark'; - } - - print_unescaped('<td class="win_row ' . $check . '" id="id_total_' . $i . '"></td>'); - - endfor; - ?> - </tr> - <?php - if ($poll_type === '0'){ - print_unescaped('<tr><td></td><td></td>'); - for ($i = 0; $i < count($dates); $i++) { - $ch_obj = date('H:i', strtotime($dates[$i]->getDt())); - print_unescaped('<th>' . $ch_obj . '</th>'); - } - print_unescaped('</tr>'); - print_unescaped('<tr><td></td><td></td>' . $for_string_dates . '</tr>'); - } - ?> - <tr> - <th></th> - <th></th> - <?php - if ($poll_type === '0') { - print_unescaped($for_string_years); - } - else { - foreach ($dates as $el) { - print_unescaped('<th title="' . $el->getText() . '">' . $el->getText() . '</th>'); - } - } - ?> - </tr> - </table> -</div> - -<?php if(User::isLoggedIn()) : ?> - <input type="checkbox" id="check_notif" <?php if($notification !== null) print_unescaped(' checked'); ?> /> - <label for="check_notif"><?php p($l->t('Receive notification email on activity')); ?></label> - <br/> -<?php endif; ?> - -<a href="<?php p($urlGenerator->linkToRoute('polls.page.index')); ?>" style="float:left;padding-right: 5px;"><input type="button" class="icon-home" /></a> -<form name="finish_vote" action="<?php p($urlGenerator->linkToRoute('polls.page.insert_vote')); ?>" method="POST"> - <input type="hidden" name="pollId" value="<?php p($poll->getId()); ?>" /> - <input type="hidden" name="userId" value="<?php p($userId); ?>" /> - <input type="hidden" name="dates" value="<?php p($poll->getId()); ?>" /> - <input type="hidden" name="types" value="<?php p($poll->getId()); ?>" /> - <input type="hidden" name="notif" /> - <input type="hidden" name="changed" /> - <input type="button" id="submit_finish_vote" value="<?php p($l->t('Vote!')); ?>" /> -</form> - - -<?php if($expired) : ?> -<div id="expired_info"> - <h2><?php p($l->t('Poll expired')); ?></h2> - <p> - <?php p($l->t('The poll expired on %s. Voting is disabled, but you can still comment.', array(date('d.m.Y H:i', strtotime($poll->getExpire()))))); ?> - </p> -</div> -<?php endif; ?> - -<?php // -------- comments ---------- ?> -<h2><?php p($l->t('Comments')); ?></h2> -<div class="cl_user_comments"> - <?php if($comments !== null) : ?> - <?php foreach ($comments as $comment) : ?> - <div class="user_comment"> - <?php - p($userMgr->get($comment->getUserId())->getDisplayName()); - print_unescaped(' <i class="date">' . date('d.m.Y H:i', strtotime($comment->getDt())) . '</i>'); - ?> - <div class="wordwrap user_comment_text"> - <?php p($comment->getComment()); ?> + </div> + <div class="wordwrap comment-content"> + <?php p($comment->getComment()); ?> + </div> + </div> + <?php endforeach; ?> + <?php else : ?> + <?php p($l->t('No comments yet. Be the first.')); ?> + <?php endif; ?> + </div> + </div> </div> </div> - <?php endforeach; ?> - <?php else : ?> - <?php p($l->t('No comments yet. Be the first.')); ?> - <?php endif; ?> - <div class="cl_comment"> - <form name="send_comment" action="<?php p($urlGenerator->linkToRoute('polls.page.insert_comment')); ?>" method="POST"> - <input type="hidden" name="pollId" value="<?php p($poll->getId()); ?>" /> - <input type="hidden" name="userId" value="<?php p($userId); ?>" /> - <?php // -------- leave comment ---------- ?> - <h3><?php p($l->t('Write new Comment')); ?></h3> - <textarea style="width: 300px;" cols="50" rows="3" id="commentBox" name="commentBox"></textarea> - <br/> - <input type="button" id="submit_send_comment" value="<?php p($l->t('Send!')); ?>" /> - </form> </div> </div> <?php - //adapted from jsxc.chat - function getHsl($str) { - $hash = 0; - for($i=0; $i<strlen($str); $i++) { - $utf16_char = mb_convert_encoding($str[$i], "utf-16", "utf-8"); - $char = hexdec(bin2hex($utf16_char)); - $hash = (($hash << 5) - $hash) + $char; - $hash |= 0; // Convert to 32bit integer - } - $hue = abs($hash) % 360; - $saturation = 90; - $lightness = 65; - return 'hsl(' . $hue . ', ' . $saturation . '%, ' . $lightness . '%)'; +//adapted from jsxc.chat +function getHsl($str) { + $hash = 0; + for($i=0; $i<strlen($str); $i++) { + $utf16_char = mb_convert_encoding($str[$i], "utf-16", "utf-8"); + $char = hexdec(bin2hex($utf16_char)); + $hash = (($hash << 5) - $hash) + $char; + $hash |= 0; // Convert to 32bit integer } + $hue = abs($hash) % 360; + $saturation = 90; + $lightness = 65; + return 'hsl(' . $hue . ', ' . $saturation . '%, ' . $lightness . '%)'; +} ?> diff --git a/templates/main.tmpl.php b/templates/main.tmpl.php index 005b7f3e..6cbd4aa4 100644 --- a/templates/main.tmpl.php +++ b/templates/main.tmpl.php @@ -1,21 +1,26 @@ <?php \OCP\Util::addStyle('polls', 'main'); + \OCP\Util::addStyle('polls', 'list'); \OCP\Util::addScript('polls', 'start'); use OCP\User; $userId = $_['userId']; $userMgr = $_['userMgr']; $urlGenerator = $_['urlGenerator']; ?> - -<h1><?php p($l->t('Summary')); ?></h1> -<div class="goto_poll"> - <?php - $url = $urlGenerator->linkToRoute('polls.page.index'); - ?> +<div id="app"> + <div id="app-content"> + <div id="app-content-wrapper"> + <header class="row"> + <div class="col-100"> + <h1><?php p($l->t('Summary')); ?></h1> + </div> + </header> + <div class="goto_poll col-100"> <?php if(count($_['polls']) === 0) : ?> <?php p($l->t('No existing polls.')); ?> <?php else : ?> <table class="cl_create_form"> + <thead> <tr> <th><?php p($l->t('Title')); ?></th> <th id="id_th_descr"><?php p($l->t('Description')); ?></th> @@ -26,11 +31,13 @@ <th id="id_th_descr"><?php p($l->t('Access')); ?></th> <th><?php p($l->t('Options')); ?></th> </tr> + </thead> + <tbody> <?php foreach ($_['polls'] as $poll) : ?> <?php if (!userHasAccess($poll, $userId)) continue; // direct url to poll - $pollUrl = $url . 'goto/' . $poll->getHash(); + $pollUrl = $urlGenerator->linkToRoute('polls.page.goto_poll', array('hash' => $poll->getHash())); ?> <tr> <td title="<?php p($l->t('Go to')); ?>"> @@ -44,7 +51,7 @@ } ?> <td><?php p($desc_str); ?></td> - <td class="cl_poll_url" title="<?php p($l->t('Click to get link')); ?>"><input type="hidden" value="<?php p($pollUrl); ?>" /><?php p(date('d.m.Y H:i', strtotime($poll->getCreated()))); ?></td> + <td><?php p(date('d.m.Y H:i', strtotime($poll->getCreated()))); ?></td> <td> <?php if($poll->getOwner() === $userId) p($l->t('Yourself')); @@ -92,7 +99,7 @@ <div class="partic_all <?php p($partic_class); ?>"> </div> </td> - <td <?php if ($poll->getOwner() === $userId) print_unescaped('class="cl_poll_access" id="cl_poll_access_' . $poll->getId() . '" title="'.$l->t('Edit access').'"'); ?> > + <td> <?php p($l->t($poll->getAccess())); ?> </td> <td> @@ -100,15 +107,20 @@ <input type="button" id="id_del_<?php p($poll->getId()); ?>" class="table_button cl_delete icon-delete"></input> <a href="<?php p($urlGenerator->linkToRoute('polls.page.edit_poll', ['hash' => $poll->getHash()])); ?>"><input type="button" id="id_edit_<?php p($poll->getId()); ?>" class="table_button cl_edit icon-rename"></input></a> <?php endif; ?> + <input type="button" class="table_button cl_link icon-public" data-url="<?php p(OCP\Util::linkToAbsolute('', $pollUrl)); ?>" title="<?php p($l->t('Click to get link')); ?>"></input> </td> </tr> <?php endforeach; ?> + </tbody> </table> <form id="form_delete_poll" name="form_delete_poll" action="<?php p($urlGenerator->linkToRoute('polls.page.delete_poll')); ?>" method="POST"> </form> <?php endif; ?> + <a href="<?php p($urlGenerator->linkToRoute('polls.page.create_poll')); ?>"><input type="button" id="submit_new_poll" class="icon-add" /></a> +</div> +</div> +</div> </div> -<a href="<?php p($urlGenerator->linkToRoute('polls.page.create_poll')); ?>"><input type="button" id="submit_new_poll" class="icon-add" /></a> <?php // ---- helper functions ---- diff --git a/templates/no.acc.tmpl.php b/templates/no.acc.tmpl.php index 012b5c10..46a5f06d 100644 --- a/templates/no.acc.tmpl.php +++ b/templates/no.acc.tmpl.php @@ -1,13 +1,21 @@ <?php - \OCP\Util::addStyle('polls', 'main'); +\OCP\Util::addStyle('polls', 'main'); ?> -<h1> - <center> - <?php p($l->t('Error')); ?> - </center> -</h1> -<h2> - <center> - <?php p($l->t('You are not allowed to view this poll or the poll does not exist.')); ?> - </center> -</h2> +<div id="app"> + <div id="app-content"> + <div id="app-content-wrapper"> + <header> + <div class="row"> + <div class="col-100"> + <h1> + <?php p($l->t('Access denied')); ?> + </h1> + <h2> + <?php p($l->t('You are not allowed to view this poll or the poll does not exist.')); ?> + </h2> + </div> + </div> + </header> + </div> + </div> +</div> |