mirror of
https://github.com/opensupports/opensupports.git
synced 2025-07-23 22:05:14 +02:00
Minor GitHub bugs (#806)
* text-validation to edit article content * shows only own department on my account * add moment and update date * Update date transformer * Delete time zone setting. * Use local date in date range component and utc date in date range filter. * Fix github comment. * Fix merge 'Fix filter show bug in ticket search when ordering'. * Fix merge 'Fix filter show bug in ticket search when ordering' second part. * Fix getDefaultUTCEndDate function. Co-authored-by: Ivan Diaz <ivan@opensupports.com> Co-authored-by: LautaroCesso <lautaro_cesso@hotmail.com>
This commit is contained in:
parent
5184c31907
commit
c00720d6a2
@ -75,6 +75,7 @@
|
|||||||
"localStorage": "^1.0.3",
|
"localStorage": "^1.0.3",
|
||||||
"lodash": "^4.17.15",
|
"lodash": "^4.17.15",
|
||||||
"messageformat": "^0.2.2",
|
"messageformat": "^0.2.2",
|
||||||
|
"moment": "^2.27.0",
|
||||||
"qs": "^6.5.2",
|
"qs": "^6.5.2",
|
||||||
"query-string": "^6.12.1",
|
"query-string": "^6.12.1",
|
||||||
"quill-image-resize-module-react": "^3.0.0",
|
"quill-image-resize-module-react": "^3.0.0",
|
||||||
|
@ -9,8 +9,6 @@ import API from 'lib-app/api-call';
|
|||||||
import history from 'lib-app/history';
|
import history from 'lib-app/history';
|
||||||
import searchTicketsUtils from 'lib-app/search-tickets-utils';
|
import searchTicketsUtils from 'lib-app/search-tickets-utils';
|
||||||
|
|
||||||
import DateTransformer from 'lib-core/date-transformer';
|
|
||||||
|
|
||||||
import Form from 'core-components/form';
|
import Form from 'core-components/form';
|
||||||
import SubmitButton from 'core-components/submit-button';
|
import SubmitButton from 'core-components/submit-button';
|
||||||
import FormField from 'core-components/form-field';
|
import FormField from 'core-components/form-field';
|
||||||
@ -19,10 +17,6 @@ import Button from 'core-components/button';
|
|||||||
import Loading from 'core-components/loading';
|
import Loading from 'core-components/loading';
|
||||||
|
|
||||||
|
|
||||||
const INITIAL_PAGE = 1;
|
|
||||||
|
|
||||||
const DEFAULT_START_DATE = 20170101;
|
|
||||||
|
|
||||||
class TicketQueryFilters extends React.Component {
|
class TicketQueryFilters extends React.Component {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
@ -59,7 +53,7 @@ class TicketQueryFilters extends React.Component {
|
|||||||
<FormField
|
<FormField
|
||||||
name="dateRange"
|
name="dateRange"
|
||||||
field="date-range"
|
field="date-range"
|
||||||
fieldProps={{defaultValue: this.dateRangeToFormValue(filters.dateRange)}} />
|
fieldProps={{defaultValue: formState.dateRange}} />
|
||||||
</div>
|
</div>
|
||||||
<div className="ticket-query-filters__row__filter">
|
<div className="ticket-query-filters__row__filter">
|
||||||
<span>{i18n('STATUS')}</span>
|
<span>{i18n('STATUS')}</span>
|
||||||
@ -207,16 +201,6 @@ class TicketQueryFilters extends React.Component {
|
|||||||
this.props.dispatch(SearchFiltersActions.setDefaultFormValues());
|
this.props.dispatch(SearchFiltersActions.setDefaultFormValues());
|
||||||
}
|
}
|
||||||
|
|
||||||
dateRangeToFormValue(_dateRange) {
|
|
||||||
const dateRange = JSON.parse(_dateRange);
|
|
||||||
|
|
||||||
return {
|
|
||||||
valid: true,
|
|
||||||
startDate: dateRange[0]/10000,
|
|
||||||
endDate: (dateRange[1]-2400)/10000,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
getDepartmentsItems() {
|
getDepartmentsItems() {
|
||||||
const { departments, } = this.props;
|
const { departments, } = this.props;
|
||||||
let departmentsList = departments.map(department => {
|
let departmentsList = departments.map(department => {
|
||||||
@ -321,7 +305,8 @@ class TicketQueryFilters extends React.Component {
|
|||||||
{...formState, orderBy: filters.orderBy, page: 1},
|
{...formState, orderBy: filters.orderBy, page: 1},
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
if(formEdited) {
|
|
||||||
|
if(formEdited && formState.dateRange.valid) {
|
||||||
const filtersForAPI = searchTicketsUtils.prepareFiltersForAPI(listConfigWithCompleteAuthorsList.filters);
|
const filtersForAPI = searchTicketsUtils.prepareFiltersForAPI(listConfigWithCompleteAuthorsList.filters);
|
||||||
const currentPath = window.location.pathname;
|
const currentPath = window.location.pathname;
|
||||||
const urlQuery = searchTicketsUtils.getFiltersForURL({
|
const urlQuery = searchTicketsUtils.getFiltersForURL({
|
||||||
@ -351,25 +336,25 @@ class TicketQueryFilters extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onChangeForm(data) {
|
onChangeForm(data) {
|
||||||
let newStartDate = data.dateRange.startDate === "" ? DEFAULT_START_DATE : data.dateRange.startDate;
|
const newStartDate = data.dateRange.startDate ? data.dateRange.startDate : searchTicketsUtils.getDefaultLocalStartDate();
|
||||||
let newEndDate = data.dateRange.endDate === "" ? DateTransformer.getDateToday() : data.dateRange.endDate;
|
const newEndDate = data.dateRange.endDate ? data.dateRange.endDate : searchTicketsUtils.getDefaultlocalEndDate();
|
||||||
let departmentsId = data.departments.map(department => department.id);
|
const departmentsId = data.departments.map(department => department.id);
|
||||||
let staffsId = data.owners.map(staff => staff.id);
|
const staffsId = data.owners.map(staff => staff.id);
|
||||||
let tagsName = this.tagsNametoTagsId(data.tags);
|
const tagsName = this.tagsNametoTagsId(data.tags);
|
||||||
let authors = data.authors.map(({name, id, isStaff, profilePic, color}) => ({name, id: id*1, isStaff, profilePic, color}));
|
const authors = data.authors.map(({name, id, isStaff, profilePic, color}) => ({name, id: id*1, isStaff, profilePic, color}));
|
||||||
|
|
||||||
this.onChangeFormState({
|
this.onChangeFormState({
|
||||||
...data,
|
...data,
|
||||||
tags: tagsName,
|
tags: tagsName,
|
||||||
owners: staffsId,
|
owners: staffsId,
|
||||||
departments: departmentsId,
|
departments: departmentsId,
|
||||||
authors: authors,
|
authors: authors,
|
||||||
dateRange: {
|
dateRange: {
|
||||||
...data.dateRange,
|
...data.dateRange,
|
||||||
startDate: newStartDate,
|
startDate: newStartDate,
|
||||||
endDate: newEndDate
|
endDate: newEndDate
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getFormValue(form) {
|
getFormValue(form) {
|
||||||
|
@ -3,7 +3,7 @@ import _ from 'lodash';
|
|||||||
import {connect} from 'react-redux';
|
import {connect} from 'react-redux';
|
||||||
|
|
||||||
import i18n from 'lib-app/i18n';
|
import i18n from 'lib-app/i18n';
|
||||||
import searchTicketsUtils from '../../../lib-app/search-tickets-utils';
|
import searchTicketsUtils from 'lib-app/search-tickets-utils';
|
||||||
|
|
||||||
import Menu from 'core-components/menu';
|
import Menu from 'core-components/menu';
|
||||||
import queryString from 'query-string';
|
import queryString from 'query-string';
|
||||||
|
@ -97,7 +97,7 @@ class AdminPanelViewArticle extends React.Component {
|
|||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<FormField name="title" label={i18n('TITLE')} />
|
<FormField name="title" label={i18n('TITLE')} />
|
||||||
<FormField name="content" label={i18n('CONTENT')} field="textarea" fieldProps={{allowImages: this.props.allowAttachments}}/>
|
<FormField name="content" label={i18n('CONTENT')} field="textarea" validation="TEXT_AREA" required fieldProps={{allowImages: this.props.allowAttachments}}/>
|
||||||
</Form>
|
</Form>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,6 @@ class AdminPanelSystemPreferences extends React.Component {
|
|||||||
</div>
|
</div>
|
||||||
<div className="col-md-6">
|
<div className="col-md-6">
|
||||||
<FormField label={i18n('SUPPORT_CENTER_TITLE')} fieldProps={{size: 'large'}} name="title" validation="TITLE" required/>
|
<FormField label={i18n('SUPPORT_CENTER_TITLE')} fieldProps={{size: 'large'}} name="title" validation="TITLE" required/>
|
||||||
<FormField label={i18n('DEFAULT_TIMEZONE')} fieldProps={{size: 'large'}} name="time-zone"/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="row">
|
<div className="row">
|
||||||
@ -149,7 +148,6 @@ class AdminPanelSystemPreferences extends React.Component {
|
|||||||
'url': form['url'],
|
'url': form['url'],
|
||||||
'title': form['title'],
|
'title': form['title'],
|
||||||
'layout': form['layout'] ? 'full-width' : 'boxed',
|
'layout': form['layout'] ? 'full-width' : 'boxed',
|
||||||
'time-zone': form['time-zone'],
|
|
||||||
'maintenance-mode': form['maintenance-mode'] * 1,
|
'maintenance-mode': form['maintenance-mode'] * 1,
|
||||||
'allow-attachments': form['allow-attachments'] * 1,
|
'allow-attachments': form['allow-attachments'] * 1,
|
||||||
'max-size': form['max-size'],
|
'max-size': form['max-size'],
|
||||||
@ -190,7 +188,6 @@ class AdminPanelSystemPreferences extends React.Component {
|
|||||||
'url': result.data['url'],
|
'url': result.data['url'],
|
||||||
'title': result.data['title'],
|
'title': result.data['title'],
|
||||||
'layout': (result.data['layout'] == 'full-width') ? 1 : 0,
|
'layout': (result.data['layout'] == 'full-width') ? 1 : 0,
|
||||||
'time-zone': result.data['time-zone'],
|
|
||||||
'maintenance-mode': !!(result.data['maintenance-mode'] * 1),
|
'maintenance-mode': !!(result.data['maintenance-mode'] * 1),
|
||||||
'allow-attachments': !!(result.data['allow-attachments'] * 1),
|
'allow-attachments': !!(result.data['allow-attachments'] * 1),
|
||||||
'max-size': result.data['max-size'],
|
'max-size': result.data['max-size'],
|
||||||
|
@ -109,7 +109,7 @@ class StaffEditor extends React.Component {
|
|||||||
<div className="col-md-4">
|
<div className="col-md-4">
|
||||||
<div className="staff-editor__departments">
|
<div className="staff-editor__departments">
|
||||||
<div className="staff-editor__departments-title">{i18n('DEPARTMENTS')}</div>
|
<div className="staff-editor__departments-title">{i18n('DEPARTMENTS')}</div>
|
||||||
{(!this.props.myAccount) ? this.renderDepartmentsForm() : this.renderDepartmentsInfo()}
|
{(this.props.myAccount && this.props.level !== 3) ? this.renderDepartmentsInfo() : this.renderDepartmentsForm()}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-8">
|
<div className="col-md-8">
|
||||||
@ -193,7 +193,7 @@ class StaffEditor extends React.Component {
|
|||||||
renderDepartmentsInfo() {
|
renderDepartmentsInfo() {
|
||||||
return (
|
return (
|
||||||
<Form values={{departments: this.state.departments}}>
|
<Form values={{departments: this.state.departments}}>
|
||||||
<FormField name="departments" field="checkbox-group" fieldProps={{items: this.getDepartments()}} />
|
<FormField name="departments" field="checkbox-group" fieldProps={{items: this.getDepartments().filter((department,index) => this.state.departments.includes(index))}} />
|
||||||
</Form>
|
</Form>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -262,7 +262,6 @@ class StaffEditor extends React.Component {
|
|||||||
departmentIndexes.push(index);
|
departmentIndexes.push(index);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return departmentIndexes;
|
return departmentIndexes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,6 @@ export function updateSearchTicketsFromURL() {
|
|||||||
searchTicketsUtils.prepareFiltersForAPI(listConfig.filters)
|
searchTicketsUtils.prepareFiltersForAPI(listConfig.filters)
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,18 +33,22 @@ class DateRange extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onChange(date, dateValue) {
|
onChange(date, dateValue) {
|
||||||
|
if(dateValue !== "") {
|
||||||
|
dateValue = dateValue*10000;
|
||||||
|
dateValue = (date === "startDate") ? dateValue : dateValue+2359;
|
||||||
|
} else {
|
||||||
|
dateValue = 0;
|
||||||
|
}
|
||||||
const value = _.clone(this.props.value);
|
const value = _.clone(this.props.value);
|
||||||
value[date] = dateValue;
|
value[date] = dateValue;
|
||||||
value.valid =
|
value.valid = this.dateCompare({startDate: value.startDate, endDate: value.endDate});
|
||||||
value.startDate !== 0 &&
|
|
||||||
value.endDate !== 0 && this.dateCompare({startDate: value.startDate, endDate: value.endDate});
|
|
||||||
this.props.onChange(value);
|
this.props.onChange(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
dateCompare(dateRange) {
|
dateCompare(dateRange) {
|
||||||
const { defaultValue, } = this.props;
|
const { defaultValue } = this.props;
|
||||||
let startDate = dateRange.startDate === "" ? defaultValue.startDate : dateRange.startDate;
|
const startDate = dateRange.startDate ? dateRange.startDate : defaultValue.startDate;
|
||||||
let endDate = dateRange.endDate === "" ? defaultValue.endDate : dateRange.endDate;
|
const endDate = dateRange.endDate ? dateRange.endDate : defaultValue.endDate;
|
||||||
let isValidRange = startDate <= endDate;
|
let isValidRange = startDate <= endDate;
|
||||||
return isValidRange;
|
return isValidRange;
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,6 @@ module.exports = [
|
|||||||
'url': 'http://www.opensupports.com/support',
|
'url': 'http://www.opensupports.com/support',
|
||||||
'title': 'Support Center',
|
'title': 'Support Center',
|
||||||
'layout': 'boxed',
|
'layout': 'boxed',
|
||||||
'time-zone': 3,
|
|
||||||
'server-email': 'shitr@post.com',
|
'server-email': 'shitr@post.com',
|
||||||
'smtp-host': 'localhost',
|
'smtp-host': 'localhost',
|
||||||
'smtp-port': '7070',
|
'smtp-port': '7070',
|
||||||
|
@ -4,6 +4,8 @@ import _ from 'lodash';
|
|||||||
import DateTransformer from 'lib-core/date-transformer';
|
import DateTransformer from 'lib-core/date-transformer';
|
||||||
import API from 'lib-app/api-call';
|
import API from 'lib-app/api-call';
|
||||||
|
|
||||||
|
const DEFAULT_UTC_START_DATE = 201701010000;
|
||||||
|
|
||||||
const TICKET_STATUSES = {
|
const TICKET_STATUSES = {
|
||||||
ANY: undefined,
|
ANY: undefined,
|
||||||
OPENED: 0,
|
OPENED: 0,
|
||||||
@ -81,6 +83,7 @@ export default {
|
|||||||
} :
|
} :
|
||||||
filters
|
filters
|
||||||
);
|
);
|
||||||
|
const dateRange = filtersForAPI.dateRange;
|
||||||
|
|
||||||
if(filtersForAPI && filtersForAPI.closed !== undefined) {
|
if(filtersForAPI && filtersForAPI.closed !== undefined) {
|
||||||
filtersForAPI = {
|
filtersForAPI = {
|
||||||
@ -91,14 +94,11 @@ export default {
|
|||||||
|
|
||||||
filtersForAPI = {
|
filtersForAPI = {
|
||||||
...filtersForAPI,
|
...filtersForAPI,
|
||||||
dateRange: filtersForAPI.dateRange ? filtersForAPI.dateRange : this.getDefaultDateRangeForFilters()
|
dateRange: dateRange ? dateRange : this.getDefaultUTCRange()
|
||||||
}
|
}
|
||||||
|
|
||||||
return filtersForAPI ? filtersForAPI : {};
|
return filtersForAPI ? filtersForAPI : {};
|
||||||
},
|
},
|
||||||
getDefaultDateRangeForFilters() {
|
|
||||||
return JSON.stringify(DateTransformer.formDateRangeToFilters([20170101, DateTransformer.getDateToday()]));
|
|
||||||
},
|
|
||||||
getFiltersForURL(filtersWithShouldRemoveParams) {
|
getFiltersForURL(filtersWithShouldRemoveParams) {
|
||||||
const shouldRemoveCustomParam = filtersWithShouldRemoveParams.shouldRemoveCustomParam ? filtersWithShouldRemoveParams.shouldRemoveCustomParam : false;
|
const shouldRemoveCustomParam = filtersWithShouldRemoveParams.shouldRemoveCustomParam ? filtersWithShouldRemoveParams.shouldRemoveCustomParam : false;
|
||||||
const shouldRemoveUseInitialValuesParam = filtersWithShouldRemoveParams.shouldRemoveUseInitialValuesParam ? filtersWithShouldRemoveParams.shouldRemoveUseInitialValuesParam : false;
|
const shouldRemoveUseInitialValuesParam = filtersWithShouldRemoveParams.shouldRemoveUseInitialValuesParam ? filtersWithShouldRemoveParams.shouldRemoveUseInitialValuesParam : false;
|
||||||
@ -148,6 +148,13 @@ export default {
|
|||||||
return closedDropdownIndex;
|
return closedDropdownIndex;
|
||||||
},
|
},
|
||||||
transformToFormValue(filters) {
|
transformToFormValue(filters) {
|
||||||
|
const localDateRange = DateTransformer.rangeTransformer(JSON.parse(filters.dateRange), "UTCToLocal");
|
||||||
|
const newDateRange = {
|
||||||
|
valid: true,
|
||||||
|
startDate: localDateRange[0],
|
||||||
|
endDate: localDateRange[1],
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...filters,
|
...filters,
|
||||||
query: filters.query ? filters.query : '',
|
query: filters.query ? filters.query : '',
|
||||||
@ -155,7 +162,7 @@ export default {
|
|||||||
departments: JSON.parse(filters.departments),
|
departments: JSON.parse(filters.departments),
|
||||||
owners: JSON.parse(filters.owners),
|
owners: JSON.parse(filters.owners),
|
||||||
tags: JSON.parse(filters.tags),
|
tags: JSON.parse(filters.tags),
|
||||||
dateRange: DateTransformer.dateRangeToFormValue(filters.dateRange),
|
dateRange: newDateRange,
|
||||||
authors: filters.authors ? JSON.parse(filters.authors) : [],
|
authors: filters.authors ? JSON.parse(filters.authors) : [],
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -177,7 +184,7 @@ export default {
|
|||||||
},
|
},
|
||||||
formValueToListConfig(form, hasAllAuthorsInfo = false) {
|
formValueToListConfig(form, hasAllAuthorsInfo = false) {
|
||||||
const authors = form.authors ? form.authors.map(author => ({id: author.id*1, isStaff: author.isStaff})) : [];
|
const authors = form.authors ? form.authors.map(author => ({id: author.id*1, isStaff: author.isStaff})) : [];
|
||||||
const dateRangeFilter = [form.dateRange.startDate, form.dateRange.endDate];
|
const localRange = [form.dateRange.startDate, form.dateRange.endDate];
|
||||||
|
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
@ -187,11 +194,25 @@ export default {
|
|||||||
departments: form.departments !== undefined ? JSON.stringify(form.departments) : '[]',
|
departments: form.departments !== undefined ? JSON.stringify(form.departments) : '[]',
|
||||||
owners: JSON.stringify(form.owners),
|
owners: JSON.stringify(form.owners),
|
||||||
tags: JSON.stringify(form.tags),
|
tags: JSON.stringify(form.tags),
|
||||||
dateRange: JSON.stringify(DateTransformer.formDateRangeToFilters(dateRangeFilter)),
|
dateRange: JSON.stringify(DateTransformer.rangeTransformer(localRange, "localToUTC")),
|
||||||
authors: JSON.stringify(authors),
|
authors: JSON.stringify(authors),
|
||||||
},
|
},
|
||||||
hasAllAuthorsInfo
|
hasAllAuthorsInfo
|
||||||
};
|
};
|
||||||
|
},
|
||||||
|
getDefaultUTCRange() {
|
||||||
|
return JSON.stringify([DEFAULT_UTC_START_DATE, this.getDefaultUTCEndDate()]);
|
||||||
|
},
|
||||||
|
getDefaultUTCStartDate() {
|
||||||
|
return DEFAULT_UTC_START_DATE
|
||||||
|
},
|
||||||
|
getDefaultUTCEndDate() {
|
||||||
|
return DateTransformer.localDateToUTCNumericDate(JSON.stringify((DateTransformer.getDateToday()*10000)+2359));
|
||||||
|
},
|
||||||
|
getDefaultLocalStartDate() {
|
||||||
|
return DateTransformer.UTCDateToLocalNumericDate(this.getDefaultUTCStartDate())
|
||||||
|
},
|
||||||
|
getDefaultlocalEndDate() {
|
||||||
|
return DateTransformer.UTCDateToLocalNumericDate(this.getDefaultUTCEndDate())
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
|
@ -1,20 +1,33 @@
|
|||||||
let month = ["", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
import moment from 'moment';
|
||||||
|
|
||||||
|
const stringDateFormat = 'YYYYMMDDHHmm';
|
||||||
|
const localUTCMins = new Date().getTimezoneOffset();
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
stringDateToMoment(date) {
|
||||||
|
return moment(`${date}`, stringDateFormat);
|
||||||
|
},
|
||||||
|
momentToStringDate(date) {
|
||||||
|
return date.format(stringDateFormat);
|
||||||
|
},
|
||||||
|
UTCDateToLocalNumericDate(date) {
|
||||||
|
return JSON.parse(this.momentToStringDate(this.stringDateToMoment(date).subtract(localUTCMins, 'minutes')));
|
||||||
|
},
|
||||||
|
localDateToUTCNumericDate(date) {
|
||||||
|
return JSON.parse(this.momentToStringDate(this.stringDateToMoment(date).add(localUTCMins, 'minutes')));
|
||||||
|
},
|
||||||
|
rangeTransformer(range, trasformerFunctionKey) {
|
||||||
|
const trasformerDateFunction = {
|
||||||
|
UTCToLocal: this.UTCDateToLocalNumericDate.bind(this),
|
||||||
|
localToUTC: this.localDateToUTCNumericDate.bind(this)
|
||||||
|
}[trasformerFunctionKey];
|
||||||
|
|
||||||
|
return range.map((date) => {return trasformerDateFunction(JSON.stringify(date))});
|
||||||
|
},
|
||||||
transformToString(date, expressive = true) {
|
transformToString(date, expressive = true) {
|
||||||
date += ''; // Transform to string
|
const momentDateLocal = this.stringDateToMoment(JSON.stringify(this.UTCDateToLocalNumericDate(date)));
|
||||||
let y = date.substring(0, 4);
|
if (expressive) momentDateLocal.format('D MMMM YYYY')
|
||||||
let m = date.substring(4, 6);
|
return momentDateLocal.format('D MMMM YYYY, HH:mm');
|
||||||
let d = date.substring(6, 8);
|
|
||||||
m = (m[0] - '0') * 10 + (m[1] - '0');
|
|
||||||
|
|
||||||
if(!expressive)
|
|
||||||
return d + " " + month[m] + " " + y;
|
|
||||||
|
|
||||||
let hr = date.substring(8, 10);
|
|
||||||
let min = date.substring(10, 12);
|
|
||||||
|
|
||||||
return d + " " + month[m] + " " + y + " at " + hr + ":" + min;
|
|
||||||
},
|
},
|
||||||
getDate(date) {
|
getDate(date) {
|
||||||
return date < 10 ? `0${date}` : `${date}`;
|
return date < 10 ? `0${date}` : `${date}`;
|
||||||
@ -28,34 +41,4 @@ export default {
|
|||||||
|
|
||||||
return newDate*1;
|
return newDate*1;
|
||||||
},
|
},
|
||||||
getDefaultDateRange(range = undefined) {
|
|
||||||
let newDateRange = range;
|
|
||||||
|
|
||||||
if(range) {
|
|
||||||
let dateRange = JSON.parse(range);
|
|
||||||
let startDate = dateRange[0];
|
|
||||||
let endDate = dateRange[1];
|
|
||||||
let valid = true;
|
|
||||||
newDateRange = {
|
|
||||||
startDate: startDate,
|
|
||||||
endDate: endDate,
|
|
||||||
valid: valid
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return newDateRange;
|
|
||||||
},
|
|
||||||
formDateRangeToFilters(dateRange) {
|
|
||||||
return [dateRange[0]*10000, dateRange[1]*10000+2400];
|
|
||||||
},
|
|
||||||
dateRangeToFormValue(_dateRange) {
|
|
||||||
const dateRange = JSON.parse(_dateRange);
|
|
||||||
|
|
||||||
return {
|
|
||||||
valid: true,
|
|
||||||
startDate: dateRange[0]/10000,
|
|
||||||
endDate: (dateRange[1]-2400)/10000,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -3,18 +3,15 @@ import queryString from 'query-string';
|
|||||||
|
|
||||||
import Reducer from 'reducers/reducer';
|
import Reducer from 'reducers/reducer';
|
||||||
|
|
||||||
import DateTransformer from 'lib-core/date-transformer';
|
|
||||||
import searchTicketsUtils from '../lib-app/search-tickets-utils';
|
import searchTicketsUtils from '../lib-app/search-tickets-utils';
|
||||||
|
|
||||||
const DEFAULT_START_DATE = 20170101;
|
|
||||||
|
|
||||||
const DEFAULT_FILTERS = {
|
const DEFAULT_FILTERS = {
|
||||||
query: undefined,
|
query: undefined,
|
||||||
closed: undefined,
|
closed: undefined,
|
||||||
departments: '[]',
|
departments: '[]',
|
||||||
owners: '[]',
|
owners: '[]',
|
||||||
tags: '[]',
|
tags: '[]',
|
||||||
dateRange: searchTicketsUtils.getDefaultDateRangeForFilters(),
|
dateRange: searchTicketsUtils.getDefaultUTCRange(),
|
||||||
orderBy: undefined,
|
orderBy: undefined,
|
||||||
authors: '[]',
|
authors: '[]',
|
||||||
};
|
};
|
||||||
@ -33,7 +30,11 @@ class searchFiltersReducer extends Reducer {
|
|||||||
owners: [],
|
owners: [],
|
||||||
tags: [],
|
tags: [],
|
||||||
authors: [],
|
authors: [],
|
||||||
dateRange: {valid: true, startDate: DEFAULT_START_DATE, endDate: DateTransformer.getDateToday()}
|
dateRange: {
|
||||||
|
valid: true,
|
||||||
|
startDate: searchTicketsUtils.getDefaultLocalStartDate(),
|
||||||
|
endDate: searchTicketsUtils.getDefaultlocalEndDate()
|
||||||
|
}
|
||||||
},
|
},
|
||||||
ticketQueryListState : {
|
ticketQueryListState : {
|
||||||
tickets: [],
|
tickets: [],
|
||||||
|
@ -16,7 +16,7 @@ DataValidator::with('CustomValidations', true);
|
|||||||
*
|
*
|
||||||
* @apiParam {String} allowedLanguages The list of languages allowed.
|
* @apiParam {String} allowedLanguages The list of languages allowed.
|
||||||
* @apiParam {String} supportedLanguages The list of languages supported.
|
* @apiParam {String} supportedLanguages The list of languages supported.
|
||||||
* @apiParam {Setting} setting A setting can be any of the following: language, recaptcha-public, recaptcha-private, server-email, smtp-host, smtp-port, smtp-user, smtp-pass, time-zone, maintenance-mode, layout, allow-attachments, max-size, title, url.
|
* @apiParam {Setting} setting A setting can be any of the following: language, recaptcha-public, recaptcha-private, server-email, smtp-host, smtp-port, smtp-user, smtp-pass, maintenance-mode, layout, allow-attachments, max-size, title, url.
|
||||||
*
|
*
|
||||||
* @apiUse NO_PERMISSION
|
* @apiUse NO_PERMISSION
|
||||||
*
|
*
|
||||||
@ -53,7 +53,6 @@ class EditSettingsController extends Controller {
|
|||||||
'smtp-host',
|
'smtp-host',
|
||||||
'smtp-user',
|
'smtp-user',
|
||||||
'smtp-pass',
|
'smtp-pass',
|
||||||
'time-zone',
|
|
||||||
'maintenance-mode',
|
'maintenance-mode',
|
||||||
'layout',
|
'layout',
|
||||||
'allow-attachments',
|
'allow-attachments',
|
||||||
|
@ -38,7 +38,6 @@ class GetSettingsController extends Controller {
|
|||||||
'language' => Setting::getSetting('language')->getValue(),
|
'language' => Setting::getSetting('language')->getValue(),
|
||||||
'reCaptchaKey' => Setting::getSetting('recaptcha-public')->getValue(),
|
'reCaptchaKey' => Setting::getSetting('recaptcha-public')->getValue(),
|
||||||
'reCaptchaPrivate' => Setting::getSetting('recaptcha-private')->getValue(),
|
'reCaptchaPrivate' => Setting::getSetting('recaptcha-private')->getValue(),
|
||||||
'time-zone' => Setting::getSetting('time-zone')->getValue(),
|
|
||||||
'maintenance-mode' => intval(Setting::getSetting('maintenance-mode')->getValue()),
|
'maintenance-mode' => intval(Setting::getSetting('maintenance-mode')->getValue()),
|
||||||
'layout' => Setting::getSetting('layout')->getValue(),
|
'layout' => Setting::getSetting('layout')->getValue(),
|
||||||
'allow-attachments' => intval(Setting::getSetting('allow-attachments')->getValue()),
|
'allow-attachments' => intval(Setting::getSetting('allow-attachments')->getValue()),
|
||||||
@ -66,7 +65,6 @@ class GetSettingsController extends Controller {
|
|||||||
$settingsList = [
|
$settingsList = [
|
||||||
'language' => Setting::getSetting('language')->getValue(),
|
'language' => Setting::getSetting('language')->getValue(),
|
||||||
'reCaptchaKey' => Setting::getSetting('recaptcha-public')->getValue(),
|
'reCaptchaKey' => Setting::getSetting('recaptcha-public')->getValue(),
|
||||||
'time-zone' => Setting::getSetting('time-zone')->getValue(),
|
|
||||||
'maintenance-mode' => intval(Setting::getSetting('maintenance-mode')->getValue()),
|
'maintenance-mode' => intval(Setting::getSetting('maintenance-mode')->getValue()),
|
||||||
'layout' => Setting::getSetting('layout')->getValue(),
|
'layout' => Setting::getSetting('layout')->getValue(),
|
||||||
'allow-attachments' => intval(Setting::getSetting('allow-attachments')->getValue()),
|
'allow-attachments' => intval(Setting::getSetting('allow-attachments')->getValue()),
|
||||||
|
@ -78,7 +78,6 @@ class InitSettingsController extends Controller {
|
|||||||
'smtp-host' => Controller::request('smtp-host'),
|
'smtp-host' => Controller::request('smtp-host'),
|
||||||
'smtp-user' => Controller::request('smtp-user'),
|
'smtp-user' => Controller::request('smtp-user'),
|
||||||
'smtp-pass' => Controller::request('smtp-pass'),
|
'smtp-pass' => Controller::request('smtp-pass'),
|
||||||
'time-zone' => 0,
|
|
||||||
'maintenance-mode' => 0,
|
'maintenance-mode' => 0,
|
||||||
'layout' => 'boxed',
|
'layout' => 'boxed',
|
||||||
'allow-attachments' => !!Controller::request('allow-attachments'),
|
'allow-attachments' => !!Controller::request('allow-attachments'),
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
@include 'config.php';
|
@include 'config.php';
|
||||||
require_once 'vendor/autoload.php';
|
require_once 'vendor/autoload.php';
|
||||||
|
|
||||||
|
date_default_timezone_set ('UTC');
|
||||||
// REDBEAN CONFIGURATION
|
// REDBEAN CONFIGURATION
|
||||||
use RedBeanPHP\Facade as RedBean;
|
use RedBeanPHP\Facade as RedBean;
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ describe'system/edit-settings' do
|
|||||||
"csrf_userid" => $csrf_userid,
|
"csrf_userid" => $csrf_userid,
|
||||||
"csrf_token" => $csrf_token,
|
"csrf_token" => $csrf_token,
|
||||||
"maintenance-mode" => 0,
|
"maintenance-mode" => 0,
|
||||||
"time-zone" => -3,
|
|
||||||
"layout" => 'full-width',
|
"layout" => 'full-width',
|
||||||
"allow-attachments" => 1,
|
"allow-attachments" => 1,
|
||||||
"max-size" => 2,
|
"max-size" => 2,
|
||||||
@ -21,9 +20,6 @@ describe'system/edit-settings' do
|
|||||||
row = $database.getRow('setting', 'maintenance-mode', 'name')
|
row = $database.getRow('setting', 'maintenance-mode', 'name')
|
||||||
(row['value']).should.equal('0')
|
(row['value']).should.equal('0')
|
||||||
|
|
||||||
row = $database.getRow('setting', 'time-zone', 'name')
|
|
||||||
(row['value']).should.equal('-3')
|
|
||||||
|
|
||||||
row = $database.getRow('setting', 'layout', 'name')
|
row = $database.getRow('setting', 'layout', 'name')
|
||||||
(row['value']).should.equal('full-width')
|
(row['value']).should.equal('full-width')
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user