2015-10-08 12:27:09 -04:00
|
|
|
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
2015-06-14 23:53:32 -08:00
|
|
|
// See License.txt for license information.
|
|
|
|
|
|
2015-11-19 21:12:56 -05:00
|
|
|
import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
|
2015-11-18 17:29:06 -05:00
|
|
|
import * as EventHelpers from '../dispatcher/event_helpers.jsx';
|
2015-11-19 21:12:56 -05:00
|
|
|
import ChannelStore from '../stores/channel_store.jsx';
|
|
|
|
|
import UserStore from '../stores/user_store.jsx';
|
|
|
|
|
import PreferenceStore from '../stores/preference_store.jsx';
|
|
|
|
|
import TeamStore from '../stores/team_store.jsx';
|
|
|
|
|
import Constants from '../utils/constants.jsx';
|
2015-06-14 23:53:32 -08:00
|
|
|
var ActionTypes = Constants.ActionTypes;
|
2015-11-19 21:12:56 -05:00
|
|
|
import * as Client from './client.jsx';
|
|
|
|
|
import * as AsyncClient from './async_client.jsx';
|
|
|
|
|
import * as client from './client.jsx';
|
|
|
|
|
import Autolinker from 'autolinker';
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function isEmail(email) {
|
2016-01-06 15:30:11 -05:00
|
|
|
// writing a regex to match all valid email addresses is really, really hard (see http://stackoverflow.com/a/201378)
|
|
|
|
|
// so we just do a simple check and rely on a verification email to tell if it's a real address
|
|
|
|
|
return email.indexOf('@') !== -1;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function cleanUpUrlable(input) {
|
2015-07-08 11:50:10 -04:00
|
|
|
var cleaned = input.trim().replace(/-/g, ' ').replace(/[^\w\s]/gi, '').toLowerCase().replace(/\s/g, '-');
|
2015-10-26 14:48:00 +05:30
|
|
|
cleaned = cleaned.replace(/-{2,}/, '-');
|
2015-07-08 11:50:10 -04:00
|
|
|
cleaned = cleaned.replace(/^\-+/, '');
|
|
|
|
|
cleaned = cleaned.replace(/\-+$/, '');
|
|
|
|
|
return cleaned;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function isTestDomain() {
|
2015-08-18 09:43:22 -04:00
|
|
|
if ((/^localhost/).test(window.location.hostname)) {
|
2015-06-14 23:53:32 -08:00
|
|
|
return true;
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if ((/^dockerhost/).test(window.location.hostname)) {
|
2015-06-18 10:55:51 -08:00
|
|
|
return true;
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-06-18 10:55:51 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if ((/^test/).test(window.location.hostname)) {
|
2015-06-14 23:53:32 -08:00
|
|
|
return true;
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if ((/^127.0./).test(window.location.hostname)) {
|
2015-06-14 23:53:32 -08:00
|
|
|
return true;
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if ((/^192.168./).test(window.location.hostname)) {
|
2015-06-14 23:53:32 -08:00
|
|
|
return true;
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if ((/^10./).test(window.location.hostname)) {
|
2015-06-14 23:53:32 -08:00
|
|
|
return true;
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if ((/^176./).test(window.location.hostname)) {
|
2015-06-14 23:53:32 -08:00
|
|
|
return true;
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-03 21:56:18 +05:00
|
|
|
export function isChrome() {
|
|
|
|
|
if (navigator.userAgent.indexOf('Chrome') > -1) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function isSafari() {
|
|
|
|
|
if (navigator.userAgent.indexOf('Safari') !== -1 && navigator.userAgent.indexOf('Chrome') === -1) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-09 12:42:34 -05:00
|
|
|
export function isIosChrome() {
|
|
|
|
|
// https://developer.chrome.com/multidevice/user-agent
|
|
|
|
|
return navigator.userAgent.indexOf('CriOS') !== -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function isMobileApp() {
|
|
|
|
|
const userAgent = navigator.userAgent;
|
|
|
|
|
|
|
|
|
|
// the mobile app has different user agents for the native api calls and the shim, so handle them both
|
|
|
|
|
const isApi = userAgent.indexOf('Mattermost') !== -1;
|
|
|
|
|
const isShim = userAgent.indexOf('iPhone') !== -1 && userAgent.indexOf('Safari') === -1 && userAgent.indexOf('Chrome') === -1;
|
|
|
|
|
|
|
|
|
|
return isApi || isShim;
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-17 22:00:33 -07:00
|
|
|
export function isInRole(roles, inRole) {
|
|
|
|
|
var parts = roles.split(' ');
|
|
|
|
|
for (var i = 0; i < parts.length; i++) {
|
|
|
|
|
if (parts[i] === inRole) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function isAdmin(roles) {
|
|
|
|
|
if (isInRole(roles, 'admin')) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isInRole(roles, 'system_admin')) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-29 13:16:55 -07:00
|
|
|
export function isSystemAdmin(roles) {
|
|
|
|
|
if (isInRole(roles, 'system_admin')) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getDomainWithOutSub() {
|
2015-08-18 09:43:22 -04:00
|
|
|
var parts = window.location.host.split('.');
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if (parts.length === 1) {
|
|
|
|
|
if (parts[0].indexOf('dockerhost') > -1) {
|
|
|
|
|
return 'dockerhost:8065';
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'localhost:8065';
|
2015-06-18 10:55:51 -08:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
return parts[1] + '.' + parts[2];
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getCookie(name) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var value = '; ' + document.cookie;
|
|
|
|
|
var parts = value.split('; ' + name + '=');
|
|
|
|
|
if (parts.length === 2) {
|
|
|
|
|
return parts.pop().split(';').shift();
|
|
|
|
|
}
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-08-12 11:02:47 -07:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function notifyMe(title, body, channel) {
|
2015-08-18 09:43:22 -04:00
|
|
|
if ('Notification' in window && Notification.permission !== 'denied') {
|
|
|
|
|
Notification.requestPermission(function onRequestPermission(permission) {
|
|
|
|
|
if (Notification.permission !== permission) {
|
|
|
|
|
Notification.permission = permission;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (permission === 'granted') {
|
2015-10-22 21:58:11 +05:00
|
|
|
var notification = new Notification(title, {body: body, tag: body, icon: '/static/images/icon50x50.png'});
|
2015-08-18 09:43:22 -04:00
|
|
|
notification.onclick = function onClick() {
|
|
|
|
|
window.focus();
|
|
|
|
|
if (channel) {
|
2015-09-02 10:42:26 -04:00
|
|
|
switchChannel(channel);
|
2015-08-18 09:43:22 -04:00
|
|
|
} else {
|
2015-09-25 09:16:26 -07:00
|
|
|
window.location.href = TeamStore.getCurrentTeamUrl() + '/channels/town-square';
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
setTimeout(function closeNotificationOnTimeout() {
|
|
|
|
|
notification.close();
|
|
|
|
|
}, 5000);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-11-05 10:44:38 -05:00
|
|
|
var canDing = true;
|
|
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function ding() {
|
2015-11-05 10:44:38 -05:00
|
|
|
if (!isBrowserFirefox() && canDing) {
|
2015-11-05 13:18:30 -08:00
|
|
|
var audio = new Audio('/static/images/bing.mp3');
|
2015-08-12 15:27:46 -07:00
|
|
|
audio.play();
|
2015-11-05 10:44:38 -05:00
|
|
|
canDing = false;
|
|
|
|
|
setTimeout(() => canDing = true, 3000);
|
2015-08-12 15:27:46 -07:00
|
|
|
}
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getUrlParameter(sParam) {
|
2015-06-14 23:53:32 -08:00
|
|
|
var sPageURL = window.location.search.substring(1);
|
|
|
|
|
var sURLVariables = sPageURL.split('&');
|
2015-08-18 09:43:22 -04:00
|
|
|
for (var i = 0; i < sURLVariables.length; i++) {
|
2015-06-14 23:53:32 -08:00
|
|
|
var sParameterName = sURLVariables[i].split('=');
|
2015-08-18 09:43:22 -04:00
|
|
|
if (sParameterName[0] === sParam) {
|
2015-06-14 23:53:32 -08:00
|
|
|
return sParameterName[1];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getDateForUnixTicks(ticks) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return new Date(ticks);
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function displayDate(ticks) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var d = new Date(ticks);
|
|
|
|
|
var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
return monthNames[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear();
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2016-01-04 12:44:22 -05:00
|
|
|
export function displayTime(ticks, utc) {
|
2015-10-14 20:36:12 +03:00
|
|
|
const d = new Date(ticks);
|
2016-01-04 12:44:22 -05:00
|
|
|
let hours;
|
|
|
|
|
let minutes;
|
2015-10-14 20:36:12 +03:00
|
|
|
let ampm = '';
|
2016-01-04 12:44:22 -05:00
|
|
|
let timezone = '';
|
|
|
|
|
|
|
|
|
|
if (utc) {
|
|
|
|
|
hours = d.getUTCHours();
|
|
|
|
|
minutes = d.getUTCMinutes();
|
|
|
|
|
timezone = ' UTC';
|
|
|
|
|
} else {
|
|
|
|
|
hours = d.getHours();
|
|
|
|
|
minutes = d.getMinutes();
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if (minutes <= 9) {
|
2015-08-24 10:52:53 -07:00
|
|
|
minutes = '0' + minutes;
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-10-14 20:36:12 +03:00
|
|
|
|
2015-12-15 11:36:14 -05:00
|
|
|
const useMilitaryTime = PreferenceStore.getBool(Constants.Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time');
|
|
|
|
|
if (!useMilitaryTime) {
|
2015-10-14 20:36:12 +03:00
|
|
|
ampm = ' AM';
|
|
|
|
|
if (hours >= 12) {
|
|
|
|
|
ampm = ' PM';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hours = hours % 12;
|
|
|
|
|
if (!hours) {
|
|
|
|
|
hours = '12';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-04 12:44:22 -05:00
|
|
|
return hours + ':' + minutes + ampm + timezone;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function displayDateTime(ticks) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var seconds = Math.floor((Date.now() - ticks) / 1000);
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
var interval = Math.floor(seconds / 3600);
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if (interval > 24) {
|
|
|
|
|
return this.displayTime(ticks);
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if (interval > 1) {
|
|
|
|
|
return interval + ' hours ago';
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if (interval === 1) {
|
|
|
|
|
return interval + ' hour ago';
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
interval = Math.floor(seconds / 60);
|
2015-10-28 01:19:15 +01:00
|
|
|
if (interval >= 2) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return interval + ' minutes ago';
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-28 01:19:15 +01:00
|
|
|
if (interval >= 1) {
|
|
|
|
|
return '1 minute ago';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 'just now';
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function displayCommentDateTime(ticks) {
|
|
|
|
|
return displayDate(ticks) + ' ' + displayTime(ticks);
|
2015-08-18 08:31:25 -07:00
|
|
|
}
|
|
|
|
|
|
2015-06-14 23:53:32 -08:00
|
|
|
// returns Unix timestamp in milliseconds
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getTimestamp() {
|
2015-06-14 23:53:32 -08:00
|
|
|
return Date.now();
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-10-28 09:13:41 -04:00
|
|
|
// extracts links not styled by Markdown
|
|
|
|
|
export function extractLinks(text) {
|
|
|
|
|
const links = [];
|
|
|
|
|
let replaceText = text;
|
|
|
|
|
|
|
|
|
|
// pull out the Markdown code blocks
|
|
|
|
|
const codeBlocks = [];
|
|
|
|
|
const splitText = replaceText.split('`'); // also handles ```
|
|
|
|
|
for (let i = 1; i < splitText.length; i += 2) {
|
|
|
|
|
if (splitText[i].trim() !== '') {
|
|
|
|
|
codeBlocks.push(splitText[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-04 12:28:46 -05:00
|
|
|
function replaceFn(autolinker, match) {
|
2015-10-28 09:13:41 -04:00
|
|
|
let link = '';
|
|
|
|
|
const matchText = match.getMatchedText();
|
|
|
|
|
const tempText = replaceText;
|
|
|
|
|
|
|
|
|
|
const start = replaceText.indexOf(matchText);
|
|
|
|
|
const end = start + matchText.length;
|
|
|
|
|
|
|
|
|
|
replaceText = replaceText.substring(0, start) + replaceText.substring(end);
|
|
|
|
|
|
|
|
|
|
// if it's a Markdown link, just skip it
|
|
|
|
|
if (start > 1) {
|
|
|
|
|
if (tempText.charAt(start - 2) === ']' && tempText.charAt(start - 1) === '(' && tempText.charAt(end) === ')') {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// if it's in a Markdown code block, skip it
|
|
|
|
|
for (const i in codeBlocks) {
|
|
|
|
|
if (codeBlocks[i].indexOf(matchText) === 0) {
|
|
|
|
|
codeBlocks[i] = codeBlocks[i].replace(matchText, '');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-07-07 09:24:42 -07:00
|
|
|
|
2015-10-05 09:58:42 -04:00
|
|
|
if (matchText.trim().indexOf('http') === 0) {
|
2015-10-28 09:13:41 -04:00
|
|
|
link = matchText;
|
2015-10-05 09:58:42 -04:00
|
|
|
} else {
|
2015-10-28 09:13:41 -04:00
|
|
|
link = 'http://' + matchText;
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-07-07 09:24:42 -07:00
|
|
|
|
2015-10-28 09:13:41 -04:00
|
|
|
links.push(link);
|
2015-07-07 09:24:42 -07:00
|
|
|
}
|
2015-12-04 12:28:46 -05:00
|
|
|
|
|
|
|
|
Autolinker.link(text, {
|
|
|
|
|
replaceFn,
|
2015-12-09 12:24:34 -05:00
|
|
|
urls: {schemeMatches: true, wwwMatches: true, tldMatches: false},
|
2015-12-04 12:28:46 -05:00
|
|
|
emails: false,
|
|
|
|
|
twitter: false,
|
|
|
|
|
phone: false,
|
|
|
|
|
hashtag: false
|
|
|
|
|
});
|
|
|
|
|
|
2015-10-28 09:13:41 -04:00
|
|
|
return {links, text};
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function escapeRegExp(string) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1');
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-08-18 09:43:22 -04:00
|
|
|
|
2015-11-12 11:19:59 -05:00
|
|
|
// Taken from http://stackoverflow.com/questions/1068834/object-comparison-in-javascript and modified slightly
|
|
|
|
|
export function areObjectsEqual(x, y) {
|
|
|
|
|
let p;
|
|
|
|
|
const leftChain = [];
|
|
|
|
|
const rightChain = [];
|
|
|
|
|
|
|
|
|
|
// Remember that NaN === NaN returns false
|
|
|
|
|
// and isNaN(undefined) returns true
|
|
|
|
|
if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Compare primitives and functions.
|
|
|
|
|
// Check if both arguments link to the same object.
|
|
|
|
|
// Especially useful on step when comparing prototypes
|
|
|
|
|
if (x === y) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Works in case when functions are created in constructor.
|
|
|
|
|
// Comparing dates is a common scenario. Another built-ins?
|
|
|
|
|
// We can even handle functions passed across iframes
|
|
|
|
|
if ((typeof x === 'function' && typeof y === 'function') ||
|
|
|
|
|
(x instanceof Date && y instanceof Date) ||
|
|
|
|
|
(x instanceof RegExp && y instanceof RegExp) ||
|
|
|
|
|
(x instanceof String && y instanceof String) ||
|
|
|
|
|
(x instanceof Number && y instanceof Number)) {
|
|
|
|
|
return x.toString() === y.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// At last checking prototypes as good a we can
|
|
|
|
|
if (!(x instanceof Object && y instanceof Object)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (x.constructor !== y.constructor) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (x.prototype !== y.prototype) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check for infinitive linking loops
|
|
|
|
|
if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Quick checking of one object beeing a subset of another.
|
|
|
|
|
for (p in y) {
|
|
|
|
|
if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
|
|
|
|
|
return false;
|
|
|
|
|
} else if (typeof y[p] !== typeof x[p]) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (p in x) {
|
|
|
|
|
if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
|
|
|
|
|
return false;
|
|
|
|
|
} else if (typeof y[p] !== typeof x[p]) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (typeof (x[p])) {
|
|
|
|
|
case 'object':
|
|
|
|
|
case 'function':
|
|
|
|
|
|
|
|
|
|
leftChain.push(x);
|
|
|
|
|
rightChain.push(y);
|
|
|
|
|
|
|
|
|
|
if (!areObjectsEqual(x[p], y[p])) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
leftChain.pop();
|
|
|
|
|
rightChain.pop();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
if (x[p] !== y[p]) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function replaceHtmlEntities(text) {
|
2015-06-14 23:53:32 -08:00
|
|
|
var tagsToReplace = {
|
|
|
|
|
'&': '&',
|
|
|
|
|
'<': '<',
|
|
|
|
|
'>': '>'
|
|
|
|
|
};
|
2015-08-18 09:43:22 -04:00
|
|
|
var newtext = text;
|
2015-06-14 23:53:32 -08:00
|
|
|
for (var tag in tagsToReplace) {
|
2015-08-18 09:43:22 -04:00
|
|
|
if ({}.hasOwnProperty.call(tagsToReplace, tag)) {
|
|
|
|
|
var regex = new RegExp(tag, 'g');
|
|
|
|
|
newtext = newtext.replace(regex, tagsToReplace[tag]);
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
2015-08-18 09:43:22 -04:00
|
|
|
return newtext;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function insertHtmlEntities(text) {
|
2015-06-14 23:53:32 -08:00
|
|
|
var tagsToReplace = {
|
|
|
|
|
'&': '&',
|
|
|
|
|
'<': '<',
|
|
|
|
|
'>': '>'
|
|
|
|
|
};
|
2015-08-18 09:43:22 -04:00
|
|
|
var newtext = text;
|
2015-06-14 23:53:32 -08:00
|
|
|
for (var tag in tagsToReplace) {
|
2015-08-18 09:43:22 -04:00
|
|
|
if ({}.hasOwnProperty.call(tagsToReplace, tag)) {
|
|
|
|
|
var regex = new RegExp(tag, 'g');
|
|
|
|
|
newtext = newtext.replace(regex, tagsToReplace[tag]);
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
2015-08-18 09:43:22 -04:00
|
|
|
return newtext;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function searchForTerm(term) {
|
2015-06-14 23:53:32 -08:00
|
|
|
AppDispatcher.handleServerAction({
|
|
|
|
|
type: ActionTypes.RECIEVED_SEARCH_TERM,
|
|
|
|
|
term: term,
|
|
|
|
|
do_search: true
|
|
|
|
|
});
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getFileType(extin) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var ext = extin.toLowerCase();
|
2015-06-14 23:53:32 -08:00
|
|
|
if (Constants.IMAGE_TYPES.indexOf(ext) > -1) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'image';
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Constants.AUDIO_TYPES.indexOf(ext) > -1) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'audio';
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Constants.VIDEO_TYPES.indexOf(ext) > -1) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'video';
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Constants.SPREADSHEET_TYPES.indexOf(ext) > -1) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'spreadsheet';
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Constants.CODE_TYPES.indexOf(ext) > -1) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'code';
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Constants.WORD_TYPES.indexOf(ext) > -1) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'word';
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
if (Constants.PRESENTATION_TYPES.indexOf(ext) > -1) {
|
|
|
|
|
return 'presentation';
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Constants.PDF_TYPES.indexOf(ext) > -1) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'pdf';
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Constants.PATCH_TYPES.indexOf(ext) > -1) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'patch';
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'other';
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getPreviewImagePathForFileType(fileTypeIn) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var fileType = fileTypeIn.toLowerCase();
|
2015-07-24 17:04:02 -04:00
|
|
|
|
|
|
|
|
var icon;
|
|
|
|
|
if (fileType in Constants.ICON_FROM_TYPE) {
|
|
|
|
|
icon = Constants.ICON_FROM_TYPE[fileType];
|
|
|
|
|
} else {
|
2015-08-18 09:43:22 -04:00
|
|
|
icon = Constants.ICON_FROM_TYPE.other;
|
2015-07-24 17:04:02 -04:00
|
|
|
}
|
|
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
return '/static/images/icons/' + icon + '.png';
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-07-24 17:04:02 -04:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getIconClassName(fileTypeIn) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var fileType = fileTypeIn.toLowerCase();
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if (fileType in Constants.ICON_FROM_TYPE) {
|
2015-06-14 23:53:32 -08:00
|
|
|
return Constants.ICON_FROM_TYPE[fileType];
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
return 'glyphicon-file';
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function splitFileLocation(fileLocation) {
|
2015-06-14 23:53:32 -08:00
|
|
|
var fileSplit = fileLocation.split('.');
|
|
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
var ext = '';
|
2015-07-27 12:36:14 -04:00
|
|
|
if (fileSplit.length > 1) {
|
|
|
|
|
ext = fileSplit[fileSplit.length - 1];
|
|
|
|
|
fileSplit.splice(fileSplit.length - 1, 1);
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-14 23:53:32 -08:00
|
|
|
var filePath = fileSplit.join('.');
|
2015-08-18 09:43:22 -04:00
|
|
|
var filename = filePath.split('/')[filePath.split('/').length - 1];
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
return {ext: ext, name: filename, path: filePath};
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2016-01-05 15:49:45 -05:00
|
|
|
export function getPreviewImagePath(filename) {
|
|
|
|
|
// Returns the path to a preview image that can be used to represent a file.
|
|
|
|
|
const fileInfo = splitFileLocation(filename);
|
|
|
|
|
const fileType = getFileType(fileInfo.ext);
|
|
|
|
|
|
|
|
|
|
if (fileType === 'image') {
|
2016-01-06 09:54:05 -05:00
|
|
|
return getFileUrl(fileInfo.path + '_preview.jpg');
|
2016-01-05 15:49:45 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// only images have proper previews, so just use a placeholder icon for non-images
|
|
|
|
|
return getPreviewImagePathForFileType(fileType);
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function toTitleCase(str) {
|
2015-08-18 09:43:22 -04:00
|
|
|
function doTitleCase(txt) {
|
|
|
|
|
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
|
|
|
|
|
}
|
|
|
|
|
return str.replace(/\w\S*/g, doTitleCase);
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
export function applyTheme(theme) {
|
|
|
|
|
if (theme.sidebarBg) {
|
2015-10-01 09:33:21 +05:00
|
|
|
changeCss('.sidebar--left, .settings-modal .settings-table .settings-links, .sidebar--menu', 'background:' + theme.sidebarBg, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.sidebarText) {
|
2015-10-06 22:27:05 +05:00
|
|
|
changeCss('.sidebar--left .nav-pills__container li>a, .sidebar--right, .settings-modal .nav-pills>li a, .sidebar--menu', 'color:' + changeOpacity(theme.sidebarText, 0.6), 1);
|
2015-12-02 22:51:48 +05:00
|
|
|
changeCss('@media(max-width: 768px){.settings-modal .settings-table .nav>li>a', 'color:' + theme.sidebarText, 1);
|
2015-10-06 22:27:05 +05:00
|
|
|
changeCss('.sidebar--left .nav-pills__container li>h4, .sidebar--left .add-channel-btn', 'color:' + changeOpacity(theme.sidebarText, 0.6), 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('.sidebar--left .add-channel-btn:hover, .sidebar--left .add-channel-btn:focus', 'color:' + theme.sidebarText, 1);
|
2016-01-11 20:32:31 +05:00
|
|
|
changeCss('.sidebar--left .status .offline--icon, .sidebar--left .status .offline--icon', 'fill:' + theme.sidebarText, 1);
|
2015-12-02 22:51:48 +05:00
|
|
|
changeCss('@media(max-width: 768px){.settings-modal .settings-table .nav>li>a', 'border-color:' + changeOpacity(theme.sidebarText, 0.2), 2);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.sidebarUnreadText) {
|
2015-10-05 08:04:32 +05:00
|
|
|
changeCss('.sidebar--left .nav-pills__container li>a.unread-title', 'color:' + theme.sidebarUnreadText + '!important;', 2);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.sidebarTextHoverBg) {
|
2015-10-05 08:04:32 +05:00
|
|
|
changeCss('.sidebar--left .nav-pills__container li>a:hover, .sidebar--left .nav-pills__container li>a:focus, .settings-modal .nav-pills>li:hover a, .settings-modal .nav-pills>li:focus a', 'background:' + theme.sidebarTextHoverBg, 1);
|
2015-12-02 22:51:48 +05:00
|
|
|
changeCss('@media(max-width: 768px){.settings-modal .settings-table .nav>li:hover a', 'background:' + theme.sidebarTextHoverBg, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
|
|
|
|
|
2015-10-22 20:18:31 +05:00
|
|
|
if (theme.sidebarTextActiveBorder) {
|
|
|
|
|
changeCss('.sidebar--left .nav li.active a:before, .settings-modal .nav-pills>li.active a:before', 'background:' + theme.sidebarTextActiveBorder, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.sidebarTextActiveColor) {
|
2015-10-05 08:04:32 +05:00
|
|
|
changeCss('.sidebar--left .nav-pills__container li.active a, .sidebar--left .nav-pills__container li.active a:hover, .sidebar--left .nav-pills__container li.active a:focus, .settings-modal .nav-pills>li.active a, .settings-modal .nav-pills>li.active a:hover, .settings-modal .nav-pills>li.active a:active', 'color:' + theme.sidebarTextActiveColor, 2);
|
2015-10-23 20:34:21 +05:00
|
|
|
changeCss('.sidebar--left .nav li.active a, .sidebar--left .nav li.active a:hover, .sidebar--left .nav li.active a:focus', 'background:' + changeOpacity(theme.sidebarTextActiveColor, 0.1), 1);
|
2015-10-12 19:22:05 +05:00
|
|
|
}
|
|
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
if (theme.sidebarHeaderBg) {
|
2015-12-16 15:16:57 -05:00
|
|
|
changeCss('.sidebar--left .team__header, .sidebar--menu .team__header, .post-list__timestamp', 'background:' + theme.sidebarHeaderBg, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('.modal .modal-header', 'background:' + theme.sidebarHeaderBg, 1);
|
|
|
|
|
changeCss('#navbar .navbar-default', 'background:' + theme.sidebarHeaderBg, 1);
|
2015-12-02 22:51:48 +05:00
|
|
|
changeCss('@media(max-width: 768px){.search-bar__container', 'background:' + theme.sidebarHeaderBg, 1);
|
2015-10-31 03:22:02 +01:00
|
|
|
changeCss('.attachment .attachment__container', 'border-left-color:' + theme.sidebarHeaderBg, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.sidebarHeaderTextColor) {
|
2015-12-16 15:16:57 -05:00
|
|
|
changeCss('.sidebar--left .team__header .header__info, .sidebar--menu .team__header .header__info, .post-list__timestamp', 'color:' + theme.sidebarHeaderTextColor, 1);
|
2015-12-07 21:18:03 +05:00
|
|
|
changeCss('.sidebar--left .team__header .navbar-right .dropdown__icon, .sidebar--menu .team__header .navbar-right .dropdown__icon', 'fill:' + theme.sidebarHeaderTextColor, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('.sidebar--left .team__header .user__name, .sidebar--menu .team__header .user__name', 'color:' + changeOpacity(theme.sidebarHeaderTextColor, 0.8), 1);
|
|
|
|
|
changeCss('.sidebar--left .team__header:hover .user__name, .sidebar--menu .team__header:hover .user__name', 'color:' + theme.sidebarHeaderTextColor, 1);
|
|
|
|
|
changeCss('.modal .modal-header .modal-title, .modal .modal-header .modal-title .name, .modal .modal-header button.close', 'color:' + theme.sidebarHeaderTextColor, 1);
|
2015-09-29 23:21:45 +05:00
|
|
|
changeCss('#navbar .navbar-default .navbar-brand .heading', 'color:' + theme.sidebarHeaderTextColor, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('#navbar .navbar-default .navbar-toggle .icon-bar, ', 'background:' + theme.sidebarHeaderTextColor, 1);
|
2015-12-02 22:51:48 +05:00
|
|
|
changeCss('@media(max-width: 768px){.search-bar__container', 'color:' + theme.sidebarHeaderTextColor, 2);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.onlineIndicator) {
|
|
|
|
|
changeCss('.sidebar--left .status .online--icon', 'fill:' + theme.onlineIndicator, 1);
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-11 20:32:31 +05:00
|
|
|
if (theme.awayIndicator) {
|
|
|
|
|
changeCss('.sidebar--left .status .away--icon', 'fill:' + theme.awayIndicator, 1);
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
if (theme.mentionBj) {
|
|
|
|
|
changeCss('.sidebar--left .nav-pills__unread-indicator', 'background:' + theme.mentionBj, 1);
|
|
|
|
|
changeCss('.sidebar--left .badge', 'background:' + theme.mentionBj, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.mentionColor) {
|
|
|
|
|
changeCss('.sidebar--left .nav-pills__unread-indicator', 'color:' + theme.mentionColor, 2);
|
|
|
|
|
changeCss('.sidebar--left .badge', 'color:' + theme.mentionColor, 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.centerChannelBg) {
|
2015-12-01 13:25:12 -05:00
|
|
|
changeCss('.app__content, .markdown__table, .markdown__table tbody tr, .suggestion-content, .modal .modal-content', 'background:' + theme.centerChannelBg, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('#post-list .post-list-holder-by-time', 'background:' + theme.centerChannelBg, 1);
|
|
|
|
|
changeCss('#post-create', 'background:' + theme.centerChannelBg, 1);
|
|
|
|
|
changeCss('.date-separator .separator__text, .new-separator .separator__text', 'background:' + theme.centerChannelBg, 1);
|
2015-11-06 21:17:47 +05:00
|
|
|
changeCss('.post-image__column .post-image__details, .search-help-popover .search-autocomplete__divider span', 'background:' + theme.centerChannelBg, 1);
|
2015-11-03 19:56:46 +05:00
|
|
|
changeCss('.sidebar--right, .dropdown-menu, .popover, .tip-overlay', 'background:' + theme.centerChannelBg, 1);
|
2015-10-15 22:54:15 +05:00
|
|
|
changeCss('.popover.bottom>.arrow:after', 'border-bottom-color:' + theme.centerChannelBg, 1);
|
2015-11-03 19:56:46 +05:00
|
|
|
changeCss('.popover.right>.arrow:after, .tip-overlay.tip-overlay--sidebar .arrow, .tip-overlay.tip-overlay--header .arrow', 'border-right-color:' + theme.centerChannelBg, 1);
|
2015-10-15 22:54:15 +05:00
|
|
|
changeCss('.popover.left>.arrow:after', 'border-left-color:' + theme.centerChannelBg, 1);
|
2015-11-03 19:56:46 +05:00
|
|
|
changeCss('.popover.top>.arrow:after, .tip-overlay.tip-overlay--chat .arrow', 'border-top-color:' + theme.centerChannelBg, 1);
|
2015-12-02 22:51:48 +05:00
|
|
|
changeCss('@media(min-width: 768px){.search-bar__container .search__form .search-bar, .form-control', 'background:' + theme.centerChannelBg, 1);
|
2015-10-31 03:22:02 +01:00
|
|
|
changeCss('.attachment__content', 'background:' + theme.centerChannelBg, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.centerChannelColor) {
|
2015-11-19 01:11:06 +05:00
|
|
|
changeCss('.sidebar--left, .sidebar--right .sidebar--right__header', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
|
2015-11-03 19:56:46 +05:00
|
|
|
changeCss('.app__content, .post-create__container .post-create-body .btn-file, .post-create__container .post-create-footer .msg-typing, .command-name, .modal .modal-content, .dropdown-menu, .popover, .mentions-name, .tip-overlay', 'color:' + theme.centerChannelColor, 1);
|
2015-12-21 20:57:03 +05:00
|
|
|
changeCss('#archive-link-home', 'background:' + changeOpacity(theme.centerChannelColor, 0.15), 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('#post-create', 'color:' + theme.centerChannelColor, 2);
|
2015-12-01 13:25:12 -05:00
|
|
|
changeCss('.mentions--top, .suggestion-list', 'box-shadow:' + changeOpacity(theme.centerChannelColor, 0.2) + ' 1px -3px 12px', 3);
|
|
|
|
|
changeCss('.mentions--top, .suggestion-list', '-webkit-box-shadow:' + changeOpacity(theme.centerChannelColor, 0.2) + ' 1px -3px 12px', 2);
|
|
|
|
|
changeCss('.mentions--top, .suggestion-list', '-moz-box-shadow:' + changeOpacity(theme.centerChannelColor, 0.2) + ' 1px -3px 12px', 1);
|
2015-10-05 08:04:32 +05:00
|
|
|
changeCss('.dropdown-menu, .popover ', 'box-shadow:' + changeOpacity(theme.centerChannelColor, 0.1) + ' 0px 6px 12px', 3);
|
|
|
|
|
changeCss('.dropdown-menu, .popover ', '-webkit-box-shadow:' + changeOpacity(theme.centerChannelColor, 0.1) + ' 0px 6px 12px', 2);
|
|
|
|
|
changeCss('.dropdown-menu, .popover ', '-moz-box-shadow:' + changeOpacity(theme.centerChannelColor, 0.1) + ' 0px 6px 12px', 1);
|
2015-11-19 01:11:06 +05:00
|
|
|
changeCss('.post__body hr, .loading-screen .loading__content .round, .tutorial__circles .circle', 'background:' + theme.centerChannelColor, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('.channel-header .heading', 'color:' + theme.centerChannelColor, 1);
|
2015-09-24 18:55:53 +05:00
|
|
|
changeCss('.markdown__table tbody tr:nth-child(2n)', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('.channel-header__info>div.dropdown .header-dropdown__icon', 'color:' + changeOpacity(theme.centerChannelColor, 0.8), 1);
|
|
|
|
|
changeCss('.channel-header #member_popover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8), 1);
|
2015-12-01 13:25:12 -05:00
|
|
|
changeCss('.custom-textarea, .custom-textarea:focus, .preview-container .preview-div, .post-image__column .post-image__details, .sidebar--right .sidebar-right__body, .markdown__table th, .markdown__table td, .suggestion-content, .modal .modal-content, .settings-modal .settings-table .settings-content .divider-light, .webhooks__container, .dropdown-menu, .modal .modal-header, .popover', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
|
2015-10-14 17:04:13 +05:00
|
|
|
changeCss('.popover.bottom>.arrow', 'border-bottom-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1);
|
2015-11-06 21:17:47 +05:00
|
|
|
changeCss('.search-help-popover .search-autocomplete__divider span', 'color:' + changeOpacity(theme.centerChannelColor, 0.7), 1);
|
2015-10-14 17:04:13 +05:00
|
|
|
changeCss('.popover.right>.arrow', 'border-right-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1);
|
|
|
|
|
changeCss('.popover.left>.arrow', 'border-left-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1);
|
|
|
|
|
changeCss('.popover.top>.arrow', 'border-top-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1);
|
2015-10-05 08:04:32 +05:00
|
|
|
changeCss('.command-name, .popover .popover-title', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
|
2015-11-06 21:17:47 +05:00
|
|
|
changeCss('.dropdown-menu .divider, .search-help-popover .search-autocomplete__divider:before', 'background:' + theme.centerChannelColor, 1);
|
2015-09-24 18:55:53 +05:00
|
|
|
changeCss('.custom-textarea', 'color:' + theme.centerChannelColor, 1);
|
|
|
|
|
changeCss('.post-image__column', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 2);
|
|
|
|
|
changeCss('.post-image__column .post-image__details', 'color:' + theme.centerChannelColor, 2);
|
|
|
|
|
changeCss('.post-image__column a, .post-image__column a:hover, .post-image__column a:focus', 'color:' + theme.centerChannelColor, 1);
|
2015-12-02 22:51:48 +05:00
|
|
|
changeCss('@media(min-width: 768px){.search-bar__container .search__form .search-bar, .form-control', 'color:' + theme.centerChannelColor, 2);
|
2015-10-06 22:33:30 +05:00
|
|
|
changeCss('.input-group-addon, .search-bar__container .search__form, .form-control', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
|
2015-11-19 01:11:06 +05:00
|
|
|
changeCss('.form-control:focus', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3), 1);
|
2015-10-31 03:22:02 +01:00
|
|
|
changeCss('.attachment .attachment__content', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3), 1);
|
2015-10-23 19:59:32 +05:00
|
|
|
changeCss('.channel-intro .channel-intro__content, .webhooks__container', 'background:' + changeOpacity(theme.centerChannelColor, 0.05), 1);
|
2015-09-25 22:44:36 +05:00
|
|
|
changeCss('.date-separator .separator__text', 'color:' + theme.centerChannelColor, 2);
|
2015-12-18 19:47:33 +05:00
|
|
|
changeCss('.date-separator .separator__hr, .modal-footer, .modal .custom-textarea', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
|
|
|
|
|
changeCss('.search-item-container, .post-right__container .post.post--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1), 1);
|
2015-10-01 09:33:21 +05:00
|
|
|
changeCss('.modal .custom-textarea:focus', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3), 1);
|
|
|
|
|
changeCss('.channel-intro, .settings-modal .settings-table .settings-content .divider-dark, hr, .settings-modal .settings-table .settings-links', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
|
2015-12-18 19:47:33 +05:00
|
|
|
changeCss('.post.current--user .post__body, .post.post--comment.other--root.current--user .post-comment, pre, .post-right__container .post.post--root', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
|
2015-11-19 01:11:06 +05:00
|
|
|
changeCss('.post.current--user .post__body, .post.post--comment.other--root.current--user .post-comment, .post.same--root.post--comment .post__body, .modal .more-table tbody>tr td, .member-div:first-child, .member-div, .access-history__table .access__report, .activity-log__table', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1), 2);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('@media(max-width: 1800px){.inner__wrap.move--left .post.post--comment.same--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.07), 2);
|
2015-11-19 01:11:06 +05:00
|
|
|
changeCss('.post:hover, .modal .more-table tbody>tr:hover td, .settings-modal .settings-table .settings-content .section-min:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
|
2015-10-05 08:04:32 +05:00
|
|
|
changeCss('.date-separator.hovered--before:after, .date-separator.hovered--after:before, .new-separator.hovered--after:before, .new-separator.hovered--before:after', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
|
2015-12-01 13:25:12 -05:00
|
|
|
changeCss('.command-name:hover, .mentions-name:hover, .suggestion--selected, .dropdown-menu>li>a:focus, .dropdown-menu>li>a:hover, .bot-indicator', 'background:' + changeOpacity(theme.centerChannelColor, 0.15), 1);
|
2015-10-13 14:33:37 +05:00
|
|
|
changeCss('code', 'background:' + changeOpacity(theme.centerChannelColor, 0.1), 1);
|
2015-11-19 20:18:38 +05:00
|
|
|
changeCss('@media(min-width: 960px){.post.current--user:hover .post__body ', 'background: none;', 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('.sidebar--right', 'color:' + theme.centerChannelColor, 2);
|
2015-11-19 20:18:38 +05:00
|
|
|
changeCss('.search-help-popover .search-autocomplete__item:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.05), 1);
|
|
|
|
|
changeCss('.search-help-popover .search-autocomplete__item.selected', 'background:' + changeOpacity(theme.centerChannelColor, 0.15), 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
|
|
|
|
|
2015-09-25 22:44:36 +05:00
|
|
|
if (theme.newMessageSeparator) {
|
|
|
|
|
changeCss('.new-separator .separator__text', 'color:' + theme.newMessageSeparator, 1);
|
|
|
|
|
changeCss('.new-separator .separator__hr', 'border-color:' + changeOpacity(theme.newMessageSeparator, 0.5), 1);
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
if (theme.linkColor) {
|
2015-10-01 09:33:21 +05:00
|
|
|
changeCss('a, a:focus, a:hover, .btn, .btn:focus, .btn:hover', 'color:' + theme.linkColor, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('.post .comment-icon__container', 'fill:' + theme.linkColor, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.buttonBg) {
|
2015-11-03 19:56:46 +05:00
|
|
|
changeCss('.btn.btn-primary, .tutorial__circles .circle.active', 'background:' + theme.buttonBg, 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
changeCss('.btn.btn-primary:hover, .btn.btn-primary:active, .btn.btn-primary:focus', 'background:' + changeColor(theme.buttonBg, -0.25), 1);
|
2015-10-19 22:30:00 +02:00
|
|
|
changeCss('.file-playback-controls', 'color:' + changeColor(theme.buttonBg, -0.25), 1);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.buttonColor) {
|
|
|
|
|
changeCss('.btn.btn-primary', 'color:' + theme.buttonColor, 2);
|
|
|
|
|
}
|
2015-10-06 10:04:39 +05:00
|
|
|
|
|
|
|
|
if (theme.mentionHighlightBg) {
|
2015-12-21 20:57:03 +05:00
|
|
|
changeCss('.mention-highlight, .search-highlight', 'background:' + theme.mentionHighlightBg, 1);
|
2015-12-04 13:21:40 +05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (theme.mentionHighlightBg) {
|
2015-12-21 20:57:03 +05:00
|
|
|
changeCss('.post.post--highlight', 'background:' + changeOpacity(theme.mentionHighlightBg, 0.5), 1);
|
2015-10-06 10:04:39 +05:00
|
|
|
}
|
2015-10-07 14:41:24 +05:00
|
|
|
|
|
|
|
|
if (theme.mentionHighlightLink) {
|
|
|
|
|
changeCss('.mention-highlight .mention-link', 'color:' + theme.mentionHighlightLink, 1);
|
|
|
|
|
}
|
2015-11-04 13:49:39 -08:00
|
|
|
|
|
|
|
|
if (!theme.codeTheme) {
|
|
|
|
|
theme.codeTheme = Constants.DEFAULT_CODE_THEME;
|
|
|
|
|
}
|
|
|
|
|
updateCodeTheme(theme.codeTheme);
|
2015-09-23 10:12:40 -04:00
|
|
|
}
|
2015-11-28 02:54:04 +01:00
|
|
|
|
|
|
|
|
export function applyFont(fontName) {
|
2015-12-03 16:30:45 -05:00
|
|
|
const body = $('body');
|
|
|
|
|
|
|
|
|
|
for (const key of Reflect.ownKeys(Constants.FONTS)) {
|
|
|
|
|
const className = Constants.FONTS[key];
|
|
|
|
|
|
|
|
|
|
if (fontName === key) {
|
|
|
|
|
if (!body.hasClass(className)) {
|
|
|
|
|
body.addClass(className);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
body.removeClass(className);
|
2015-11-28 02:54:04 +01:00
|
|
|
}
|
2015-12-03 16:30:45 -05:00
|
|
|
}
|
2015-11-28 02:54:04 +01:00
|
|
|
}
|
|
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
export function changeCss(className, classValue, classRepeat) {
|
2015-06-14 23:53:32 -08:00
|
|
|
// we need invisible container to store additional css definitions
|
|
|
|
|
var cssMainContainer = $('#css-modifier-container');
|
2015-08-18 09:43:22 -04:00
|
|
|
if (cssMainContainer.length === 0) {
|
2015-08-20 08:41:45 -04:00
|
|
|
cssMainContainer = $('<div id="css-modifier-container"></div>');
|
|
|
|
|
cssMainContainer.hide();
|
|
|
|
|
cssMainContainer.appendTo($('body'));
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// and we need one div for each class
|
2015-09-23 10:12:40 -04:00
|
|
|
var classContainer = cssMainContainer.find('div[data-class="' + className + classRepeat + '"]');
|
2015-08-18 09:43:22 -04:00
|
|
|
if (classContainer.length === 0) {
|
2015-09-23 10:12:40 -04:00
|
|
|
classContainer = $('<div data-class="' + className + classRepeat + '"></div>');
|
2015-06-14 23:53:32 -08:00
|
|
|
classContainer.appendTo(cssMainContainer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// append additional style
|
|
|
|
|
classContainer.html('<style>' + className + ' {' + classValue + '}</style>');
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function rgb2hex(rgbIn) {
|
2015-08-18 09:43:22 -04:00
|
|
|
if (/^#[0-9A-F]{6}$/i.test(rgbIn)) {
|
|
|
|
|
return rgbIn;
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
var rgb = rgbIn.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
|
2015-06-14 23:53:32 -08:00
|
|
|
function hex(x) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return ('0' + parseInt(x, 10).toString(16)).slice(-2);
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
2015-08-18 09:43:22 -04:00
|
|
|
return '#' + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-10-24 15:50:20 +02:00
|
|
|
export function updateCodeTheme(theme) {
|
|
|
|
|
const path = '/static/css/highlight/' + theme + '.css';
|
|
|
|
|
const $link = $('link.code_theme');
|
|
|
|
|
if (path !== $link.attr('href')) {
|
|
|
|
|
changeCss('code.hljs', 'visibility: hidden');
|
|
|
|
|
var xmlHTTP = new XMLHttpRequest();
|
|
|
|
|
xmlHTTP.open('GET', path, true);
|
|
|
|
|
xmlHTTP.onload = function onLoad() {
|
|
|
|
|
$link.attr('href', path);
|
|
|
|
|
if (isBrowserFirefox()) {
|
|
|
|
|
$link.one('load', () => {
|
|
|
|
|
changeCss('code.hljs', 'visibility: visible');
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
changeCss('code.hljs', 'visibility: visible');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
xmlHTTP.send();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function placeCaretAtEnd(el) {
|
2015-06-14 23:53:32 -08:00
|
|
|
el.focus();
|
2015-11-16 12:08:05 -05:00
|
|
|
el.selectionStart = el.value.length;
|
|
|
|
|
el.selectionEnd = el.value.length;
|
|
|
|
|
|
|
|
|
|
return;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getCaretPosition(el) {
|
2015-06-14 23:53:32 -08:00
|
|
|
if (el.selectionStart) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return el.selectionStart;
|
2015-06-14 23:53:32 -08:00
|
|
|
} else if (document.selection) {
|
2015-08-18 09:43:22 -04:00
|
|
|
el.focus();
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
var r = document.selection.createRange();
|
|
|
|
|
if (r == null) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
var re = el.createTextRange();
|
|
|
|
|
var rc = re.duplicate();
|
|
|
|
|
re.moveToBookmark(r.getBookmark());
|
|
|
|
|
rc.setEndPoint('EndToStart', re);
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
return rc.text.length;
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
return 0;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function setSelectionRange(input, selectionStart, selectionEnd) {
|
2015-08-18 09:43:22 -04:00
|
|
|
if (input.setSelectionRange) {
|
|
|
|
|
input.focus();
|
|
|
|
|
input.setSelectionRange(selectionStart, selectionEnd);
|
|
|
|
|
} else if (input.createTextRange) {
|
|
|
|
|
var range = input.createTextRange();
|
|
|
|
|
range.collapse(true);
|
|
|
|
|
range.moveEnd('character', selectionEnd);
|
|
|
|
|
range.moveStart('character', selectionStart);
|
|
|
|
|
range.select();
|
|
|
|
|
}
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function setCaretPosition(input, pos) {
|
|
|
|
|
setSelectionRange(input, pos, pos);
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getSelectedText(input) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var selectedText;
|
|
|
|
|
if (typeof document.selection !== 'undefined') {
|
|
|
|
|
input.focus();
|
|
|
|
|
var sel = document.selection.createRange();
|
|
|
|
|
selectedText = sel.text;
|
|
|
|
|
} else if (typeof input.selectionStart !== 'undefined') {
|
|
|
|
|
var startPos = input.selectionStart;
|
|
|
|
|
var endPos = input.selectionEnd;
|
|
|
|
|
selectedText = input.value.substring(startPos, endPos);
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
return selectedText;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function isValidUsername(name) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var error = '';
|
|
|
|
|
if (!name) {
|
|
|
|
|
error = 'This field is required';
|
|
|
|
|
} else if (name.length < 3 || name.length > 15) {
|
|
|
|
|
error = 'Must be between 3 and 15 characters';
|
|
|
|
|
} else if (!(/^[a-z0-9\.\-\_]+$/).test(name)) {
|
2015-09-14 15:15:48 +01:00
|
|
|
error = "Must contain only letters, numbers, and the symbols '.', '-', and '_'.";
|
2015-10-05 09:58:42 -04:00
|
|
|
} else if (!(/[a-z]/).test(name.charAt(0))) { //eslint-disable-line no-negated-condition
|
2015-08-18 09:43:22 -04:00
|
|
|
error = 'First character must be a letter.';
|
|
|
|
|
} else {
|
|
|
|
|
for (var i = 0; i < Constants.RESERVED_USERNAMES.length; i++) {
|
2015-09-14 16:10:31 +01:00
|
|
|
if (name === Constants.RESERVED_USERNAMES[i]) {
|
2015-08-18 09:43:22 -04:00
|
|
|
error = 'Cannot use a reserved word as a username.';
|
2015-06-14 23:53:32 -08:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return error;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-08-18 09:43:22 -04:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function updateAddressBar(channelName) {
|
2015-11-18 17:29:06 -05:00
|
|
|
const teamURL = TeamStore.getCurrentTeamUrl();
|
2015-08-18 09:43:22 -04:00
|
|
|
history.replaceState('data', '', teamURL + '/channels/' + channelName);
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
|
2015-09-28 16:31:18 -07:00
|
|
|
export function switchChannel(channel) {
|
2015-11-18 17:29:06 -05:00
|
|
|
EventHelpers.emitChannelClickEvent(channel);
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-11 11:18:15 -04:00
|
|
|
updateAddressBar(channel.name);
|
2015-06-14 23:53:32 -08:00
|
|
|
|
|
|
|
|
$('.inner__wrap').removeClass('move--right');
|
|
|
|
|
$('.sidebar--left').removeClass('move--right');
|
|
|
|
|
|
|
|
|
|
client.trackPage();
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2015-08-11 11:18:15 -04:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function isMobile() {
|
2015-08-18 09:43:22 -04:00
|
|
|
return screen.width <= 768;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function isComment(post) {
|
2015-06-14 23:53:32 -08:00
|
|
|
if ('root_id' in post) {
|
2015-11-30 14:15:28 -05:00
|
|
|
return post.root_id !== '' && post.root_id != null;
|
2015-06-14 23:53:32 -08:00
|
|
|
}
|
|
|
|
|
return false;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getDirectTeammate(channelId) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var userIds = ChannelStore.get(channelId).name.split('__');
|
2015-07-02 09:32:31 -04:00
|
|
|
var curUserId = UserStore.getCurrentId();
|
|
|
|
|
var teammate = {};
|
2015-07-01 12:41:36 -07:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if (userIds.length !== 2 || userIds.indexOf(curUserId) === -1) {
|
2015-07-02 09:32:31 -04:00
|
|
|
return teammate;
|
|
|
|
|
}
|
2015-07-01 12:41:36 -07:00
|
|
|
|
2015-07-02 09:34:57 -04:00
|
|
|
for (var idx in userIds) {
|
2015-08-18 09:43:22 -04:00
|
|
|
if (userIds[idx] !== curUserId) {
|
2015-07-02 09:32:31 -04:00
|
|
|
teammate = UserStore.getProfile(userIds[idx]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-07-01 12:41:36 -07:00
|
|
|
|
2015-07-02 09:32:31 -04:00
|
|
|
return teammate;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-07-01 12:41:36 -07:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
Image.prototype.load = function imageLoad(url, progressCallback) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var self = this;
|
2015-06-14 23:53:32 -08:00
|
|
|
var xmlHTTP = new XMLHttpRequest();
|
|
|
|
|
xmlHTTP.open('GET', url, true);
|
|
|
|
|
xmlHTTP.responseType = 'arraybuffer';
|
2015-08-18 09:43:22 -04:00
|
|
|
xmlHTTP.onload = function onLoad() {
|
|
|
|
|
var h = xmlHTTP.getAllResponseHeaders();
|
|
|
|
|
var m = h.match(/^Content-Type\:\s*(.*?)$/mi);
|
|
|
|
|
var mimeType = m[1] || 'image/png';
|
2015-06-14 23:53:32 -08:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
var blob = new Blob([this.response], {type: mimeType});
|
|
|
|
|
self.src = window.URL.createObjectURL(blob);
|
2015-06-14 23:53:32 -08:00
|
|
|
};
|
2015-08-18 09:43:22 -04:00
|
|
|
xmlHTTP.onprogress = function onprogress(e) {
|
|
|
|
|
parseInt(self.completedPercentage = (e.loaded / e.total) * 100, 10);
|
|
|
|
|
if (progressCallback) {
|
|
|
|
|
progressCallback();
|
|
|
|
|
}
|
2015-06-14 23:53:32 -08:00
|
|
|
};
|
2015-08-18 09:43:22 -04:00
|
|
|
xmlHTTP.onloadstart = function onloadstart() {
|
|
|
|
|
self.completedPercentage = 0;
|
2015-06-14 23:53:32 -08:00
|
|
|
};
|
|
|
|
|
xmlHTTP.send();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Image.prototype.completedPercentage = 0;
|
2015-06-16 15:35:34 -04:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function changeColor(colourIn, amt) {
|
2015-09-23 10:12:40 -04:00
|
|
|
var hex = colourIn;
|
|
|
|
|
var lum = amt;
|
2015-07-11 08:32:02 -07:00
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
// validate hex string
|
|
|
|
|
hex = String(hex).replace(/[^0-9a-f]/gi, '');
|
|
|
|
|
if (hex.length < 6) {
|
|
|
|
|
hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
|
2015-07-11 08:32:02 -07:00
|
|
|
}
|
2015-09-23 10:12:40 -04:00
|
|
|
lum = lum || 0;
|
2015-07-11 08:32:02 -07:00
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
// convert to decimal and change luminosity
|
|
|
|
|
var rgb = '#';
|
|
|
|
|
var c;
|
|
|
|
|
var i;
|
|
|
|
|
for (i = 0; i < 3; i++) {
|
|
|
|
|
c = parseInt(hex.substr(i * 2, 2), 16);
|
|
|
|
|
c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);
|
|
|
|
|
rgb += ('00' + c).substr(c.length);
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-07-11 08:32:02 -07:00
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
return rgb;
|
|
|
|
|
}
|
2015-08-18 09:43:22 -04:00
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
export function changeOpacity(oldColor, opacity) {
|
|
|
|
|
var color = oldColor;
|
|
|
|
|
if (color[0] === '#') {
|
|
|
|
|
color = color.slice(1);
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-07-11 08:32:02 -07:00
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
if (color.length === 3) {
|
|
|
|
|
const tempColor = color;
|
|
|
|
|
color = '';
|
2015-08-18 11:58:15 +05:00
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
color += tempColor[0] + tempColor[0];
|
|
|
|
|
color += tempColor[1] + tempColor[1];
|
|
|
|
|
color += tempColor[2] + tempColor[2];
|
2015-08-18 11:58:15 +05:00
|
|
|
}
|
|
|
|
|
|
2015-09-23 10:12:40 -04:00
|
|
|
var r = parseInt(color.substring(0, 2), 16);
|
|
|
|
|
var g = parseInt(color.substring(2, 4), 16);
|
|
|
|
|
var b = parseInt(color.substring(4, 6), 16);
|
2015-08-18 11:58:15 +05:00
|
|
|
|
|
|
|
|
return 'rgba(' + r + ',' + g + ',' + b + ',' + opacity + ')';
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-08-18 11:58:15 +05:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getFullName(user) {
|
2015-07-14 17:07:19 -04:00
|
|
|
if (user.first_name && user.last_name) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return user.first_name + ' ' + user.last_name;
|
2015-07-14 17:07:19 -04:00
|
|
|
} else if (user.first_name) {
|
|
|
|
|
return user.first_name;
|
|
|
|
|
} else if (user.last_name) {
|
|
|
|
|
return user.last_name;
|
|
|
|
|
}
|
2015-08-18 09:43:22 -04:00
|
|
|
|
|
|
|
|
return '';
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-07-14 17:07:19 -04:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getDisplayName(user) {
|
2015-07-13 17:47:57 -04:00
|
|
|
if (user.nickname && user.nickname.trim().length > 0) {
|
|
|
|
|
return user.nickname;
|
2015-08-18 09:43:22 -04:00
|
|
|
}
|
2015-09-02 10:42:26 -04:00
|
|
|
var fullName = getFullName(user);
|
2015-07-14 17:07:19 -04:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
if (fullName) {
|
|
|
|
|
return fullName;
|
2015-07-13 17:47:57 -04:00
|
|
|
}
|
2015-08-18 09:43:22 -04:00
|
|
|
|
|
|
|
|
return user.username;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-07-24 14:13:19 -07:00
|
|
|
|
2015-11-01 01:08:18 +02:00
|
|
|
export function displayUsername(userId) {
|
|
|
|
|
const user = UserStore.getProfile(userId);
|
2015-12-15 11:36:14 -05:00
|
|
|
const nameFormat = PreferenceStore.get(Constants.Preferences.CATEGORY_DISPLAY_SETTINGS, 'name_format', 'false');
|
2015-11-01 01:08:18 +02:00
|
|
|
|
2015-11-02 17:45:51 +02:00
|
|
|
let username = '';
|
2015-11-23 17:14:13 -08:00
|
|
|
if (user) {
|
|
|
|
|
if (nameFormat === 'nickname_full_name') {
|
|
|
|
|
username = user.nickname || getFullName(user);
|
|
|
|
|
} else if (nameFormat === 'full_name') {
|
|
|
|
|
username = getFullName(user);
|
|
|
|
|
}
|
|
|
|
|
if (!username.trim().length) {
|
|
|
|
|
username = user.username;
|
|
|
|
|
}
|
2015-11-01 01:08:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return username;
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-24 14:13:19 -07:00
|
|
|
//IE10 does not set window.location.origin automatically so this must be called instead when using it
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getWindowLocationOrigin() {
|
2015-07-27 13:21:50 -07:00
|
|
|
var windowLocationOrigin = window.location.origin;
|
|
|
|
|
if (!windowLocationOrigin) {
|
2015-08-18 09:43:22 -04:00
|
|
|
windowLocationOrigin = window.location.protocol + '//' + window.location.hostname;
|
|
|
|
|
if (window.location.port) {
|
|
|
|
|
windowLocationOrigin += ':' + window.location.port;
|
|
|
|
|
}
|
2015-07-24 14:13:19 -07:00
|
|
|
}
|
2015-07-27 13:21:50 -07:00
|
|
|
return windowLocationOrigin;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-07-22 17:18:33 -04:00
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
// Converts a file size in bytes into a human-readable string of the form '123MB'.
|
2015-09-02 10:42:26 -04:00
|
|
|
export function fileSizeToString(bytes) {
|
2015-07-22 17:18:33 -04:00
|
|
|
// it's unlikely that we'll have files bigger than this
|
|
|
|
|
if (bytes > 1024 * 1024 * 1024 * 1024) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return Math.floor(bytes / (1024 * 1024 * 1024 * 1024)) + 'TB';
|
2015-07-22 17:18:33 -04:00
|
|
|
} else if (bytes > 1024 * 1024 * 1024) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return Math.floor(bytes / (1024 * 1024 * 1024)) + 'GB';
|
2015-07-22 17:18:33 -04:00
|
|
|
} else if (bytes > 1024 * 1024) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return Math.floor(bytes / (1024 * 1024)) + 'MB';
|
2015-07-22 17:18:33 -04:00
|
|
|
} else if (bytes > 1024) {
|
2015-08-18 09:43:22 -04:00
|
|
|
return Math.floor(bytes / 1024) + 'KB';
|
2015-07-22 17:18:33 -04:00
|
|
|
}
|
2015-08-18 09:43:22 -04:00
|
|
|
|
|
|
|
|
return bytes + 'B';
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-07-28 11:30:22 -04:00
|
|
|
|
|
|
|
|
// Converts a filename (like those attached to Post objects) to a url that can be used to retrieve attachments from the server.
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getFileUrl(filename) {
|
2016-01-06 09:54:05 -05:00
|
|
|
return getWindowLocationOrigin() + '/api/v1/files/get' + filename + '?' + getSessionIndex();
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-07-28 16:41:57 -04:00
|
|
|
|
|
|
|
|
// Gets the name of a file (including extension) from a given url or file path.
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getFileName(path) {
|
2015-07-28 16:41:57 -04:00
|
|
|
var split = path.split('/');
|
|
|
|
|
return split[split.length - 1];
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-08-10 12:05:45 -04:00
|
|
|
|
2015-10-20 14:49:42 -07:00
|
|
|
export function getSessionIndex() {
|
|
|
|
|
if (global.window.mm_session_token_index >= 0) {
|
|
|
|
|
return 'session_token_index=' + global.window.mm_session_token_index;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-10 12:05:45 -04:00
|
|
|
// Generates a RFC-4122 version 4 compliant globally unique identifier.
|
2015-09-02 10:42:26 -04:00
|
|
|
export function generateId() {
|
2015-08-10 12:05:45 -04:00
|
|
|
// implementation taken from http://stackoverflow.com/a/2117523
|
|
|
|
|
var id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
|
|
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
id = id.replace(/[xy]/g, function replaceRandom(c) {
|
2015-08-10 12:05:45 -04:00
|
|
|
var r = Math.floor(Math.random() * 16);
|
|
|
|
|
|
|
|
|
|
var v;
|
|
|
|
|
if (c === 'x') {
|
|
|
|
|
v = r;
|
|
|
|
|
} else {
|
|
|
|
|
v = r & 0x3 | 0x8;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return v.toString(16);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return id;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-08-14 14:21:41 -07:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function isBrowserFirefox() {
|
2015-08-17 08:10:49 -07:00
|
|
|
return navigator && navigator.userAgent && navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-08-14 18:26:09 -07:00
|
|
|
|
2015-08-25 12:47:18 -07:00
|
|
|
// Checks if browser is IE10 or IE11
|
2015-09-02 10:42:26 -04:00
|
|
|
export function isBrowserIE() {
|
2015-08-25 12:47:18 -07:00
|
|
|
if (window.navigator && window.navigator.userAgent) {
|
|
|
|
|
var ua = window.navigator.userAgent;
|
|
|
|
|
|
|
|
|
|
return ua.indexOf('Trident/7.0') > 0 || ua.indexOf('Trident/6.0') > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-08-25 12:47:18 -07:00
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function isBrowserEdge() {
|
2015-11-01 18:30:20 -05:00
|
|
|
return window.navigator && navigator.userAgent && navigator.userAgent.toLowerCase().indexOf('edge') > -1;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-08-25 12:47:18 -07:00
|
|
|
|
2015-10-14 16:57:03 -04:00
|
|
|
export function getDirectChannelName(id, otherId) {
|
|
|
|
|
let handle;
|
|
|
|
|
|
|
|
|
|
if (otherId > id) {
|
|
|
|
|
handle = id + '__' + otherId;
|
|
|
|
|
} else {
|
|
|
|
|
handle = otherId + '__' + id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return handle;
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-14 18:26:09 -07:00
|
|
|
// Used to get the id of the other user from a DM channel
|
2015-09-02 10:42:26 -04:00
|
|
|
export function getUserIdFromChannelName(channel) {
|
2015-08-14 18:26:09 -07:00
|
|
|
var ids = channel.name.split('__');
|
|
|
|
|
var otherUserId = '';
|
|
|
|
|
if (ids[0] === UserStore.getCurrentId()) {
|
|
|
|
|
otherUserId = ids[1];
|
|
|
|
|
} else {
|
|
|
|
|
otherUserId = ids[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return otherUserId;
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-07-07 09:16:13 -04:00
|
|
|
|
2015-12-08 09:45:21 -05:00
|
|
|
// Returns true if the given channel is a direct channel between the current user and the given one
|
|
|
|
|
export function isDirectChannelForUser(otherUserId, channel) {
|
|
|
|
|
return channel.type === Constants.DM_CHANNEL && getUserIdFromChannelName(channel) === otherUserId;
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-02 10:42:26 -04:00
|
|
|
export function importSlack(file, success, error) {
|
2015-08-18 09:43:22 -04:00
|
|
|
var formData = new FormData();
|
|
|
|
|
formData.append('file', file, file.name);
|
|
|
|
|
formData.append('filesize', file.size);
|
2015-07-07 09:16:13 -04:00
|
|
|
formData.append('importFrom', 'slack');
|
|
|
|
|
|
2015-08-18 09:43:22 -04:00
|
|
|
client.importSlack(formData, success, error);
|
2015-09-02 10:42:26 -04:00
|
|
|
}
|
2015-09-14 13:56:58 -04:00
|
|
|
|
|
|
|
|
export function getTeamURLFromAddressBar() {
|
|
|
|
|
return window.location.href.split('/channels')[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getShortenedTeamURL() {
|
|
|
|
|
const teamURL = getTeamURLFromAddressBar();
|
2015-09-22 11:21:28 +05:00
|
|
|
if (teamURL.length > 35) {
|
2015-09-15 08:11:00 -04:00
|
|
|
return teamURL.substring(0, 10) + '...' + teamURL.substring(teamURL.length - 12, teamURL.length) + '/';
|
2015-09-14 13:56:58 -04:00
|
|
|
}
|
2015-09-22 11:21:28 +05:00
|
|
|
return teamURL + '/';
|
2015-09-14 13:56:58 -04:00
|
|
|
}
|
2015-10-16 12:32:19 +03:00
|
|
|
|
|
|
|
|
export function windowWidth() {
|
|
|
|
|
return $(window).width();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function windowHeight() {
|
|
|
|
|
return $(window).height();
|
|
|
|
|
}
|
2015-10-26 23:29:55 +01:00
|
|
|
|
|
|
|
|
export function openDirectChannelToUser(user, successCb, errorCb) {
|
|
|
|
|
const channelName = this.getDirectChannelName(UserStore.getCurrentId(), user.id);
|
|
|
|
|
let channel = ChannelStore.getByName(channelName);
|
|
|
|
|
|
|
|
|
|
const preference = PreferenceStore.setPreference(Constants.Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, user.id, 'true');
|
|
|
|
|
AsyncClient.savePreferences([preference]);
|
|
|
|
|
|
|
|
|
|
if (channel) {
|
|
|
|
|
if ($.isFunction(successCb)) {
|
|
|
|
|
successCb(channel, true);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
channel = {
|
|
|
|
|
name: channelName,
|
|
|
|
|
last_post_at: 0,
|
|
|
|
|
total_msg_count: 0,
|
|
|
|
|
type: 'D',
|
|
|
|
|
display_name: user.username,
|
|
|
|
|
teammate_id: user.id,
|
|
|
|
|
status: UserStore.getStatus(user.id)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Client.createDirectChannel(
|
|
|
|
|
channel,
|
|
|
|
|
user.id,
|
|
|
|
|
(data) => {
|
|
|
|
|
AsyncClient.getChannel(data.id);
|
|
|
|
|
if ($.isFunction(successCb)) {
|
|
|
|
|
successCb(data, false);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
() => {
|
|
|
|
|
window.location.href = TeamStore.getCurrentTeamUrl() + '/channels/' + channelName;
|
|
|
|
|
if ($.isFunction(errorCb)) {
|
|
|
|
|
errorCb();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-11-02 16:04:14 -08:00
|
|
|
|
|
|
|
|
// Use when sorting multiple channels or teams by their `display_name` field
|
|
|
|
|
export function sortByDisplayName(a, b) {
|
|
|
|
|
let aDisplayName = '';
|
|
|
|
|
let bDisplayName = '';
|
|
|
|
|
|
|
|
|
|
if (a && a.display_name) {
|
|
|
|
|
aDisplayName = a.display_name.toLowerCase();
|
|
|
|
|
}
|
|
|
|
|
if (b && b.display_name) {
|
|
|
|
|
bDisplayName = b.display_name.toLowerCase();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (aDisplayName < bDisplayName) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if (aDisplayName > bDisplayName) {
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2015-11-05 13:32:06 -05:00
|
|
|
|
|
|
|
|
export function getChannelTerm(channelType) {
|
|
|
|
|
let channelTerm = 'Channel';
|
|
|
|
|
if (channelType === Constants.PRIVATE_CHANNEL) {
|
|
|
|
|
channelTerm = 'Group';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return channelTerm;
|
|
|
|
|
}
|
2015-11-13 12:20:33 -05:00
|
|
|
|
|
|
|
|
export function getPostTerm(post) {
|
|
|
|
|
let postTerm = 'Post';
|
|
|
|
|
if (post.root_id) {
|
|
|
|
|
postTerm = 'Comment';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return postTerm;
|
|
|
|
|
}
|
2015-11-13 03:15:33 +01:00
|
|
|
|
2015-11-27 23:16:56 +01:00
|
|
|
export function isFeatureEnabled(feature) {
|
2015-12-15 11:36:14 -05:00
|
|
|
return PreferenceStore.getBool(Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, Constants.FeatureTogglePrefix + feature.label);
|
2015-12-03 16:30:45 -05:00
|
|
|
}
|
2015-12-04 02:07:47 +01:00
|
|
|
|
|
|
|
|
export function isSystemMessage(post) {
|
|
|
|
|
return post.type && (post.type.lastIndexOf(Constants.SYSTEM_MESSAGE_PREFIX) === 0);
|
2015-12-09 12:24:34 -05:00
|
|
|
}
|
2016-01-04 12:23:46 -05:00
|
|
|
|
|
|
|
|
export function fillArray(value, length) {
|
|
|
|
|
const arr = [];
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < length; i++) {
|
|
|
|
|
arr.push(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return arr;
|
|
|
|
|
}
|
2016-01-06 14:18:05 -08:00
|
|
|
|
|
|
|
|
// Checks if a data transfer contains files not text, folders, etc..
|
|
|
|
|
// Slightly modified from http://stackoverflow.com/questions/6848043/how-do-i-detect-a-file-is-being-dragged-rather-than-a-draggable-element-on-my-pa
|
|
|
|
|
export function isFileTransfer(files) {
|
|
|
|
|
return files.types != null && (files.types.indexOf ? files.types.indexOf('Files') !== -1 : files.types.contains('application/x-moz-file'));
|
|
|
|
|
}
|
2016-01-04 12:44:22 -05:00
|
|
|
|
|
|
|
|
export function clearFileInput(elm) {
|
|
|
|
|
// clear file input for all modern browsers
|
|
|
|
|
try {
|
|
|
|
|
elm.value = '';
|
|
|
|
|
if (elm.value) {
|
|
|
|
|
elm.type = 'text';
|
|
|
|
|
elm.type = 'file';
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// Do nothing
|
|
|
|
|
}
|
|
|
|
|
}
|