Add timezone support to date type field in Notion (#2082)

* Add timezone in date property on Notion

Signed-off-by: 5pecia1 <pdpxpd@gmail.com>

*  Improvements to #2036

*  Minor improvements

Co-authored-by: 5pecia1 <pdpxpd@gmail.com>
Co-authored-by: Jan Oberhauser <jan.oberhauser@gmail.com>
This commit is contained in:
Ricardo Espinoza 2021-08-13 14:57:18 -04:00 committed by GitHub
parent a6bdc0d0b2
commit a9987cd541
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 3 deletions

View file

@ -405,6 +405,23 @@ export const databasePageFields = [
description: `
An ISO 8601 formatted date, with optional time. Represents the end of a date range.`,
},
{
displayName: 'Timezone',
name: 'timezone',
type: 'options',
displayOptions: {
show: {
type: [
'date',
],
},
},
typeOptions: {
loadOptionsMethod: 'getTimezones',
},
default: 'default',
description: 'Time zone to use. By default n8n timezone is used.',
},
],
},
],
@ -765,6 +782,23 @@ export const databasePageFields = [
description: `
An ISO 8601 formatted date, with optional time. Represents the end of a date range.`,
},
{
displayName: 'Timezone',
name: 'timezone',
type: 'options',
displayOptions: {
show: {
type: [
'date',
],
},
},
typeOptions: {
loadOptionsMethod: 'getTimezones',
},
default: 'default',
description: 'Time zone to use. By default n8n timezone is used.',
},
],
},
],

View file

@ -284,13 +284,22 @@ function getPropertyKeyValue(value: any, type: string, timezone: string) {
break;
case 'date':
const format = getDateFormat(value.includeTime);
const timezoneValue = (value.timezone === 'default') ? timezone : value.timezone;
if (value.range === true) {
result = {
type: 'date', date: { start: moment.tz(value.dateStart, timezone).format(format), end: moment.tz(value.dateEnd, timezone).format(format) },
type: 'date',
date: {
start: moment.tz(value.dateStart, timezoneValue).format(format),
end: moment.tz(value.dateEnd, timezoneValue).format(format),
},
};
} else {
result = {
type: 'date', date: { start: moment.tz(value.date, timezone).format(format), end: null },
type: 'date',
date: {
start: moment.tz(value.date, timezoneValue).format(format),
end: null,
},
};
}
break;
@ -350,7 +359,7 @@ export function mapFilters(filters: IDataObject[], timezone: string) {
} else if (key === 'date' && !['is_empty', 'is_not_empty'].includes(value.condition as string)) {
valuePropertyName = (valuePropertyName !== undefined && !Object.keys(valuePropertyName).length) ? {} : moment.tz(value.date, timezone).utc().format();
}
return Object.assign(obj, {
['property']: getNameAndType(value.key).name,
[key]: { [`${value.condition}`]: valuePropertyName },

View file

@ -48,6 +48,8 @@ import {
databasePageOperations,
} from './DatabasePageDescription';
import * as moment from 'moment-timezone';
export class Notion implements INodeType {
description: INodeTypeDescription = {
displayName: 'Notion (Beta)',
@ -266,6 +268,28 @@ export class Notion implements INodeType {
const { properties } = await notionApiRequest.call(this, 'GET', `/databases/${databaseId}`);
return (properties[name][type].options).map((option: IDataObject) => ({ name: option.name, value: option.id }));
},
// Get all the timezones to display them to user so that he can
// select them easily
async getTimezones(
this: ILoadOptionsFunctions,
): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
for (const timezone of moment.tz.names()) {
const timezoneName = timezone;
const timezoneId = timezone;
returnData.push({
name: timezoneName,
value: timezoneId,
});
}
returnData.unshift({
name: 'Default',
value: 'default',
description: 'Timezone set in n8n',
});
return returnData;
},
},
};