diff --git a/client/src/app-components/ticket-event.js b/client/src/app-components/ticket-event.js
index 719f417d..c088932f 100644
--- a/client/src/app-components/ticket-event.js
+++ b/client/src/app-components/ticket-event.js
@@ -223,26 +223,9 @@ class TicketEvent extends React.Component {
const fileName = filePath.replace(/^.*[\\\/]/, '');
return (
- {fileName}
+ {fileName}
)
}
-
- onFileClick(filePath) {
- API.call({
- path: '/system/download',
- plain: true,
- data: {
- file: filePath
- }
- }).then((result) => {
- let contentType = 'application/octet-stream';
- let link = document.createElement('a');
- let blob = new Blob([result], {'type': contentType});
- link.href = window.URL.createObjectURL(blob);
- link.download = filePath;
- link.click();
- });
- }
}
export default TicketEvent;
diff --git a/client/src/app-components/ticket-viewer.js b/client/src/app-components/ticket-viewer.js
index c00b875a..ff21c462 100644
--- a/client/src/app-components/ticket-viewer.js
+++ b/client/src/app-components/ticket-viewer.js
@@ -323,6 +323,7 @@ class TicketViewer extends React.Component {
API.call({
path: '/ticket/comment',
+ dataAsForm: true,
data: _.extend({
ticketNumber: this.props.ticket.ticketNumber
}, formState)
diff --git a/client/src/app/admin/admin-login-page.js b/client/src/app/admin/admin-login-page.js
index 9d7f2770..54d38d5d 100644
--- a/client/src/app/admin/admin-login-page.js
+++ b/client/src/app/admin/admin-login-page.js
@@ -3,6 +3,7 @@ import _ from 'lodash';
import {connect} from 'react-redux';
import i18n from 'lib-app/i18n';
+import API from 'lib-app/api-call';
import SessionActions from 'actions/session-actions';
import Form from 'core-components/form';
@@ -16,7 +17,7 @@ class AdminLoginPage extends React.Component {
return (
-

+
);
diff --git a/client/src/app/admin/panel/admin-panel-staff-widget.scss b/client/src/app/admin/panel/admin-panel-staff-widget.scss
index 1de336ad..b75184d3 100644
--- a/client/src/app/admin/panel/admin-panel-staff-widget.scss
+++ b/client/src/app/admin/panel/admin-panel-staff-widget.scss
@@ -8,6 +8,7 @@
text-align: center;
&__profile-pic-wrapper {
+ background-color: white;
position: absolute;
top: 8px;
border: 4px solid $grey;
diff --git a/client/src/app/admin/panel/staff/staff-editor.js b/client/src/app/admin/panel/staff/staff-editor.js
index a173bc1f..ea4e056d 100644
--- a/client/src/app/admin/panel/staff/staff-editor.js
+++ b/client/src/app/admin/panel/staff/staff-editor.js
@@ -73,7 +73,7 @@ class StaffEditor extends React.Component {
@@ -306,6 +306,7 @@ class StaffEditor extends React.Component {
API.call({
path: '/staff/edit',
+ dataAsForm: true,
data: {
staffId: this.props.staffId,
file: event.target.files[0]
diff --git a/client/src/app/admin/panel/staff/staff-editor.scss b/client/src/app/admin/panel/staff/staff-editor.scss
index 4b6f8684..6a48b2c3 100644
--- a/client/src/app/admin/panel/staff/staff-editor.scss
+++ b/client/src/app/admin/panel/staff/staff-editor.scss
@@ -2,6 +2,10 @@
.staff-editor {
+ &__image-uploader {
+ opacity: 0;
+ }
+
&__card {
background-color: $primary-red;
position: relative;
@@ -11,10 +15,6 @@
border: 2px solid $grey;
margin-bottom: 20px;
- &__image-uploader {
- opacity: 0;
- }
-
&-pic {
height: 100%;
position: absolute;
@@ -45,7 +45,7 @@
&-wrapper {
transition: opacity 0.2s ease;
- background-color: $grey;
+ background-color: white;
position: absolute;
top: 20px;
border: 4px solid $grey;
diff --git a/client/src/app/main/dashboard/dashboard-create-ticket/create-ticket-form.js b/client/src/app/main/dashboard/dashboard-create-ticket/create-ticket-form.js
index 1ce083b3..0e927776 100644
--- a/client/src/app/main/dashboard/dashboard-create-ticket/create-ticket-form.js
+++ b/client/src/app/main/dashboard/dashboard-create-ticket/create-ticket-form.js
@@ -119,6 +119,7 @@ class CreateTicketForm extends React.Component {
API.call({
path: '/ticket/create',
+ dataAsForm: true,
data: _.extend({}, formState, {
captcha: captcha && captcha.getValue(),
departmentId: SessionStore.getDepartments()[formState.departmentIndex].id
diff --git a/client/src/lib-app/api-call.js b/client/src/lib-app/api-call.js
index 032c5bc0..2979e9b9 100644
--- a/client/src/lib-app/api-call.js
+++ b/client/src/lib-app/api-call.js
@@ -2,19 +2,35 @@ const _ = require('lodash');
const APIUtils = require('lib-core/APIUtils');
const SessionStore = require('lib-app/session-store');
-const root = 'http://localhost:3000/api';
+const url = 'http://localhost:3000';
+const apiUrl = 'http://localhost:3000/api';
-function processData (data) {
- return _.extend({
- csrf_token: SessionStore.getSessionData().token,
- csrf_userid: SessionStore.getSessionData().userId
- }, data);
+function processData (data, dataAsForm = false) {
+ let newData;
+
+ if(dataAsForm) {
+ newData = new FormData();
+
+ _.each(data, (value, key) => {
+ newData.append(key, value);
+ });
+
+ newData.append('csrf_token', SessionStore.getSessionData().token);
+ newData.append('csrf_userid', SessionStore.getSessionData().userId);
+ } else {
+ newData = _.extend({
+ csrf_token: SessionStore.getSessionData().token,
+ csrf_userid: SessionStore.getSessionData().userId
+ }, data)
+ }
+
+ return newData;
}
module.exports = {
- call: function ({path, data, plain}) {
+ call: function ({path, data, plain, dataAsForm}) {
return new Promise(function (resolve, reject) {
- APIUtils.post(root + path, processData(data))
+ APIUtils.post(apiUrl + path, processData(data, dataAsForm), dataAsForm)
.then(function (result) {
console.log(result);
@@ -33,5 +49,17 @@ module.exports = {
});
});
});
+ },
+
+ getFileLink(filePath) {
+ return apiUrl + '/system/download?file=' + filePath;
+ },
+
+ getAPIUrl() {
+ return apiUrl;
+ },
+
+ getURL() {
+ return url;
}
};
\ No newline at end of file
diff --git a/client/src/lib-core/APIUtils.js b/client/src/lib-core/APIUtils.js
index 65b52ae6..e655deb4 100644
--- a/client/src/lib-core/APIUtils.js
+++ b/client/src/lib-core/APIUtils.js
@@ -3,15 +3,25 @@ const $ = require('jquery');
const APIUtils = {
- getPromise(path, method, data) {
+ getPromise(path, method, data, dataAsForm) {
return (resolve, reject) => {
- $.ajax({
+ let options = {
url: path,
method: method,
- data: data,
- processData: false,
- contentType: false
- })
+ data: data
+ };
+
+ if(dataAsForm) {
+ options = {
+ url: path,
+ type: method,
+ data: data,
+ processData: false,
+ contentType: false
+ };
+ }
+
+ $.ajax(options)
.done(resolve)
.fail((jqXHR, textStatus) => {
reject(textStatus);
@@ -23,8 +33,8 @@ const APIUtils = {
return new Promise(this.getPromise(path, 'GET'));
},
- post(path, data) {
- return new Promise(this.getPromise(path, 'POST', data));
+ post(path, data, dataAsForm) {
+ return new Promise(this.getPromise(path, 'POST', data, dataAsForm));
},
patch(path, data) {
diff --git a/server/controllers/staff/edit.php b/server/controllers/staff/edit.php
index 05c0b1af..6bc3f7e1 100644
--- a/server/controllers/staff/edit.php
+++ b/server/controllers/staff/edit.php
@@ -57,8 +57,7 @@ class EditStaffController extends Controller {
$this->staffInstance->sharedDepartmentList = $this->getDepartmentList();
}
- if(Controller::request('file')) {
- $fileUploader = $this->uploadFile();
+ if($fileUploader = $this->uploadFile()) {
$this->staffInstance->profilePic = ($fileUploader instanceof FileUploader) ? $fileUploader->getFileName() : null;
}
diff --git a/server/controllers/system/download.php b/server/controllers/system/download.php
index b0b8e639..756fd56e 100644
--- a/server/controllers/system/download.php
+++ b/server/controllers/system/download.php
@@ -8,7 +8,7 @@ class DownloadController extends Controller {
public function validations() {
return [
- 'permission' => 'user',
+ 'permission' => 'any',
'requestData' => [
'file' => [
'validation' => DataValidator::alnum('_.-')->noWhitespace(),
@@ -20,23 +20,32 @@ class DownloadController extends Controller {
public function handler() {
$fileName = Controller::request('file');
+ $staffUser = Staff::getDataStore($fileName, 'profilePic');
- $loggedUser = Controller::getLoggedUser();
- $ticket = Ticket::getTicket($fileName, 'file');
+ if($staffUser->isNull()) {
+ $loggedUser = Controller::getLoggedUser();
- if($ticket->isNull() || ($this->isNotAuthor($ticket, $loggedUser) && $this->isNotOwner($ticket, $loggedUser))) {
- $ticketEvent = Ticketevent::getDataStore($fileName, 'file');
-
- if($ticketEvent->isNull()) {
+ if($loggedUser->isNull()) {
print '';
return;
}
- $ticket = $ticketEvent->ticket;
+ $ticket = Ticket::getTicket($fileName, 'file');
- if($this->isNotAuthor($ticket, $loggedUser) && $this->isNotOwner($ticket, $loggedUser)) {
- print '';
- return;
+ if($ticket->isNull() || ($this->isNotAuthor($ticket, $loggedUser) && $this->isNotOwner($ticket, $loggedUser))) {
+ $ticketEvent = Ticketevent::getDataStore($fileName, 'file');
+
+ if($ticketEvent->isNull()) {
+ print '';
+ return;
+ }
+
+ $ticket = $ticketEvent->ticket;
+
+ if($this->isNotAuthor($ticket, $loggedUser) && $this->isNotOwner($ticket, $loggedUser)) {
+ print '';
+ return;
+ }
}
}
diff --git a/server/controllers/system/init-settings.php b/server/controllers/system/init-settings.php
index a3bfdf65..8ac8314b 100644
--- a/server/controllers/system/init-settings.php
+++ b/server/controllers/system/init-settings.php
@@ -116,7 +116,7 @@ class InitSettingsController extends Controller {
'name' => 'Emilia Clarke',
'email' => 'staff@opensupports.com',
'password' => Hashing::hashPassword('staff'),
- 'profilePic' => 'http://www.opensupports.com/profilepic.jpg',
+ 'profilePic' => '',
'level' => 3,
'sharedDepartmentList' => Department::getAll(),
'sharedTicketList' => []
diff --git a/server/libs/Controller.php b/server/libs/Controller.php
index 95ca49ed..3fe2db45 100644
--- a/server/libs/Controller.php
+++ b/server/libs/Controller.php
@@ -33,10 +33,10 @@ abstract class Controller {
self::$dataRequester = function ($key) {
$app = self::getAppInstance();
- $value = $app->request()->post($key);
-
- if(!$value) {
+ if (Controller::getAppInstance()->request()->isGet()) {
$value = $app->request()->get($key);
+ } else {
+ $value = $app->request()->post($key);
}
return $value;
@@ -55,9 +55,9 @@ abstract class Controller {
$session = Session::getInstance();
if ($session->isStaffLogged()) {
- return Staff::getUser((int)self::request('csrf_userid'));
+ return Staff::getUser($session->getUserId());
} else {
- return User::getUser((int)self::request('csrf_userid'));
+ return User::getUser($session->getUserId());
}
}
diff --git a/server/models/Response.php b/server/models/Response.php
index bd20c480..0220a225 100644
--- a/server/models/Response.php
+++ b/server/models/Response.php
@@ -9,8 +9,9 @@ class Response {
);
$app = \Slim\Slim::getInstance();
- $app->response()->setBody(json_encode($response));
- $app->response()->finalize();
+ $app->response->headers->set('Content-Type', 'application/json');
+ $app->response->setBody(json_encode($response));
+ $app->response->finalize();
}
public static function respondSuccess($data = null) {
@@ -20,7 +21,8 @@ class Response {
);
$app = \Slim\Slim::getInstance();
- $app->response()->setBody(json_encode($response));
- $app->response()->finalize();
+ $app->response->headers->set('Content-Type', 'application/json');
+ $app->response->setBody(json_encode($response));
+ $app->response->finalize();
}
}
diff --git a/server/models/Session.php b/server/models/Session.php
index eceb9c13..bd5e987e 100644
--- a/server/models/Session.php
+++ b/server/models/Session.php
@@ -39,6 +39,10 @@ class Session {
return $this->getStoredData('ticketNumber');
}
+ public function getUserId() {
+ return $this->getStoredData('userId');
+ }
+
public function getToken() {
return $this->getStoredData('token');
}