diff --git a/client/src/app-components/ticket-event.js b/client/src/app-components/ticket-event.js
index 06a241d4..375f6391 100644
--- a/client/src/app-components/ticket-event.js
+++ b/client/src/app-components/ticket-event.js
@@ -7,6 +7,11 @@ import API from 'lib-app/api-call';
import DateTransformer from 'lib-core/date-transformer';
import Icon from 'core-components/icon';
import Tooltip from 'core-components/tooltip';
+import TextEditor from 'core-components/text-editor';
+import Button from 'core-components/button';
+import SubmitButton from 'core-components/submit-button';
+import Form from 'core-components/form';
+import FormField from 'core-components/form-field';
class TicketEvent extends React.Component {
static propTypes = {
@@ -23,6 +28,13 @@ class TicketEvent extends React.Component {
content: React.PropTypes.string,
date: React.PropTypes.string,
private: React.PropTypes.string,
+ edited: React.PropTypes.bool,
+ edit: React.PropTypes.bool,
+ onToggleEdit: React.PropTypes.func
+ };
+
+ state = {
+ content: this.props.content
};
render() {
@@ -95,12 +107,38 @@ class TicketEvent extends React.Component {
{(this.props.private*1) ? this.renderPrivateBadge() : null}
- {node}
+
+
+ {edited}
+
+
+ {node}
+
);
}
diff --git a/client/src/app-components/ticket-event.scss b/client/src/app-components/ticket-event.scss
index 26ccbf89..c5b6e920 100644
--- a/client/src/app-components/ticket-event.scss
+++ b/client/src/app-components/ticket-event.scss
@@ -96,21 +96,47 @@
border-top: none;
padding: 20px 10px;
text-align: left;
-
+ position:relative;
+
img {
max-width:100%;
}
+ &__edit {
+ position:absolute;
+ top: 3px;
+ right: 9px;
+ align-self: right;
+ color:white;
+ :hover {
+ color: grey;
+ cursor:pointer;
+ }
+ }
}
}
+ &__submit-edited-comment {
+ display:flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 8px;
+ }
- &__file {
+ &__items {
background-color: $very-light-grey;
- cursor: pointer;
- text-align: right;
- padding: 5px 10px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 8px;
font-size: 12px;
}
+ &__file {
+ cursor: pointer;
+ text-align: right;
+ }
+ &__edited{
+ font-style: italic;
+ }
&__comment-badge-value {
font-weight: normal;
}
diff --git a/client/src/app-components/ticket-viewer.js b/client/src/app-components/ticket-viewer.js
index fd724874..09e1fbad 100644
--- a/client/src/app-components/ticket-viewer.js
+++ b/client/src/app-components/ticket-viewer.js
@@ -47,7 +47,8 @@ class TicketViewer extends React.Component {
ticket: {
author: {},
department: {},
- comments: []
+ comments: [],
+ edited: null
}
};
@@ -55,7 +56,9 @@ class TicketViewer extends React.Component {
loading: false,
commentValue: TextEditor.createEmpty(),
commentEdited: false,
- commentPrivate: false
+ commentPrivate: false,
+ edit: false,
+ editId: 0
};
componentDidMount() {
@@ -78,7 +81,21 @@ class TicketViewer extends React.Component {
{this.props.editable ? this.renderEditableHeaders() : this.renderHeaders()}
{ticket.events && ticket.events.map(this.renderTicketEvent.bind(this))}
@@ -218,9 +235,18 @@ class TicketViewer extends React.Component {
if (this.props.userStaff && typeof options.content === 'string') {
options.content = MentionsParser.parse(options.content);
}
-
return (
-
+
);
}
@@ -452,6 +478,51 @@ class TicketViewer extends React.Component {
}
}
+ onToggleEdit(ticketEventId){
+ this.setState({
+ edit: !this.state.edit,
+ editId: ticketEventId
+ })
+ }
+
+ onEdit(ticketeventid,{content}) {
+ this.setState({
+ loading: true
+ });
+ const data = {};
+
+ if(ticketeventid){
+ data.ticketeventId = ticketeventid
+ }else{
+ data.ticketNumber = this.props.ticket.ticketNumber
+ }
+
+ API.call({
+ path: '/ticket/edit-comment',
+ data: _.extend(
+ data,
+ TextEditor.getContentFormData(content)
+ )
+ }).then(this.onEditCommentSuccess.bind(this), this.onFailCommentFail.bind(this));
+ }
+
+ onEditCommentSuccess() {
+ this.setState({
+ loading: false,
+ commentError: false,
+ commentEdited: false,
+ edit:false
+ });
+
+ this.onTicketModification();
+ }
+
+ onFailCommentFail() {
+ this.setState({
+ loading: false,
+ commentError: true
+ });
+ }
onSubmit(formState) {
this.setState({
loading: true
diff --git a/client/src/app/Routes.js b/client/src/app/Routes.js
index d2dfbcf5..0419c0db 100644
--- a/client/src/app/Routes.js
+++ b/client/src/app/Routes.js
@@ -35,7 +35,6 @@ import AdminPanelNewTickets from 'app/admin/panel/tickets/admin-panel-new-ticket
import AdminPanelAllTickets from 'app/admin/panel/tickets/admin-panel-all-tickets';
import AdminPanelViewTicket from 'app/admin/panel/tickets/admin-panel-view-ticket';
import AdminPanelCustomResponses from 'app/admin/panel/tickets/admin-panel-custom-responses';
-import AdminPanelCustomTags from 'app/admin/panel/tickets/admin-panel-custom-tags';
import AdminPanelListUsers from 'app/admin/panel/users/admin-panel-list-users';
import AdminPanelViewUser from 'app/admin/panel/users/admin-panel-view-user';
@@ -52,6 +51,7 @@ import AdminPanelViewStaff from 'app/admin/panel/staff/admin-panel-view-staff';
import AdminPanelSystemPreferences from 'app/admin/panel/settings/admin-panel-system-preferences';
import AdminPanelAdvancedSettings from 'app/admin/panel/settings/admin-panel-advanced-settings';
import AdminPanelEmailSettings from 'app/admin/panel/settings/admin-panel-email-settings';
+import AdminPanelCustomTags from 'app/admin/panel/settings/admin-panel-custom-tags';
// INSTALLATION
import InstallLayout from 'app/install/install-layout';
@@ -115,7 +115,6 @@ export default (
-
@@ -144,6 +143,7 @@ export default (
+
diff --git a/client/src/app/admin/panel/admin-panel-menu.js b/client/src/app/admin/panel/admin-panel-menu.js
index aaf8d634..da34ccb7 100644
--- a/client/src/app/admin/panel/admin-panel-menu.js
+++ b/client/src/app/admin/panel/admin-panel-menu.js
@@ -135,11 +135,6 @@ class AdminPanelMenu extends React.Component {
name: i18n('CUSTOM_RESPONSES'),
path: '/admin/panel/tickets/custom-responses',
level: 2
- },
- {
- name: i18n('CUSTOM_TAGS'),
- path: '/admin/panel/tickets/custom-tags',
- level: 1
}
])
},
@@ -219,6 +214,11 @@ class AdminPanelMenu extends React.Component {
name: i18n('EMAIL_SETTINGS'),
path: '/admin/panel/settings/email-settings',
level: 3
+ },
+ {
+ name: i18n('CUSTOM_TAGS'),
+ path: '/admin/panel/settings/custom-tags',
+ level: 3
}
])
}
diff --git a/client/src/app/admin/panel/settings/admin-panel-custom-tags.js b/client/src/app/admin/panel/settings/admin-panel-custom-tags.js
new file mode 100644
index 00000000..c74c5bb3
--- /dev/null
+++ b/client/src/app/admin/panel/settings/admin-panel-custom-tags.js
@@ -0,0 +1,102 @@
+import React from 'react';
+import {connect} from 'react-redux';
+
+import AdminPanelCustomTagsModal from 'app/admin/panel/tickets/admin-panel-custom-tags-modal';
+
+import i18n from 'lib-app/i18n';
+import API from 'lib-app/api-call';
+import ConfigActions from 'actions/config-actions';
+
+import AreYouSure from 'app-components/are-you-sure';
+import ModalContainer from 'app-components/modal-container';
+
+import Icon from 'core-components/icon';
+import Button from 'core-components/button';
+import Header from 'core-components/header';
+import Tag from 'core-components/tag';
+
+class AdminPanelCustomTags extends React.Component {
+ static propTypes = {
+ tags: React.PropTypes.arrayOf(
+ React.PropTypes.shape({
+ name: React.PropTypes.string,
+ color: React.PropTypes.string,
+ id: React.PropTypes.number
+ })
+ ),
+ };
+
+ componentDidMount() {
+ this.retrieveCustomTags();
+ }
+
+ render() {
+ return (
+
+
+ {this.renderContent()}
+
+ );
+ }
+
+ renderContent() {
+ return (
+
+
+
+
+
+ {this.props.tags.map(this.renderTag.bind(this))}
+
+
+ );
+ }
+
+ renderTag(tag, index) {
+ return (
+
+
+
+ )
+ }
+
+ openTagModal() {
+ ModalContainer.openModal(
+
+ );
+ }
+
+ openEditTagModal(tagId,tagName,tagColor, event) {
+ ModalContainer.openModal(
+
+ );
+ }
+
+ onDeleteClick(tagId, event) {
+ event.preventDefault();
+ AreYouSure.openModal(i18n('WILL_DELETE_CUSTOM_RESPONSE'), this.deleteCustomTag.bind(this, tagId));
+ }
+
+ deleteCustomTag(tagId) {
+ API.call({
+ path: '/ticket/delete-tag',
+ data: {
+ tagId,
+ }
+ }).then(() => {
+ this.retrieveCustomTags()
+ });
+ }
+
+ retrieveCustomTags() {
+ this.props.dispatch(ConfigActions.updateData());
+ }
+}
+
+export default connect((store) => {
+ return {
+ tags: store.config['tags']
+ };
+})(AdminPanelCustomTags);
diff --git a/client/src/app/admin/panel/settings/admin-panel-custom-tags.scss b/client/src/app/admin/panel/settings/admin-panel-custom-tags.scss
new file mode 100644
index 00000000..d8d8b51c
--- /dev/null
+++ b/client/src/app/admin/panel/settings/admin-panel-custom-tags.scss
@@ -0,0 +1,18 @@
+.admin-panel-custom-tags {
+
+ &__content {
+ text-align: left;
+ }
+
+ &__add-button-icon{
+ margin-left: 5px;
+ }
+
+ &__tag-list{
+ margin-top: 15px;
+ }
+
+ &__tag-container{
+ margin-top:5px ;
+ }
+}
diff --git a/client/src/app/admin/panel/tickets/admin-panel-custom-tags-modal.js b/client/src/app/admin/panel/tickets/admin-panel-custom-tags-modal.js
index c3398729..9db3e6ed 100644
--- a/client/src/app/admin/panel/tickets/admin-panel-custom-tags-modal.js
+++ b/client/src/app/admin/panel/tickets/admin-panel-custom-tags-modal.js
@@ -26,13 +26,45 @@ class AdminPanelCustomTagsModal extends React.Component {
};
render() {
+ return (
+ this.props.createTag ? this.renderCreateTagContent() : this.renderEditTagContent()
+ );
+ }
+
+ renderEditTagContent() {
+ return (
+
+ );
+ }
+
+ renderCreateTagContent() {
return (