`)\r\n }\r\n \r\n return content;\r\n}\r\n\r\nexport default function* rootSaga() {\r\n yield all([\r\n fork(getBlogsFromChannel)\r\n ]);\r\n}\r\n","import { all, put, fork, takeEvery, select, call } from 'redux-saga/effects';\r\nimport actions from './actions';\r\nimport localforage from 'localforage';\r\nimport { dataURItoBlob, parseSharepointUrl, parsePictureUrl } from '../../../helpers/functions';\r\nimport { getSharepointClient, getGOClient, getGraphClient, getMultichannelFeeds } from '../../selectors';\r\nimport FeedObject from './FeedObject';\r\nimport * as rssParser from 'react-native-rss-parser';\r\n\r\nconst checkDifferences = (array1, array2) => {\r\n let length = Math.min(array1.length, array2.length);\r\n let countMatched = 0, countNotMatched = 0;\r\n let newItems = [];\r\n\r\n for (var index = 0; index < length; index++) {\r\n if (!array2.find(a => a.id == array1[index].id)) {\r\n countNotMatched++;\r\n newItems.push(array1[index].id);\r\n }\r\n }\r\n return { notMatched: countNotMatched, newItems: newItems };\r\n}\r\n\r\nexport function* getFeedsByChannel() {\r\n yield takeEvery(actions.GET_MULTICHANNEL_FEEDS, function* (action) {\r\n // -- Switch here, select news conditionally.\r\n let newsItems = [];\r\n yield put({\r\n type: actions.FEED_REQUEST_COMPLETED,\r\n payload: false\r\n })\r\n const Client = yield select(getGOClient);\r\n\r\n let currentFeeds = yield select(getMultichannelFeeds);\r\n\r\n const feedsConfig = JSON.parse(window.tenantConfig?.feeds);\r\n if (feedsConfig == null) return;\r\n\r\n let feeds = [];\r\n const title = action.payload.title;\r\n \r\n for (let config of feedsConfig) {\r\n let feed = yield\r\n Client.api('/app/rss?url=' + config.url, {}, 'text')\r\n .then((responseData) => rssParser.parse(responseData));\r\n\r\n if (currentFeeds.find(f => f.title == feed.title)) {\r\n let oldFeed = currentFeeds.feeds.find(f => f.title == feed.title);\r\n feed.differences = oldFeed.differences;\r\n feed.newItems = oldFeed.newItems;\r\n\r\n let difference = checkDifferences(feed.items, oldFeed.items);\r\n feed.differences = feed.differences + difference.notMatched;\r\n feed.newItems.push(difference.newItems);\r\n } else {\r\n feed.differences = 0;\r\n feed.newItems = [];\r\n }\r\n feeds.push(feed);\r\n }\r\n\r\n yield put({\r\n type: actions.SET_MULTICHANNEL_FEEDS,\r\n payload: feeds\r\n })\r\n yield put({\r\n type: actions.FEED_REQUEST_COMPLETED,\r\n payload: true\r\n })\r\n })\r\n}\r\n\r\n\r\nexport default function* rootSaga() {\r\n yield all([\r\n fork(getFeedsByChannel)\r\n ]);\r\n}\r\n","import moment from 'moment';\r\n\r\nclass SocialObject {\r\n constructor() {\r\n this._socialItem = {\r\n author : false,\r\n unix : false,\r\n moment : false,\r\n title : \"\",\r\n imageUrl : false,\r\n url : false,\r\n id : false,\r\n type: false,\r\n likes : 0,\r\n openDirect: false,\r\n topics: false\r\n }\r\n }\r\n\r\n setID = (ID) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n id : ID\r\n }\r\n }\r\n\r\n setOpenDirect = (bool) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n openDirect : bool\r\n }\r\n }\r\n\r\n setLikes = (int) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n likes : int\r\n }\r\n }\r\n\r\n setAuthor = (author) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n author : author\r\n }\r\n }\r\n\r\n setTopics = (topics) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n topics: topics\r\n }\r\n }\r\n\r\n setContent = (content) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n content : content\r\n }\r\n }\r\n setTimestamp = (timestamp) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n unix : timestamp,\r\n moment: moment.unix(timestamp),\r\n }\r\n }\r\n\r\n setTitle = (title) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n title : title\r\n }\r\n }\r\n\r\n setType = (type) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n type : type\r\n }\r\n }\r\n\r\n setImageUrl = (imageUrl) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n imageUrl : imageUrl\r\n }\r\n }\r\n\r\n setUrl = (URL) => {\r\n this._socialItem = {\r\n ...this._socialItem,\r\n url : URL\r\n }\r\n }\r\n\r\n getSocialObject = () => {\r\n\r\n return this._socialItem;\r\n }\r\n}\r\n\r\nexport default SocialObject;\r\n","import { all, put, fork, takeEvery, select, call } from 'redux-saga/effects';\r\nimport actions from './actions';\r\nimport userActions from '../../user/actions';\r\nimport localforage from 'localforage';\r\nimport { dataURItoBlob, parseSharepointUrl, parsePictureUrl } from '../../../helpers/functions';\r\nimport { getGOClient, getGraphClient, getYammerClient, getSharepointClient, getMultiChannelSocialItems, getSocialRequestCompleted, getUserRequestCompleted, getUserProfileSettingData } from '../../selectors';\r\nimport SocialObject from './socialObject';\r\nimport moment from 'moment/min/moment-with-locales';\r\n\r\nimport embraceOutput from './embraceOutput';\r\n\r\n\r\nexport function* getSocialFromChannel() {\r\n yield takeEvery(actions.GET_MULTICHANNEL_SOCIAL_ITEMS, function* (action) {\r\n // -- Switch here, select social items conditionally.\r\n yield put({\r\n type: actions.SOCIAL_REQUEST_COMPLETED,\r\n payload: false\r\n })\r\n let newItems = [];\r\n let currentItems = yield select(getMultiChannelSocialItems);\r\n\r\n const title = action.payload.title;\r\n const sources = action.payload.payload;\r\n\r\n //parse the different sources configured\r\n if (sources) {\r\n for (let source of sources) {\r\n\r\n if (source.source == \"embrace\") {\r\n let items = yield call(getEmbraceItems, source.site, source.url, source.content, source.opendirect, title);\r\n if (items?.length == 0) {\r\n items = currentItems.filter(i => i.widget == title);\r\n } else if (items?.length > 0) {\r\n items = items.map(i => { i.widget = title; return i; });\r\n }\r\n\r\n if (items) {\r\n newItems = [\r\n ...newItems,\r\n ...items\r\n ];\r\n }\r\n }\r\n\r\n if (source.source == \"yammer\") {\r\n let items = yield call(getYammerItems, title);\r\n if (items?.length == 0) {\r\n items = currentItems.filter(i => i.widget == title);\r\n } else if (items?.length > 0) {\r\n items = items.map(i => { i.widget = title; return i; });\r\n }\r\n\r\n if (items) {\r\n newItems = [\r\n ...newItems,\r\n ...items\r\n ];\r\n }\r\n }\r\n }\r\n }\r\n\r\n const sortOnDate = ((a, b) => {\r\n if (a.unix > b.unix) {\r\n return -1;\r\n }\r\n\r\n if (a.unix < b.unix) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n currentItems = yield select(getMultiChannelSocialItems);\r\n currentItems = currentItems.filter(i => i.widget == title);\r\n\r\n //sort all new items on date\r\n newItems.sort(sortOnDate);\r\n\r\n //max items for one widget\r\n newItems = newItems.splice(0, 30);\r\n\r\n let old = currentItems.filter(n => !newItems.find(nn => nn.id == n.id));\r\n if (old?.length > 0 && newItems.length > 0) {\r\n for (let n of old) {\r\n yield localforage.removeItem(n.id);\r\n }\r\n }\r\n\r\n if ((old?.length > 0 && newItems.length > 0) || (currentItems?.length == 0 && newItems?.length > 0) || (currentItems?.length !== newItems?.length && newItems.length > 0)) {\r\n\r\n //postprocessing..\r\n //newItems = yield call(postprocess, newItems);\r\n\r\n let allItems = yield select(getMultiChannelSocialItems);\r\n allItems = allItems.filter(i => i.widget != title);\r\n allItems = allItems.concat(newItems);\r\n\r\n yield put({\r\n type: actions.SET_MULTICHANNEL_SOCIAL_ITEMS,\r\n payload: allItems\r\n });\r\n }\r\n\r\n yield put({\r\n type: actions.SOCIAL_REQUEST_COMPLETED,\r\n payload: true\r\n });\r\n })\r\n}\r\n\r\nconst parseSocialItemContent = (content) => {\r\n const urls = /<(.*)>\\(“(.*)”\\)/g\r\n\r\n content = content.replace(urls, function (match, token) {\r\n let title = match.match(/<(.*)>/);\r\n let link = match.match(/\\(“(.*)”\\)/);\r\n if (title[1] == null || link[1] == null) return \"\";\r\n return ` ${link[1]} `;\r\n });\r\n\r\n content = content.replace(/(?:\\r\\n|\\r|\\n)/g, ' ');\r\n\r\n return content;\r\n}\r\n\r\n\r\nfunction* getEmbraceItems(site, apiURL, content, openDirect, title) {\r\n\r\n if (!apiURL) {\r\n console.log(\"Embrace API URL Required\");\r\n return;\r\n }\r\n try {\r\n const socialItems = yield select(getMultiChannelSocialItems);\r\n const GoClient = yield select(getGOClient);\r\n let oldestItem = moment().valueOf();\r\n\r\n let offset = new Date().getTimezoneOffset();\r\n oldestItem = oldestItem + (-offset * 60 * 1000);\r\n\r\n\r\n /* if (socialItems?.length > 0) {\r\n let items = socialItems.filter(i => i.widget == title);\r\n if (items[0]?.unix) oldestItem = items[0]?.unix;\r\n }*/\r\n\r\n //build api url\r\n if (apiURL.indexOf(\"?\") == -1) {\r\n if (apiURL[apiURL.length - 1] != '/') apiURL += '/';\r\n apiURL += 'api/v1/Microblogs?oldestItem=' + oldestItem + '&label=0';\r\n }\r\n\r\n if (!GoClient) return;\r\n const items = yield GoClient.api('/app/proxy?url=' + encodeURIComponent(apiURL) + '&type=embrace', {}, 'text')\r\n if (items) {\r\n let embraceItems = JSON.parse(items)?.Items;\r\n\r\n // -- Embrace fetch logic;\r\n if (embraceItems?.length) {\r\n return yield parseEmbraceSocial(embraceItems, site, apiURL, content, openDirect);\r\n }\r\n }\r\n\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n\r\n return false;\r\n}\r\n\r\n\r\nfunction* getYammerItems(title) {\r\n //if (!apiURL) {\r\n // console.log(\"Yammer API URL Required\");\r\n // return;\r\n //}\r\n //try {\r\n let currentItems = yield select(getMultiChannelSocialItems);\r\n currentItems = currentItems.filter(i => i.widget == title);\r\n const Client = yield select(getYammerClient);\r\n const GoClient = yield select(getGOClient);\r\n const GraphClient = yield select(getGraphClient);\r\n\r\n if (!Client) return;\r\n\r\n //const shouts = yield Client.api(apiURL);\r\n let shouts = yield Client.api('https://www.yammer.com/api/v1/messages.json?threaded=true');\r\n //let test = yield Client.api('/users/1522724127.json');\r\n let messages = [];\r\n\r\n if (shouts == null || !shouts) return;\r\n if (shouts.length === 0) return;\r\n\r\n if (shouts != null) {\r\n let items = shouts.references.filter(m => m.announcement !== true && m.type == \"thread\"); //no announcements! \r\n messages = shouts.messages.filter(m => items.find(a => a.id == m.id));\r\n\r\n //messages.takeEvery(m => announcements.find(a => a.id == m.id))\r\n for (let m of messages) {\r\n let a = items.find(a => a.id == m.id);\r\n m.reference = a;\r\n\r\n let user = shouts.references.find(r => r.id == m.sender_id);\r\n m.user = user;\r\n\r\n let topics = shouts.references.find(r => r.id == m.id)?.topics;\r\n if (topics) {\r\n //m.topics = topics;\r\n m.topics = [];\r\n for (let t of topics) {\r\n let topic = yield Client.api(`https://www.yammer.com/api/v1/topics/${t.id}.json`);\r\n if (topic != null) m.topics.push(topic);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (messages.length && ((currentItems.length === 0) || (currentItems && currentItems[0].id !== messages[0].id))) {\r\n return yield parseYammerItems(messages);\r\n } else {\r\n return yield parseYammerItems(messages);\r\n }\r\n return false\r\n}\r\n\r\nasync function parseYammerItems(items) {\r\n let parsedItem = [];\r\n for (let key in items) {\r\n if (items[key]) { \r\n const item = items[key];\r\n\r\n let socialObject = new SocialObject;\r\n socialObject.setAuthor(item.user?.full_name);\r\n socialObject.setContent(parseYammerContent(item.body?.rich));\r\n socialObject.setTimestamp(moment(item.created_at)?.valueOf());\r\n socialObject.setUrl(item.web_url);\r\n socialObject.setID(\"\" + item.id);\r\n socialObject.setLikes(item.liked_by?.count);\r\n socialObject.setType('yammer');\r\n\r\n if (item.topics != null && item.topics) {\r\n socialObject.setTopics(item.topics);\r\n }\r\n\r\n socialObject.setImageUrl(item.user?.mugshot_url);\r\n\r\n if (socialObject.getSocialObject()) {\r\n parsedItem.push(socialObject.getSocialObject());\r\n }\r\n }\r\n }\r\n return parsedItem;\r\n}\r\n\r\nconst parseYammerContent = (content) => {\r\n const urls = /<(.*)>\\(“(.*)”\\)/g\r\n const links = /(.*)</\r\n\r\n content = content.replace(urls, function (match, token) {\r\n let title = match.match(/<(.*)>/);\r\n let link = match.match(/\\(“(.*)”\\)/);\r\n if (title[1] == null || link[1] == null) return \"\";\r\n return ` ${link[1]} `;\r\n });\r\n\r\n content = content.replace(links, function (match, token) {\r\n let title = match.match(/(.*)<${link[1]} `;\r\n });\r\n\r\n content = content.replace(/(?:\\r\\n|\\r|\\n)/g, ' ');\r\n\r\n return content;\r\n}\r\n\r\nexport function* setLastViewedItems() {\r\n yield takeEvery(actions.SET_LAST_SOCIAL_VIEWED, function* (action) {\r\n if (action.payload == null) return;\r\n\r\n yield put({\r\n type: userActions.UPDATE_USER_SETTINGS,\r\n payload: {\r\n value: action.payload,\r\n setting: 'viewedSocial'\r\n }\r\n });\r\n\r\n });\r\n}\r\n\r\n\r\nexport function* parseLastViewed() {\r\n\r\n const parser = function* () {\r\n\r\n const items = yield select(getMultiChannelSocialItems);\r\n const data = yield select(getUserProfileSettingData);\r\n const completed = yield select(getUserRequestCompleted);\r\n const socialCompleted = yield select(getSocialRequestCompleted);\r\n\r\n if (data == null || !completed || !socialCompleted || items?.length == 0) return;\r\n\r\n let viewedItems = data.settings?.viewedSocial;\r\n if (!viewedItems) {\r\n viewedItems = [];\r\n }\r\n\r\n let newViewed = [];\r\n\r\n for (let item of items) {\r\n\r\n // -- User has never seen any social item, set everything to true\r\n if (!viewedItems.length) {\r\n item.viewed = true;\r\n } else {\r\n // -- Already items in user object, new items are unviewed.\r\n let viewedItem = viewedItems.find((i) => i.id === item.id);\r\n item.viewed = false;\r\n if (viewedItem) {\r\n if (viewedItem.viewed) {\r\n item.viewed = true;\r\n }\r\n }\r\n }\r\n\r\n if (!viewedItems.find((i) => i.id === item.id)) {\r\n newViewed.push({\r\n id: item.id,\r\n viewed: item.viewed,\r\n widget: item.widget\r\n });\r\n }\r\n }\r\n\r\n // -- Cleanup with only present items.\r\n for (let item of viewedItems) {\r\n let available = items.find((i) => i.id === item.id);\r\n if (available) {\r\n newViewed.push({\r\n id: item.id,\r\n widget: item.widget,\r\n viewed: item.viewed\r\n })\r\n }\r\n }\r\n\r\n\r\n // -- Conditionally update user settings object\r\n if ((newViewed.length == 0 && viewedItems.length == 0) ||\r\n (JSON.stringify(newViewed.map(n => n.id)) != JSON.stringify(viewedItems.map(n => n.id))) ||\r\n !data.settings?.viewedSocial) {\r\n\r\n console.log('set viewed socials');\r\n yield put({\r\n type: userActions.UPDATE_USER_SETTINGS,\r\n payload: {\r\n value: newViewed,\r\n setting: 'viewedSocial'\r\n }\r\n });\r\n }\r\n }\r\n\r\n // -- Fires after user data has been fetched, checks for social request completion and parses items\r\n yield takeEvery(userActions.DATA_REQUEST_COMPLETED, function* (action) {\r\n const completed = yield select(getSocialRequestCompleted);\r\n\r\n if (completed) {\r\n yield parser();\r\n }\r\n });\r\n\r\n // -- Fires after social data has been fetched, checks for user data presence and parses items\r\n yield takeEvery(actions.SOCIAL_REQUEST_COMPLETED, function* (action) {\r\n const completed = yield select(getUserRequestCompleted);\r\n\r\n if (action.payload === true && completed) {\r\n yield parser();\r\n }\r\n });\r\n}\r\n\r\n\r\nfunction parseEmbraceContent(content) {\r\n\r\n const urls = /href=/gi;\r\n\r\n content = content.replace(urls, function (match, token) {\r\n return 'target=\"_blank\" href=';\r\n });\r\n\r\n return content;\r\n}\r\n\r\nasync function parseEmbraceSocial(embraceItems, site, url, content, openDirect) {\r\n let parsedSocial = [];\r\n for (let key in embraceItems) {\r\n if (embraceItems[key]) {\r\n const item = embraceItems[key];\r\n\r\n let socialObject = new SocialObject;\r\n socialObject.setAuthor(item.PersonFullName);\r\n socialObject.setContent(parseEmbraceContent(item.Message));\r\n\r\n let offset = new Date().getTimezoneOffset();\r\n let timestamp = item.Timestamp - (-offset * 60 * 1000);\r\n\r\n socialObject.setTimestamp(timestamp);\r\n socialObject.setUrl(site);\r\n socialObject.setOpenDirect(openDirect);\r\n socialObject.setID('embrace_' + item.Id);\r\n socialObject.setType('embrace');\r\n socialObject.setLikes(item.Likes);\r\n\r\n if (item.PersonAvatar == null) {\r\n socialObject.setImageUrl('parse-from-localForage');\r\n } else {\r\n socialObject.setImageUrl(site + item.PersonAvatar.replace('Avatar55', 'Avatar150'));\r\n }\r\n\r\n if (socialObject.getSocialObject()) {\r\n parsedSocial.push(socialObject.getSocialObject());\r\n }\r\n }\r\n }\r\n return parsedSocial;\r\n}\r\n\r\nexport default function* rootSaga() {\r\n yield all([\r\n fork(getSocialFromChannel),\r\n fork(parseLastViewed),\r\n fork(setLastViewedItems)\r\n ]);\r\n};\r\n","import { all } from 'redux-saga/effects';\r\n\r\n// -- Old style widgets\r\nimport AppSaga from './app/saga';\r\nimport LayoutSaga from './layout/saga';\r\nimport AuthSaga from './auth/saga';\r\nimport UserSaga from './user/saga';\r\nimport GraphSaga from './client/saga';\r\nimport TasksSaga from './tasks/saga';\r\nimport BirthdaySaga from './birthday/saga';\r\nimport NewsSaga from './news/saga';\r\nimport DocumentSaga from './document/saga';\r\nimport MessageSage from './message/saga';\r\nimport ReportsSaga from './reports/saga';\r\nimport NotificationSaga from './notification/saga';\r\nimport NotificationCollectorSaga from'./notificationCollector/saga';\r\nimport EventsSaga from './events/saga';\r\nimport BlogSaga from './blog/saga';\r\nimport SlideOutSaga from './slideOut/saga';\r\nimport SolutionSaga from './solution/saga';\r\nimport SearchSaga from './search/saga';\r\nimport CalendarSagas from './calendar/saga';\r\nimport WidgetSaga from './widgets/saga';\r\nimport AppsSaga from './apps/saga';\r\nimport DocumentsWizardSaga from './documentsWizard/saga';\r\nimport TipsTricksSaga from './tipsTricks/saga';\r\nimport SiteKnowledgeSaga from './siteKnowledge/saga';\r\n\r\n// -- Common widgets\r\nimport CommonNewsSaga from './common/news/saga';\r\nimport ITNewsSaga from './common/itnews/saga';\r\nimport LearningSaga from './common/learning/saga';\r\nimport CommonEventsSaga from './common/events/saga';\r\nimport CommonBlogsSaga from './common/blog/saga';\r\nimport KnowledgeBaseSaga from './knowledgeBase/saga';\r\nimport CallsSaga from './common/calls/saga';\r\n\r\nimport UserRequestSaga from './common/userRequest/saga';\r\nimport RightsRequestSaga from './common/rightsRequest/saga';\r\nimport WorkplaceRequestSaga from './common/workplaceRequest/saga';\r\n\r\n// -- Widgets in new style\r\nimport TeamsSaga from './widgets/teams/saga';\r\nimport SharepointSaga from './widgets/sharepoint/saga';\r\nimport PeopleSaga from './widgets/people/saga';\r\nimport MultiChannelNewsSaga from './widgets/multiChannelNews/saga';\r\nimport MultiChannelShoutSaga from './widgets/multiChannelShout/saga';\r\nimport MultiChannelBlogSaga from './widgets/multiChannelBlog/saga';\r\nimport MultiChannelFeedSaga from './widgets/multiChannelFeed/saga';\r\nimport MultiChannelSocialSaga from './widgets/multiChannelSocial/saga';\r\nimport MultiChannelEventsSaga from './widgets/multiChannelEvent/saga';\r\n\r\nexport default function* rootSaga(getState) {\r\n\tyield all([\r\n\t\tAppSaga(),\r\n\t\tLayoutSaga(),\r\n\t\tAuthSaga(),\r\n\t\tGraphSaga(),\r\n\t\tUserSaga(),\r\n\t\tBirthdaySaga(),\r\n\t\tDocumentSaga(),\r\n\t\tTasksSaga(),\r\n NotificationSaga(),\r\n\t\tCalendarSagas(),\r\n\t\tWidgetSaga(),\r\n\t\tAppsSaga(),\r\n\t\tEventsSaga(),\r\n BlogSaga(),\r\n ReportsSaga(),\r\n\t\tCommonNewsSaga(),\r\n\t\tITNewsSaga(),\r\n CommonEventsSaga(),\r\n\t\tCommonBlogsSaga(),\r\n\t\tKnowledgeBaseSaga(),\r\n\t\tCallsSaga(),\r\n\t\tLearningSaga(),\r\n\t\tSlideOutSaga(),\r\n\t\tNotificationCollectorSaga(),\r\n\t\tSolutionSaga(),\r\n\t\tSearchSaga(),\r\n\t\tDocumentsWizardSaga(),\r\n\t\tTipsTricksSaga(),\r\n\t\tSiteKnowledgeSaga(),\r\n\t\tTeamsSaga(),\r\n\t\tSharepointSaga(),\r\n\t\tPeopleSaga(),\r\n\t\tMultiChannelNewsSaga(),\r\n\t\tMultiChannelBlogSaga(),\r\n\t\tMessageSage(),\r\n\t\tMultiChannelShoutSaga(),\r\n\t\tMultiChannelFeedSaga(),\r\n\t\tMultiChannelSocialSaga(),\r\n\t\tMultiChannelEventsSaga(),\r\n\t\t//newsSaga()\r\n\t\tUserRequestSaga(),\r\n\t\tRightsRequestSaga(),\r\n\t\tWorkplaceRequestSaga(),\r\n\t]);\r\n}\r\n","import { createStore, applyMiddleware, compose, combineReducers } from 'redux';\r\nimport createSagaMiddleware from 'redux-saga';\r\nimport rootReducer from './rootReducer';\r\nimport rootSaga from './rootSaga';\r\nimport { persistStore, persistReducer } from 'redux-persist';\r\nimport storage from 'redux-persist/lib/storage'; // defaults to localStorage for web\r\nimport localForage from \"localforage\";\r\nimport { routerMiddleware } from 'react-router-redux';\r\nconst createHistory = require(\"history\").createBrowserHistory;\r\nconst history = createHistory();\r\nconst routersMiddleware = routerMiddleware(history);\r\n\r\nconst sagaMiddleware = createSagaMiddleware();\r\nconst middlewares = [sagaMiddleware, routersMiddleware];\r\n\r\n//import { IntlActions } from 'react-redux-multilingual'\r\n//import translations from './translations'\r\n//import { IntlReducer as Intl, IntlProvider } from 'react-redux-multilingual'\r\n\r\nconst persistConfig = {\r\n key: 'root',\r\n storage: localForage,\r\n blacklist: ['Notifications', 'Client','Widgets', 'Auth', 'Message', 'SlideOut', 'Popup', 'YearOverview', 'Sharepoint']\r\n};\r\n\r\nconst persistedReducer = persistReducer(persistConfig, rootReducer);\r\n\r\nfunction configureStore(initialState) {\r\n const store = createStore(\r\n persistedReducer,\r\n compose(applyMiddleware(...middlewares)));\r\n\r\n let persistor = persistStore(store);\r\n if(window.clearPersist) {\r\n persistor.purge();\r\n }\r\n sagaMiddleware.run(rootSaga);\r\n\r\n return { store, persistor, history };\r\n}\r\n\r\n\r\nexport default configureStore();\r\n","const actions = {\r\n\tSET_APP_ONLINE : 'SET_APP_ONLINE',\r\n CHECK_APP_ONLINE : 'CHECK_APP_ONLINE',\r\n\tCHANGE_APP_CONNECTIVITY_STATUS : 'CHANGE_APP_CONNECTIVITY_STATUS',\r\n\tsetAppOnline : (payload) => ({\r\n\t\ttype : actions.SET_APP_ONLINE,\r\n\t\tpayload : payload\r\n\t}),\r\n\r\n checkAppOnline : (payload) => ({\r\n\t\ttype : actions.CHECK_APP_ONLINE,\r\n\t\tpayload : payload\r\n\t}),\r\n};\r\n\r\nexport default actions;\r\n","const actions = {\r\n\tGET_MULTICHANNEL_FEEDS : 'GET_MULTICHANNEL_FEEDS',\r\n\tSET_MULTICHANNEL_FEEDS : 'SET_MULTICHANNEL_FEEDS',\r\n\tSET_ACTIVE_FEED_ITEM : 'SET_ACTIVE_FEED_ITEM',\r\n\tFEED_REQUEST_COMPLETED : 'FEED_REQUEST_COMPLETED',\r\n\tgetMultichannelFeeds : ( payload, title ) => ({\r\n\t\ttype : actions.GET_MULTICHANNEL_FEEDS,\r\n\t\tpayload : { title: title, payload: payload } \r\n\t}),\r\n\tsetActiveFeedItem : ( payload ) => ({\r\n\t\ttype : actions.SET_ACTIVE_FEED_ITEM,\r\n\t\tpayload : payload\r\n\t}),\r\n};\r\n\r\nexport default actions;\r\n","import styled from 'styled-components'\r\n\r\nimport * as Variables from '../../ThemeVariables';\r\n\r\nconst CircleIcon = styled.div`\r\n\tborder-radius: 100%;\r\n\toverflow: hidden;\r\n\r\n\t\r\n\tline-height: ${Variables.headerHeight};\r\n\theight: ${Variables.headerHeight};\r\n\twidth: ${Variables.headerHeight};\r\n\tbackground: #dadde1;\r\n\tcolor: black;\r\n\ttext-align: center;\r\n\tfont-size: 25px;\r\n\tcursor: pointer;\r\n\r\n\tbox-shadow: 0 0 0 transparent;\r\n\ttransition: box-shadow .5s;\r\n\t&:hover {\r\n\t\tbox-shadow: 0 0 5px black;\r\n\r\n\t}\r\n`;\r\n\r\nexport default CircleIcon;\r\n","import styled from 'styled-components';\r\n\r\nexport const PageLoader = styled.div`\r\n\tposition: fixed;\r\n\theight: 100%;\r\n\tbackground-color: rgba(255, 255, 255, .5);\r\n\twidth: 100%;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\r\n\t&.darkmode {\r\n\t\tbackground-color: rgba(0, 0, 0, .5);\r\n\t}\r\n`;\r\n","import React from 'react';\r\nimport * as Styled from './styled';\r\nimport { connect } from 'react-redux';\r\n\r\nconst PageLoader = props => (\r\n\t\r\n\r\n\t\r\n)\r\n\r\n\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n return {\r\n darkmode: state.Layout.darkmode\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(PageLoader);\r\n","import styled, { css } from 'styled-components'\r\nimport { loadingPlaceholder } from '../../styled/KeyFrames';\r\n\r\nexport const Loader = props => css`\r\n\tbackground: #e9ebee;\r\n\tposition: relative;\r\n\toverflow: hidden;\r\n\r\n\t&::after {\r\n\t content: \"\";\r\n\t display: block;\r\n\t background-color: #DEDEDE;\r\n\t position: absolute;\r\n\t top: 0;\r\n\t bottom: 0;\r\n\t width: 100%;\r\n\t height: 100%;\r\n\t transform: translateX(0);\r\n\t animation: 1.5s ${loadingPlaceholder} ease-in-out infinite;\r\n\t }\r\n\r\n\t &.darkmode {\r\n\t \tbackground: #1B2B3C;\r\n\r\n\t \t&:after {\r\n\t \t\tbackground-color: #121a24;\r\n\t \t}\r\n\t }\r\n`;\r\n\r\n\r\nexport const LoaderCard = styled.div `\r\n\twidth:300px;\r\n\tfloat: left;\r\n\tborder: 1px solid #ddd;\r\n\tmargin-right: 10px;\r\n`;\r\n\r\n\r\nexport const LoaderImageLoading = styled.div `\r\n\t background: #e9ebee;\r\n height: 175px;\r\n\r\n position: relative;\r\n\t overflow: hidden;\r\n\t &::after {\r\n\t content: \"\";\r\n\t display: block;\r\n\t background-color: #dddfe2;\r\n\t position: absolute;\r\n\t top: 0;\r\n\t bottom: 0;\r\n\t width: 100%;\r\n\t height: 100%;\r\n\t transform: translateX(0);\r\n\t animation: 1.5s ${loadingPlaceholder} ease-in-out infinite;\r\n\t }\r\n`;\r\n\r\nexport const LoaderBars = styled.div `\r\n\t height: 85px;\r\n`;\r\n\r\nexport const LoaderBar = styled.div `\r\n\t background: #e9ebee;\r\n margin: 0 13px 13px;\r\n height: 19px;\r\n\r\n &:nth-of-type(1) {\r\n \twidth: 80%;\r\n \tmargin-top: 17px;\r\n }\r\n\r\n &:nth-of-type(2) {\r\n \twidth: 30%;\r\n }\r\n\r\n position: relative;\r\n\t overflow: hidden;\r\n\t &::after {\r\n\t content: \"\";\r\n\t display: block;\r\n\t background-color: #dddfe2;\r\n\t position: absolute;\r\n\t top: 0;\r\n\t bottom: 0;\r\n\t width: 100%;\r\n\t height: 100%;\r\n\t transform: translateX(0);\r\n\t animation: 1.5s ${loadingPlaceholder} ease-in-out infinite;\r\n\t }\r\n`;\r\n","import styled, { css } from 'styled-components'\r\nimport * as Variables from '../../../ThemeVariables';\r\n\r\n//heading\r\nconst headingStyle = `\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n`\r\nexport const Heading = styled.div`\r\n\tmargin-bottom: ${props => !props.marginBottom ? \"20px\" : props.marginBottom + 'px'};\r\n\r\n ${props => !props.positionBottom ? headingStyle : ''};\r\n\r\n\r\n\t${props => props.position ? 'float: ' + props.position + ';' : ''}\r\n\t${props => props.border ? \"border-bottom: 2px solid #e4e4e4;padding-bottom: 15px;\" : \"\"}\r\n`;\r\n\r\nexport const ListHeading = styled.div`\r\n\tmargin-bottom: 20px;\r\n @media(min-width: ${Variables.mxs}) {\r\n display: flex;\r\n justify-content: space-between;\r\n }\r\n`;\r\n\r\n\r\nexport const Title = styled.h2`\r\n\tfont-size: ${props => !props.small ? \"1.1em\" : \"0.8em\"};\r\n\ttext-align: left;\r\n\tcolor : ${Variables.headingColor.lightMode};\r\n\r\n\t&.darkmode {\r\n\t\tcolor : ${Variables.headingColor.darkMode};\r\n\t}\r\n`;\r\n\r\nexport const LinkContainer = styled.div`\r\n\tdisplay: inline-block;\r\n`;\r\n\r\nexport const UnderLinkContainer = styled.div`\r\n\tmargin-bottom: 30px;\r\n\t\r\n`;\r\n\r\n\r\nexport const Link = styled.a`\r\n\ttext-decoration: none;\r\n\tfont-size: 12px;\r\n\tcursor: pointer;\r\n &:not(:first-of-type) {\r\n margin-left: 16px;\r\n }\r\n\r\n\tcolor : ${Variables.headingColor.lightMode};\r\n\r\n\t&:after {\r\n\t\tcontent: '';\r\n\t\twidth: 0;\r\n\t\theight: 1px;\r\n\t\tbackground: ${Variables.headingColor.lightMode};\r\n\t\tposition: absolute;\r\n\t\tbottom: -5px;\r\n\t\tleft: 0;\r\n\t\ttransition: width .5s;\r\n\t}\r\n\r\n\t&.darkmode {\r\n\t\tcolor : ${Variables.headingColor.darkMode};\r\n\t\t&:after {\r\n\t\t\tbackground : ${Variables.headingColor.darkMode};\r\n\t\t}\r\n\t}\r\n\r\n\ttext-align: right;\r\n\r\n\t&:hover {\r\n\t\t&:after {\r\n\t\t\twidth: 100%;\r\n\t\t}\r\n\t}\r\n\r\n\t&.active-link {\r\n\t\t&:after {\r\n\t\t\twidth: 100%;\r\n\t\t}\r\n\t}\r\n`;\r\n","import styled from 'styled-components'\r\nimport { Loader } from '../styled';\r\nexport const TeamWrapper = styled.div`\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\tmargin-bottom: 5px;\r\n`;\r\n\r\nexport const Team = styled.div `\r\n\tbackground: #e9ebee;\r\n margin: 0 13px 13px 0;\r\n height: 19px;\r\n width: 100%;\r\n\r\n ${props => props.position === 'left' ? 'float: left' : 'float: right'};\r\n ${Loader}\r\n`;\r\n","import React from 'react';\r\nimport * as Styled from './styled';\r\n\r\n\r\nconst TeamLoader = props => (\r\n\t\r\n\t\t\r\n\t\r\n)\r\n\r\n\r\n\r\nexport default TeamLoader;\r\n","import styled from 'styled-components'\r\n\r\nexport const CheckboxWrapper = styled.div`\r\n\twidth: 45px;\r\n\theight: 25px;\r\n\tbackground: #1b2947;\r\n\tbackground: #8b0000;\r\n\ttransition: background .5s;\r\n\tborder-radius: 25px;\r\n\tcursor: pointer;\r\n\r\n\t&.active {\r\n\t\tbackground: #007e00;\r\n\t}\r\n\tinput {\r\n\t\topacity: 0;\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t\tposition: absolute;\r\n\t\tleft: 0;\r\n\t\ttop: 0;\r\n\t\tcursor: pointer;\r\n\t}\r\n\r\n\tmargin-bottom: 25px;\r\n`;\r\n\r\nexport const Checkbox = styled.div`\r\n\tdisplay: grid;\r\n\tgrid-template-columns: repeat(2, 1fr);\r\n`;\r\n\r\nexport const Label = styled.label`\r\n\tline-height: 25px;\r\n`;\r\n\r\nexport const CheckboxCircle = styled.div`\r\n\twidth: 23px;\r\n\theight: 23px;\r\n\tborder-radius: 100%;\r\n\tbackground: white;\r\n\tposition: absolute;\r\n\ttop: 1px;\r\n\tleft: 1px;\r\n\ttransition: left .3s;\r\n\tpointer-events: none;\r\n\r\n\t&.active {\r\n\t\tleft: calc(100% - 24px);\r\n\t}\r\n\r\n`;\r\n","import React from 'react';\r\nimport * as Styled from './styled';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst Checkbox = props => (\r\n\t\r\n\t\t{props.label}\r\n\t\t\r\n\t\t\t \r\n\t\t\t\r\n\r\n\t\t\r\n\t\r\n)\r\n\r\nCheckbox.propTypes = {\r\n\tonClick : PropTypes.func,\r\n\tvalue : PropTypes.bool,\r\n\tlabel : PropTypes.string\r\n}\r\n\r\nexport default Checkbox;\r\n","const actions = {\r\n\tGET_NEWS : 'GET_NEWS',\r\n\tSET_NEWS : 'SET_NEWS',\r\n\r\n\tgetNews : ( payload ) => ({\r\n\t\ttype : actions.GET_NEWS,\r\n\t\tpayload : payload\r\n\t})\r\n};\r\n\r\nexport default actions;\r\n","const actions = {\r\n\tGET_BLOGS : 'GET_BLOGS',\r\n\tSET_BLOGS : 'SET_BLOGS',\r\n\t\tPOST_BLOG : 'POST_BLOG',\r\n\tpostBlog : ( payload ) => ({\r\n\ttype : actions.POST_BLOG,\r\n\tpayload : payload\r\n}),\r\n\tgetBlogs : ( payload ) => ({\r\n\t\ttype : actions.GET_BLOGS,\r\n\t\tpayload : payload\r\n\t})\r\n};\r\n\r\nexport default actions;\r\n","const actions = {\r\n\tGET_TILES : 'GET_TILES',\r\n\tSET_TILES : 'SET_TILES',\r\n\tgetTiles: (payload) => ({ \r\n\t\ttype: actions.GET_TILES,\r\n\t\tpayload : payload\r\n\t}),\t\r\n};\r\n\r\nexport default actions;\r\n","const translation = {\r\n 'en': {\r\n locale: 'en',\r\n messages: {\r\n hello: 'Hi {name}',\r\n myProfile: 'My profile',\r\n vacationDays: 'Vacation days',\r\n editSettings: 'Change settings',\r\n openTutorial: 'Start tutorial',\r\n colorSetting: 'Dark mode',\r\n colorExplanation: 'GO has a dark mode for using in dark environments',\r\n autoDarkMode: 'Change mode based on sunset or sunrise',\r\n ownAppTile: 'Own app tiles',\r\n editAppTile: 'Edit tiles',\r\n logout: 'Logout',\r\n version: 'version',\r\n startMenu: 'START',\r\n helpMenu: 'HELP',\r\n storeMenu: 'STORE',\r\n selfMenu: 'SELF',\r\n tasks: 'Tasks',\r\n calendar: 'Calendar',\r\n appointment: 'Appointments',\r\n teams: 'Teams',\r\n tickets: 'Tickets',\r\n apps: 'Apps',\r\n settings: 'Settings',\r\n startLocalApps: 'Start local apps when possible',\r\n startAppsInNewWindow: 'Open apps in a browser tab',\r\n useOfficeWizard: 'Use Office wizard',\r\n showScrollbars: 'Show scrollbars',\r\n openAppsExistingWindow: 'Open apps in an existing browser tab',\r\n more: 'more',\r\n add: 'add',\r\n edit: 'edit',\r\n recent: 'recent',\r\n shared: 'shared',\r\n mine: 'mine',\r\n noItemsFound: 'no items',\r\n news: 'News',\r\n createNews: 'Create news message',\r\n createEvent: 'Create event',\r\n today: 'Today',\r\n tomorrow: 'Tomorrow',\r\n upcoming: 'Upcoming',\r\n earlierThisWeek: 'Earlier this week',\r\n open: 'Open',\r\n noDate: 'No date',\r\n openToDo: 'Open to-do',\r\n createTask: 'create task',\r\n createAppointment: 'create appointment',\r\n noAppointments: 'No upcoming appointments',\r\n events: 'Events',\r\n birthdays: 'Birthdays',\r\n noBirthdays: \"No upcoming birthdays\",\r\n hisBirthday: \"{when} it's {name} birthday\",\r\n congratulations: \"Congratulations\",\r\n openOneDrive: \"open onedrive\",\r\n documents: \"Documents\",\r\n kindOfDocument: \"What kind of document\",\r\n createBlog: 'Create blog',\r\n openOriginal: \"open original\",\r\n searchingFor: 'I am searching for..',\r\n search: \"Search\",\r\n whatToSearch: \"What do you want to search?\",\r\n all: 'all',\r\n persons: 'persons',\r\n files: 'files',\r\n colleagues: \"colleagues\",\r\n emails: \"emails\",\r\n createTicket: \"create ticket\",\r\n myTickets: \"my tickets\",\r\n itNews: \"IT news\",\r\n noLink: \"no link to servicedesk\",\r\n new: \"create\",\r\n my: \"my\",\r\n ticket: \"ticket\",\r\n tickets: \"tickets\",\r\n IT: \"IT\",\r\n theModernServiceDesk: \"The modern service desk is a new way te be helped. Tell GoGo your problem or question and he will help you further. You can also immediately create a new notification yourself.\",\r\n wantToUseModernServiceDesk: \"Do you want to use our modern service desk?\",\r\n noCustomer: 'Your IT environment is not yet registered with us. This is necessary to be able to use our modern service desk options. Feel free contact us to make that happen.',\r\n wantToKnowMore: \"Would you like to know more about the Avantage service desk? Then read\",\r\n thisBlog: \"this blog\",\r\n eLearning: \"E-Learning\",\r\n knowledgeBase: \"knowledgebase\",\r\n tips: \"tips\",\r\n tipsNTricks: \"Tips and tricks\",\r\n help: \"help\",\r\n whenCustomer: \"As soon as your environment has been added, you can use our modern service desk options. Notifications submitted via the chatbot or that you have submitted directly yourself are displayed here and you can view their status.\",\r\n createATicketHere: \"Below you can immediately make a report that will be picked up by the service desk. When you have provided a description of your question or problem, your report will be registered immediately.\",\r\n didYouKnowChatbot: \"Do you know that in GO you can also ask your question to GoGo? The easy chatbot immediately searches for answers in the knowledge bases and (if necessary) creates a report for you at our service desk.\",\r\n current: \"current\",\r\n view: \"View your\",\r\n findProblemsHere: \"Problems, questions or incidents that have been forwarded to the service desk can be found here.\",\r\n noActiveTickets: \"You currently have no active notifications\",\r\n createANewTicket: \"create a new ticket\",\r\n noITNews: \"At the moment there is no news about your IT environment\",\r\n howCanIHelpYou: \"How can I help you?\",\r\n GoGo: \"GoGo, your easy assistance\",\r\n hi: \"Hi\",\r\n alwaysOnline: \"always online\",\r\n whatDoYouWantToKnow: \"What do you want to know?\",\r\n aboutWhatDoYouWantToKnow: \"or about what?\",\r\n answer: \"Answer\",\r\n example: \"Example\",\r\n setPreferences: \"Set your e-learning preferences\",\r\n thenWeWillGetYourLearnings: \"so we can load some relevant elearingspaths for you\",\r\n here: \"here\",\r\n searchLearning: \"Search for learningpaths\",\r\n gatherLearningsForYou: \"We would like to collect relevant e-learning for you. Indicate your preferences by selecting your role(s), products and your level.\",\r\n whichRoles: \"What roles do you fulfill within your organization?\",\r\n whichProducts: \"Which products or services do you want to learn about?\",\r\n previous: \"previous\",\r\n next: \"next\",\r\n save: \"save\",\r\n browseLearnings: \"browse through learningpaths\",\r\n learningsFound: \"learnings found\",\r\n searchLearnings: \"search on title, role or product\",\r\n or: \"or\",\r\n didYouKnow: \"Did you know that you can also ask your question, request or problem to GoGo? This easy assistance immediately searches for answers in the knowledge bases for you and creates a notification for you if this is necessary.\",\r\n createTicketHere: \"You can create a report below that will be picked up by the service desk. Enter a description and your report will be registered.\",\r\n active: \"active\",\r\n whatToReport: \"What do you want to report?\",\r\n yesCreateTicket: \"Yes, create a notification\",\r\n addAction: \"Add action\",\r\n addAnActionMessage: \"Add an action, status update, question or other message to your notification.\",\r\n busySending: \"Busy sending..\",\r\n busy: \"Busy..\",\r\n send: \"send\",\r\n whatsTheSubject: \"What is the subject?\",\r\n selectFromBelow: \"Or select one from below\",\r\n thanksKeepInTouch: \"Thank you for your message! You will hear from us as soon as possible.\",\r\n sorryWhatIsYourPhone: \"Sorry! We notice that you are not satisfied, we would like to contact you by phone!\",\r\n correctNumber: \"Is this your phonenumber?\",\r\n mayWeContactYou: \"What number can we reach you on?\",\r\n yesCallMe: \"Yes, call me!\",\r\n isAddedToEnvironment: \"has been added to your environment\",\r\n needAppPermission: \"{name} requires approval from your manager, the request has been forwarded.\",\r\n searchAvailableApps: \"Search in available apps\",\r\n found: \"found\",\r\n youGot: \"You got\",\r\n localApps: \"local apps\",\r\n smartTilesMessage: \"smart tiles and app store
With your own GO environment it is possible to use a real app store. All apps are automatically installed on your workplace and will then be shown as a smart tile on GO. No more need to bring your machine to the IT department!\",\r\n notConnected: \"not connected\",\r\n addNewTile: \"Add new tile\",\r\n editTile: \"Edit tile\",\r\n insertUrl: \"insert new url\",\r\n uploadIcon: \"upload icon\",\r\n selectApplication: \"Select application\",\r\n removeAsFavorite: \"remove as favorite\",\r\n markAsFavorite: \"mark as favorite\",\r\n own: \"own\",\r\n tiles: \"tiles\",\r\n tile: \"tile\",\r\n local: \"local\",\r\n name: \"name\",\r\n applications: \"Applications\",\r\n language: \"Language\",\r\n choose: 'Choose',\r\n addOwnEvent: \"Add own event\",\r\n noPlannedItems: \"nothing planned\",\r\n wizardHomeHi: \"Welcome to GO, the modern workplace! GO is your starting point where you have everything at your fingertips. Your apps, documents, business information and more. GO makes it easy to be productive anytime, anywhere, instantly. \",\r\n wizardHomeGoGo: \"Do you have a question about video conferencing in Teams or is your laptop not working? Ask this to GoGo, the easy help! He searches the knowledge bases for you and calls in the service desk when necessary.\",\r\n hasOfficeLocalTitle: \"Do you have Microsoft Office installed locally?\",\r\n hasOfficeLocal: \"When you have installed Office on your computer or laptop, it is possible to open your documents from GO in the desktop app. Do you want to open your documents in the desktop app?\",\r\n wantOfficeWizardTitle: \"Do you want to use the smart Office Wizard?\",\r\n wantOfficeWizard: \"The smart wizard makes it easy to save new documents in the right place. Give the document a name and select a Team. \",\r\n inTabOrPopupTitle: \"Open in a new tab or popup?\",\r\n inTabOrPopup: \"Applications that are not installed on your PC open in a new browser tab or in a separate popup? The popup choice provides a different workplace experience.\",\r\n newTab: \"New tab\",\r\n popup: \"Popup\",\r\n shareBirthdayTitle: \"Do you also want to share your birthday with your colleagues?\",\r\n shareBirthday: 'If you\\'re okay with us showing your birthday to your colleagues, then you can fill it in yourself via your office profile page. Just make sure the option \\'Everyone can see this\\' is selected.
It may take one day for your birthday to appear in the list',\r\n yes: \"yes\",\r\n no: \"no\",\r\n people: \"colleagues\",\r\n delete: \"delete\",\r\n important: 'Important',\r\n markAsRead: 'mark all as read',\r\n intranet: 'Intranet',\r\n subject: 'subject',\r\n refresh: 'refresh',\r\n refreshedAgo: 'Refreshed {timeAgo}',\r\n completed: 'Completed',\r\n move: 'move',\r\n self: 'Self',\r\n rights: 'Rights',\r\n change: 'Change',\r\n noRequestFound: 'No requests found',\r\n user: \"User\",\r\n workplace: \"Workplace\",\r\n requestWorkplace: \"Request workplace\",\r\n remove: \"remove\",\r\n requestNewUser: \"Request a new user\",\r\n removeUser: \"Remove user\",\r\n userManagement: \"User management\",\r\n requestInformation: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat\",\r\n requestType: \"Request type\",\r\n voornaam: \"First name\",\r\n tussenvoegsel: \"Suffix\",\r\n achternaam: \"Last name\",\r\n telefoonnummer: \"Phonenumber\",\r\n functie: \"Function\",\r\n afdeling: \"Department\",\r\n omschrijving: \"Description\",\r\n datumInDienst: \"Date employed\",\r\n datumUitDienst: \"Datum out of service\",\r\n youSure:\"Are you sure?\",\r\n addUserFormInfo: \"Use the form below to request a new colleague at the Avantage Service Desk. In addition, you have insight into the call number and you can follow the contents of the call if you click on the call number. We advise you to report a new colleague as early as possible so that we can properly plan and carry out the work so that we can provide you with all information in a timely manner.\",\r\n removeUserFormInfo: \"With the form below you can request the removal of a colleague at the Avantage Service Desk. In addition, you have insight into the call number and you can follow the contents of the call if you click on the call number. We advise you to report a colleague on leave as early as possible so that we can properly plan and carry out the work so that the colleague no longer has access to the environment at the right time.\",\r\n removeRightsFormInfo: \"With the form below you can request changes to rights for a colleague at the Avantage Service Desk. In addition, you have insight into the call number and you can follow the contents of the call if you click on the call number. We aim to carry out the work within 3 working days.\",\r\n addOffersFormInfo: \"With the form below you can request a quote from our office staff. Specify what you want and what the expectations are for which you want to receive a quote. The more information you provide, the better we can provide you with a customized quote. If there are any questions, we will contact you. We aim to deliver the quote to you within 7 working days.\",\r\n typeLicentie: \"Type of license\",\r\n activateDefender: \"Activate defender\",\r\n officeBackup: \"Office365 backup\",\r\n addToGroups: \"Add to Office365 group(s)\",\r\n createSharedMailbox: \"Create shared mailbox\",\r\n linkMailbox: \"Link shared mailbox to\",\r\n forwardMailTo: \"Forward mail to\",\r\n openPopup: \"Open in popup\",\r\n connectionErrorLiquitCloud: \"An error occurred when logging in to Liquit Cloud with SSO, token was empty\", /* was 'error connecting to Liquit cloud'*/\r\n connectionErrorStartingLiquit: \"An error occurred while starting Liquit\",\r\n isAddedToEnvironment: \"has been added to your environment\",\r\n liquitFailedToStart: \"The application failed to start\",\r\n notifierRender: \"Rendering: \",\r\n commandHubInvokeGoLoginError: \"Error occurred while starting the connection: \", /*Error while starting connection*/\r\n noWidgetsPresent: \"No widgets have been created yet!\",\r\n leftColumnIsEmpty: \"Left column needs to have items, please add a widget to the layout\",\r\n MoveTiles: \"Move tiles\",\r\n explanation: \"explanation\",\r\n close: \"close\",\r\n You: \"You\",\r\n enterDescription: \"describe your issue here\",\r\n liquitSSOError: \"Liquit SSO login failed, token was empty\",\r\n }\r\n },\r\n 'nl': {\r\n locale: 'nl',\r\n messages: {\r\n hello: 'hallo',\r\n myProfile: 'Mijn profiel',\r\n vacationDays: 'Vakantiedagen',\r\n editSettings: 'Instellingen bewerken',\r\n openTutorial: 'Open tutorial',\r\n colorSetting: 'Kleurstelling',\r\n colorExplanation: 'GO komt standaard in een licht jasje. Selecteer de rechter, donkere variant om GO dark te gebruiken.',\r\n autoDarkMode: 'Met zonsopkomst en -ondergang automatisch kleur veranderen',\r\n ownAppTile: 'Eigen app tegels',\r\n editAppTile: 'Pas tegels aan',\r\n logout: 'Uitloggen',\r\n version: 'versie',\r\n startMenu: 'START',\r\n helpMenu: 'HULP',\r\n storeMenu: 'STORE',\r\n selfMenu: 'ZELF',\r\n tasks: 'Taken',\r\n calendar: 'Kalender',\r\n appointment: 'Afspraken',\r\n teams: 'Teams',\r\n tickets: 'Meldingen',\r\n apps: 'Apps',\r\n settings: 'Instellingen',\r\n startLocalApps: 'Lokale applicaties opstarten wanneer mogelijk',\r\n startAppsInNewWindow: 'Apps starten in nieuw tabblad',\r\n useOfficeWizard: 'Gebruik de Office wizard',\r\n showScrollbars: 'Toon scrollbars',\r\n openAppsExistingWindow: 'Gebruik bestaand tabblad bij opstarten app',\r\n more: 'meer',\r\n recent: 'recent',\r\n add: 'toevoegen',\r\n edit: 'bewerken',\r\n shared: 'gedeeld',\r\n mine: 'mijn',\r\n noItemsFound: 'geen items',\r\n news: 'Nieuws',\r\n createNews: 'maak een nieuwsbericht',\r\n createEvent: 'maak een event',\r\n today: 'Vandaag',\r\n tomorrow: 'Morgen',\r\n upcoming: 'Aankomend',\r\n earlierThisWeek: 'Eerder deze week',\r\n open: 'Openstaand',\r\n noDate: 'Geen datum',\r\n openToDo: 'Open to-do',\r\n createTask: 'Maak een taak',\r\n createAppointment: 'maak een afspraak',\r\n noAppointments: 'Je hebt vandaag en morgen geen afspraken',\r\n events: 'Evenementen',\r\n birthdays: 'Verjaardagen',\r\n noBirthdays: \"Er zijn geen jarigen vandaag of morgen\",\r\n hisBirthday: \"{when} is {name} jarig\",\r\n congratulations: \"Gefeliciteerd\",\r\n openOneDrive: \"open onedrive\",\r\n documents: \"Documenten\",\r\n kindOfDocument: \"Wat voor document\",\r\n createBlog: 'Maak een blog',\r\n openOriginal: \"open origineel\",\r\n searchingFor: 'Ik ben op zoek naar..',\r\n search: \"Zoeken\",\r\n whatToSearch: \"Wat wil je zoeken?\",\r\n all: 'alles',\r\n persons: 'personen',\r\n files: 'bestanden',\r\n colleagues: \"collega's\",\r\n emails: \"emails\",\r\n createTicket: \"maak melding\",\r\n myTickets: \"mijn meldingen\",\r\n itNews: \"IT nieuws\",\r\n noLink: \"nog geen koppeling\",\r\n new: \"nieuw\",\r\n my: \"mijn\",\r\n ticket: \"melding\",\r\n tickets: \"meldingen\",\r\n IT: \"IT\",\r\n theModernServiceDesk: \"De moderne servicedesk is een nieuwe manier om geholpen te worden. Vertel aan GoGo je probleem of vraag en hij helpt je verder. Ook kun je direct een nieuwe melding zelf aanmaken.\",\r\n wantToUseModernServiceDesk: \"Wil je gebruiken maken van onze moderne servicedesk?\",\r\n noCustomer: 'Jouw IT-omgeving is nog niet bij ons geregistreerd. Dat is wel nodig om gebruik te kunnen maken van onze moderne servicedesk mogelijkheden. Neem gerust contact met ons op om dat te realiseren.',\r\n wantToKnowMore: \"Wil je meer weten over de servicedesk van Avantage? Lees dan\",\r\n thisBlog: \"deze blog\",\r\n eLearning: \"E-Learning\",\r\n knowledgeBase: \"kennisbank\",\r\n tips: \"tips\",\r\n tipsNTricks: \"Tips 'n tricks\",\r\n help: \"hulp\",\r\n whenCustomer: \"Zodra jouw omgeving is toegevoegd, kan je gebruik maken van onze moderne servicedesk mogelijkheden. Meldingen die via de chatbot of die je zelf rechtstreeks hebt ingediend, worden hier weergeven en kun je de status daarvan inzien.\",\r\n createATicketHere: \"Hieronder kun je direct een melding maken die door de servicedesk wordt opgepakt. Wanneer je een omschrijving van jouw vraag of probleem hebt gegeven, wordt jouw melding direct geregistreerd.\",\r\n didYouKnowChatbot: \"Weet je dat je in GO jouw vraag ook aan de GoGo kunt stellen? Deze eenvoudige chatbot zoekt gelijk naar antwoorden in de kennisbanken en maakt (als dat nodig is) een melding bij onze servicedesk voor je aan.\",\r\n current: \"huidige\",\r\n view: \"Bekijk hier je\",\r\n findProblemsHere: \"Problemen, vragen of incidenten die zijn doorgezet naar de servicedesk, vindt je hier weer terug.\",\r\n noActiveTickets: \"Op dit moment heb je geen actieve meldingen\",\r\n createANewTicket: \"maak een nieuwe melding aan\",\r\n noITNews: \"Op dit moment is er geen nieuws over je IT omgeving\",\r\n howCanIHelpYou: \"Hoe kan ik je helpen?\",\r\n GoGo: \"GoGo, de eenvoudige hulp \",\r\n hi: \"Hi\",\r\n alwaysOnline: \"altijd online\",\r\n whatDoYouWantToKnow: \"Wat wil je weten?\",\r\n aboutWhatDoYouWantToKnow: \"Waarover wil je wat weten?\",\r\n answer: \"Antwoord\",\r\n example: \"Voorbeeld\",\r\n setPreferences: \"Geef je voorkeuren\",\r\n thenWeWillGetYourLearnings: \"dan halen we relevante leerpaden van Microsoft voor je op!\",\r\n here: \"hier\",\r\n searchLearning: \"Zoek op leerpaden\",\r\n gatherLearningsForYou: \"We willen graag relevante e-learnings voor je verzamelen. Geef je voorkeuren aan door je rol(len), producten en je niveau te selecteren.\",\r\n whichRoles: \"Welke rollen vervul je binnen jouw organisatie?\",\r\n whichProducts: \"Over welke producten of diensten wil je iets leren?\",\r\n previous: \"vorige\",\r\n next: \"volgende\",\r\n save: \"opslaan\",\r\n browseLearnings: \"blader door alle leerpaden\",\r\n learningsFound: \"leerpaden gevonden\",\r\n searchLearnings: \"zoek op titel, rollen of producten\",\r\n or: \"of\",\r\n didYouKnow: \"Wist je dat je ook je vraag, verzoek of probleem aan GoGo kan stellen? Deze eenvoudige hulp zoekt gelijk voor je naar antwoorden in de kennisbanken en maakt een melding voor je aan als dit nodig is.\",\r\n createTicketHere: \"Je kunt hieronder een melding aanmaken die door de servicedesk wordt opgepakt. Geef een omschrijving op en je melding wordt geregistreerd.\",\r\n active: \"active\",\r\n whatToReport: \"Wat wil je melden?\",\r\n yesCreateTicket: \"Ja, maak een melding aan\",\r\n addAction: \"Voeg een actie toe\",\r\n addAnActionMessage: \"Voeg een actie, status update, vraag of een ander bericht toe aan je melding.\",\r\n busySending: \"Bezig met versturen..\",\r\n busy: \"Bezig..\",\r\n send: \"versturen\",\r\n whatsTheSubject: \"Wat is het onderwerp?\",\r\n selectFromBelow: \"Of gebruik één van onderstaande\",\r\n thanksKeepInTouch: \"Bedankt voor je melding! Je hoort zo snel mogelijk van ons.\",\r\n sorryWhatIsYourPhone: \"Sorry! We merken dat je niet tevreden bent, graag willen we je telefonisch benaderen!\",\r\n correctNumber: \"Klopt dit nummer?\",\r\n mayWeContactYou: \"Op welk nummer mogen we je benaderen?\",\r\n yesCallMe: \"Ja, bel mij!\",\r\n isAddedToEnvironment: \"is toegevoegd aan je omgeving\",\r\n needAppPermission: \"Voor {name} is goedkeuring van je manager nodig, de aanvraag is doorgestuurd.\",\r\n searchAvailableApps: \"Zoek in beschikbare apps\",\r\n found: \"gevonden\",\r\n youGot: \"Je hebt\",\r\n localApps: \"lokale apps\",\r\n smartTilesMessage: \"slimme tegels en app store
Met een eigen GO omgeving is het mogelijk om een echte app store te gebruiken. Alle apps worden automatisch op je werkplek geinstalleerd en zal dan als een slimme tegel op GO worden getoond. Niet meer nodig om je machine langs de IT afdeling te brengen!\",\r\n notConnected: \"niet verbonden\",\r\n addNewTile: \"Voeg nieuwe tegel toe\",\r\n editTile: \"Pas tegel aan\",\r\n insertUrl: \"voer een nieuwe url in\",\r\n uploadIcon: \"upload icoon\",\r\n selectApplication: \"Selecteer applicatie\",\r\n removeAsFavorite: \"Verwijder als favoriet\",\r\n markAsFavorite: \"Markeer als favoriet\",\r\n own: \"eigen\",\r\n tiles: \"tegels\",\r\n tile: \"tegel\",\r\n local: \"lokaal\",\r\n name: \"naam\",\r\n applications: \"Applicaties\",\r\n language: \"Taal\",\r\n choose: 'Kies',\r\n addOwnEvent: \"Eigen event toevoegen\",\r\n noPlannedItems: \"niks gepland\",\r\n wizardHomeHi: \"Welkom op GO, de moderne werkplek! GO is je startplek waarop je direct alles in handbereik hebt. Je apps, documenten, bedrijfsinformatie en meer. Met GO wordt het eenvoudig om altijd, overal en direct productief te zijn. \",\r\n wizardHomeGoGo: \"Heb je een vraag over videovergaderen in Teams of werkt je laptop niet? Stel deze aan GoGo, de eenvoudige hulp! Hij zoekt voor je in de kennisbanken en schakelt wanneer nodig de servicedesk in.\",\r\n hasOfficeLocalTitle: \"Heb je Microsoft Office lokaal geïnstalleerd?\",\r\n hasOfficeLocal: \"Wanneer je Office op je computer of laptop hebt geïnstalleerd, is het mogelijk om je documenten vanuit GO in de desktop-app te openen. Wil je jouw documenten in de desktop-app openen?\",\r\n wantOfficeWizardTitle: \"Wil je de slimme Office Wizard gebruiken?\",\r\n wantOfficeWizard: \"Met deze slimme wizard wordt het eenvoudig om nieuwe documenten op de juiste plek op te slaan. Geef het document een naam en selecteer een Team. \",\r\n inTabOrPopupTitle: \"Openen in een nieuw tabblad of popup?\",\r\n inTabOrPopup: \"Applicaties die niet op je PC geïnstalleerd staan openen in een nieuw browser tabblad of in een aparte popup? De popup keuze zorgt voor een andere werkplek ervaring.\",\r\n newTab: \"Nieuw tabblad\",\r\n popup: \"Popup\",\r\n shareBirthdayTitle: \"Wil je ook je verjaardag met je collega's delen?\",\r\n shareBirthday: 'Als je het oké vindt dat we je verjaardag laten zien aan je collega\\'s, dan kun je deze zelf invullen via je office profiel pagina. Zorg er wel voor dat de optie \\'Iedereen kan dit zien\\' is geselecteerd.
Het kan één dag duren voordat je verjaardag zichtbaar wordt in de lijst',\r\n yes: \"ja\",\r\n no: \"nee\",\r\n people: \"collega's\",\r\n delete: \"verwijder\",\r\n important: 'Belangrijk',\r\n markAsRead: 'markeer alles gelezen',\r\n intranet: 'Intranet',\r\n subject: 'onderwerp',\r\n refresh: 'ververs',\r\n refreshedAgo: '{timeAgo} ververst',\r\n completed: 'Afgerond',\r\n move: 'verplaatsen',\r\n self: 'Zelf',\r\n rights: 'Rechten',\r\n change: 'Aanpassen',\r\n noRequestFound: 'Geen aanvragen gevonden',\r\n user: \"Gebruiker\",\r\n workplace: \"Werkplek\",\r\n requestWorkplace: \"Werkplek aanvragen\",\r\n remove: \"verwijderen\",\r\n requestNewUser: \"Vraag een nieuwe gebruiker aan\",\r\n removeUser: \"Verwijder gebruiker\",\r\n userManagement: \"Gebruikersbeheer\",\r\n requestInformation: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat\",\r\n requestType: \"Aanvraag type\",\r\n voornaam: \"Voornaam\",\r\n tussenvoegsel: \"Tussenvoegsel\",\r\n achternaam: \"Achternaam\",\r\n telefoonnummer: \"Telefoonnummer\",\r\n functie: \"Functie\",\r\n afdeling: \"Afdeling\",\r\n omschrijving: \"Omschrijving\",\r\n datumInDienst: \"Datum in dienst\",\r\n datumUitDienst: \"Datum uit dienst\",\r\n youSure:\"Weet je het zeker?\",\r\n addUserFormInfo: \"Met het onderstaande formulier kunt u een nieuwe collega aanvragen bij de Servicedesk van Avantage. Daarnaast heeft u inzicht in het callnummer en kunt u de inhoudt van de call volgen als u op het callnummer klikt. Wij adviseren u zo vroeg mogelijk melding te maken van een nieuwe collega zodat wij de werkzaamheden netjes kunnen plannen en uitvoeren zodat we u tijdig van alle informatie kunnen voorzien.\",\r\n removeUserFormInfo: \"Met het onderstaande formulier kunt u een collega uitdienst melden bij de Servicedesk van Avantage. Daarnaast heeft u inzicht in het callnummer en kunt u de inhoudt van de call volgen als u op het callnummer klikt. Wij adviseren u zo vroeg mogelijk melding te maken van een collega uitdienst zodat wij de werkzaamheden netjes kunnen plannen en uitvoeren zodat de collega op het juiste moment geen toegang meer heeft op de omgeving.\",\r\n addRightsFormInfo: \"Met het onderstaande formulier kunt u aanpassingen op rechten voor een collega aanvragen bij de Servicedesk van Avantage. Daarnaast heeft u inzicht in het callnummer en kunt u de inhoudt van de call volgen als u op het callnummer klikt. Wij streven ernaar de werkzaamheden binnen 3 werkdagen uit te voeren.\",\r\n addOffersFormInfo: \"Met het onderstaande formulier kunt u een offerte aanvraag doen bij onze binnendienst. Specificeer wat u wenst en wat de verwachtingen zijn waarvoor u een offerte wilt ontvangen. Hoe meer informatie hoe beter wij kunnen zorgen voor een offerte op maat. Mochten er nog vragen zijn nemen wij contact met u op. Wij streven er naar om binnen 7 werkdagen de offerte bij u af te leveren.\",\r\n typeLicentie: \"Type licentie\",\r\n activateDefender: \"Activeer defender\",\r\n officeBackup: \"Office365 backup\",\r\n addToGroups: \"Toevoegen aan Office365 groepen\",\r\n createSharedMailbox: \"Aanmaken gedeelde mailbox\",\r\n linkMailbox: \"Gedeelde mailbox koppelen aan\",\r\n forwardMailTo: \"Forward mail naar\",\r\n openPopup: \"Open in een popup\",\r\n liquitSSOError: \"Liquit SSO inloggen is niet gelukt, token was leeg\",\r\n connectionErrorLiquitCloud: \"Er is een fout opgetreden bij het verbinden met Liquit Cloud\",\r\n connectionErrorStartingLiquit: \"Er is een fout opgetreden bij het opstarten van Liquit\",\r\n isAddedToEnvironment: \"is toegevoegd aan je omgeving\",\r\n liquitFailedToStart: \"De applicatie kon niet opstarten\",\r\n notifierRender: \"Rendering: \",\r\n commandHubInvokeGoLoginError: \"Fout tijdens het starten van de verbinding: \", /*Error while starting connection*/\r\n noWidgetsPresent: \"Er zijn nog geen widgets aangemaakt!\",\r\n leftColumnIsEmpty: \"Linkerkolom moet gevuld zijn, voeg alstublieft een widget toe aan de indeling\",\r\n MoveTiles: \"Beweeg tegels\",\r\n explanation: \"uitleg\",\r\n close: \"sluiten\",\r\n You: \"Jij\",\r\n enterDescription: \"beschrijf hier jouw melding\"\r\n }\r\n }\r\n}\r\n\r\nexport default translation;\r\n","import styled from 'styled-components';\r\nimport Box from '../../../styled/Box';\r\n\r\nexport const BirthdayItem = styled(Box)`\r\n\tpadding: 15px;\r\n\r\n`;\r\n\r\nexport const Wrapper = styled.div`\r\n\t${props => props.flex ? 'display: flex;align-items: center;' : 'display: block; text-align: center;'}\r\n\r\n`;\r\n\r\nexport const Icon = styled.img`\r\n\twidth: 76px;\r\n\theight: 76px;\r\n\tborder-radius: 50%;\r\n`;\r\n\r\nexport const Text = styled.span`\r\n\tline-height: 24px;\r\n\tfont-size: 12px;\r\n\r\n\t${props => props.fullWidth ? 'width: 100%;display: block;' : 'margin-left: 20px;'}\r\n`;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport * as Styled from './styled';\r\nimport { connect } from 'react-redux';\r\nimport { withTranslate } from 'react-redux-multilingual';\r\n\r\nconst BirthdayItem = props => (\r\n \r\n \r\n {props.none ? null : }\r\n {props.none\r\n ?\r\n {props.translate(\"noBirthdays\")}.\r\n :\r\n props.small\r\n ?\r\n {props.name} {props.when}\r\n :\r\n \r\n {props.translate(\"hisBirthday\", { when: props.when, name: props.name })}. {props.translate('congratulations')}!\r\n \r\n }\r\n\r\n \r\n \r\n)\r\n\r\nBirthdayItem.propTypes = {\r\n name: PropTypes.string,\r\n icon: PropTypes.string,\r\n none: PropTypes.bool,\r\n popup: PropTypes.bool,\r\n demo: PropTypes.bool\r\n}\r\n\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n return {\r\n darkmode: state.Layout.darkmode\r\n };\r\n};\r\n\r\nexport default withTranslate(connect(mapStateToProps)(BirthdayItem));\r\n","import styled from 'styled-components'\r\n\r\nimport * as Variables from '../../../ThemeVariables';\r\n\r\nexport const Button = styled.button`\r\n\tcolor: white;\r\n\tbackground: ${Variables.mainColor};\r\n\tfont-weight: 600;\r\n\ttext-align: center;\r\n\tline-height: 22px;\r\n\tpadding: 0 10px;\r\n\tborder-radius: 25px;\r\n\tdisplay: inline-block;\r\n\tcursor: pointer;\r\n\tfont-size: 14px;\r\n\tborder: 2px solid ${Variables.mainColor};\r\n\r\n ${props => props.position === 'right' ? 'float: right; margin-left: 10px;' : ''};\r\n\r\n\ttransition: color .5s, background .5s;\r\n\t&:hover {\r\n\t\tcolor: black;\r\n\t\tbackground: white;\r\n\r\n\t\tb { \r\n\t\t\tdisplay:inline;\r\n\t\t} \r\n\t}\r\n\r\n\t&:focus {\r\n\t\toutline: none;\r\n\t}\r\n\r\n\tb { \r\n\t\tdisplay:none;\r\n\t} \r\n`;","import React from 'react';\r\nimport * as Styled from './styled';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst Button = props => (\r\n \r\n\t\t{ props.text } \r\n\t\r\n)\r\n\r\nButton.propTypes = {\r\n position: PropTypes.string,\r\n\tonClick : PropTypes.func,\r\n text: PropTypes.string,\r\n color: PropTypes.string\r\n}\r\n\r\nexport default Button;","export default __webpack_public_path__ + \"static/media/dark.49a45567.svg\";","export default __webpack_public_path__ + \"static/media/light.351c5a19.svg\";","\r\nimport { keyframes } from 'styled-components';\r\n \r\nexport const hoverBob = keyframes`\r\n\r\n\t0% {\r\n\t\ttransform: translateY(-8px);\r\n\t}\r\n\t50% {\r\n\t\ttransform: translateY(-4px);\r\n\t}\r\n\t100% {\r\n\t\ttransform: translateY(-8px);\r\n\t}\r\n\r\n`\r\nexport const hoverBobFloat = keyframes`\r\n\t100% {\r\n\t\ttransform: translateY(-8px);\r\n\t}\r\n`;\r\n\r\n\r\nexport const loadingPlaceholder = keyframes`\r\n 0% {\r\n transform: translateX(-100%);\r\n }\r\n 100% {\r\n transform: translateX(100%);\r\n }\r\n\r\n`;","const actions = {\r\n\tCLEAR : 'CLEAR',\r\n\t\r\n\tclear: () => ({\r\n\t\ttype: actions.CLEAR\r\n\t}),\r\n\r\n};\r\n\r\nexport default actions;\r\n","import styled from 'styled-components'\r\nimport * as Variables from '../../../../ThemeVariables';\r\n\r\nexport const SearchInput = styled.input`\r\n\twidth: calc(100% - 50px);\r\n\tline-height: ${Variables.headerHeight};\r\n\tfont-size: 16px;\r\n\tbackground: transparent;\r\n\tfloat: left;\r\n\r\n\t&:focus {\r\n\t\toutline : none;\r\n\t}\r\n`;\r\n\r\nexport const SearchWrapper = styled.div`\r\n\t/*width: calc(100% - 50px);*/\r\n\twidth: 100%;\r\n\r\n\tbackground: #ebedf0;\r\n\tborder-radius: 25px;\r\n\toverflow: hidden;\r\n\r\n\t&.greyout {\r\n\t\topacity: .3;\r\n\t}\r\n\r\n\r\n\theight: ${Variables.headerHeight};\r\n\r\n\t@media ( max-width: ${Variables.mxs}) {\r\n\t\tdisplay: none;\r\n\t}\r\n\r\n\r\n\r\n\t@media ( min-width: ${Variables.md} ) {\r\n\t\t${props => props.gridArea ? 'grid-area:' + props.gridArea : ''};\r\n\t\twidth: 20vw;\r\n\r\n\t\tmargin-left: 25px;\r\n\t}\r\n\r\n\t@media ( min-width: ${Variables.lgMin} ) {\r\n\t\twidth: 20vw;\r\n\t}\r\n\r\n\t${props => props.wrapped ? 'display: block !important;' : ''};\r\n\r\n\t@media ( min-width: ${Variables.xlg} ) {\r\n\t\tdisplay: block;\r\n\t\twidth: 20vw;\r\n\t\tgrid-area: search;\r\n\t}\r\n`;\r\n\r\nexport const Magnifier = styled.div`\r\n\twidth: 50px;\r\n\tfloat: left;\r\n\tline-height: ${Variables.headerHeight};\r\n\ttext-align: center;\r\n\r\n`;\r\n","import React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { faSearch } from '@fortawesome/free-solid-svg-icons'\r\nimport actions from '../../../../redux/slideOut/actions';\r\nimport searchActions from '../../../../redux/search/actions';\r\nimport { ScrollTo } from \"react-scroll-to\";\r\nimport { bindActionCreators } from 'redux';\r\nimport ReactTooltip from 'react-tooltip';\r\nimport * as Styled from './styled';\r\nimport { withTranslate } from 'react-redux-multilingual';\r\n\r\nclass SearchBar extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n searchValue: false\r\n }\r\n }\r\n\r\n _changeSearchInput = (e) => {\r\n this.props.actions.setSearchTerm(e.target.value);\r\n }\r\n\r\n handleSubmit(event, reset = false) {\r\n if (event) event.preventDefault();\r\n this.props.actions.setActiveSlideOut('goapps/search', { search: this.props.searchTerm, dashboard: true });\r\n\r\n if ( this.props.searchbarActive ) {\r\n this.props.actions.toggleSearchBarActive(false);\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n { window.tenantConfig.version != 'development' ? : null }\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n return {\r\n darkmode: state.Layout.darkmode,\r\n searchTerm : state.Search.searchTerm,\r\n SlideOutData: state.SlideOut.data,\r\n searchbarActive: state.Search.searchbarActive,\r\n activeSlideOut: state.SlideOut.activeSlideOut\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = dispatch => ({ actions: bindActionCreators({ ...actions, ...searchActions }, dispatch) });\r\n\r\nexport default withTranslate(connect(mapStateToProps, mapDispatchToProps)(SearchBar));\r\n","import styled from 'styled-components';\r\nimport * as Variables from '../../ThemeVariables';\r\n\r\nconst Box = styled.div`\r\n\r\n\tborder-radius: ${Variables.borderRadius};\r\n\twidth: 100%;\r\n\tbox-shadow: 0px 0px 5px 4px rgba(0,0,0,0.03);\r\n\r\n\ttransform: translateX(0) rotateX(0) rotateZ(0deg)\r\n\r\n\tpadding: 14.4px;\r\n\r\n\ttransition: all .3s;\r\n\t&:hover {\r\n\t\tbox-shadow: 0px 0px 5px 4px rgba(0, 0, 0, 0.06);\r\n\t}\r\n\r\n\tbackground: ${Variables.tileBackground.lightMode};\r\n\tcolor: ${Variables.mainTextColor.lightMode};\r\n\r\n\t&.darkmode {\r\n\t\tbackground: ${Variables.tileBackground.darkMode};\r\n\t\tcolor: ${Variables.mainTextColor.darkMode};\r\n\t\t&:hover {\r\n\t\t\tbox-shadow: 0px 0px 5px 4px rgba(254, 254, 254, 0.03);\r\n\t\t}\r\n\t}\r\n`;\r\n\r\nexport default Box;","import customProtocolCheck from \"custom-protocol-check\";\r\nimport moment from 'moment';\r\n/**\r\n @Description Determines the way to open an application.\r\n @param { bool } defaultStartInPopup caller function may have already determined app should open in a popup. Defaults to false.\r\n*/\r\nexport const getUserApplicationSettings = (defaultStartInPopup = false) => {\r\n\r\n\r\n var userAgent = navigator.userAgent,\r\n mobile = function() {\r\n return /\\b(iPhone|iP[ao]d)/.test(userAgent) ||\r\n /\\b(iP[ao]d)/.test(userAgent) ||\r\n /Android/i.test(userAgent) ||\r\n /Mobile/i.test(userAgent);\r\n },\r\n screenX = typeof window.screenX != 'undefined' ? window.screenX : window.screenLeft,\r\n screenY = typeof window.screenY != 'undefined' ? window.screenY : window.screenTop,\r\n outerWidth = typeof window.outerWidth != 'undefined' ? window.outerWidth : document.documentElement.clientWidth,\r\n outerHeight = typeof window.outerHeight != 'undefined' ? window.outerHeight : document.documentElement.clientHeight - 22,\r\n targetWidth = mobile() ? null : 1024,\r\n targetHeight = mobile() ? null : 800,\r\n V = screenX < 0 ? window.screen.width + screenX : screenX,\r\n left = parseInt(V + (outerWidth - targetWidth) / 2, 10),\r\n right = parseInt(screenY + (outerHeight - targetHeight) / 2.5, 10),\r\n features = [];\r\n if (targetWidth !== null) {\r\n features.push('width=' + targetWidth);\r\n }\r\n if (targetHeight !== null) {\r\n features.push('height=' + targetHeight);\r\n }\r\n features.push('left=' + left);\r\n features.push('top=' + right);\r\n features.push('scrollbars=1');\r\n\r\n\r\n let openAppInTarget = 'popup';\r\n let windowProperties = features.join(',');\r\n let startInPopup = defaultStartInPopup;\r\n\r\n if (window.userSettings) {\r\n if (window.userSettings.hasOwnProperty('startLocalApps')) {\r\n if (window.userSettings.startLocalApps === false) {\r\n startInPopup = true;\r\n }\r\n } else {\r\n startInPopup = true;\r\n }\r\n\r\n if (window.userSettings.hasOwnProperty('startAppsInNewWindow')) {\r\n if (window.userSettings.startAppsInNewWindow === true) {\r\n openAppInTarget = '_BLANK';\r\n windowProperties = '';\r\n }\r\n }\r\n }\r\n\r\n return {\r\n openAppInTarget,\r\n windowProperties,\r\n startInPopup\r\n }\r\n}\r\n\r\n/**\r\n @Description Conditionally opens an application. We need a webDavUrl as provided by the MS Graph API to make this work. Otherwise, this will fall back on the original link and open that in a popup.\r\n @param { string } webDavUrl Link to a document, usually also enables us to open a shared document locally.\r\n @param { string } originalLink Original link to document, usable as href.\r\n @param { string } appName MS App name, if not set, application will not try to open locally\r\n @param { string } dataType Document data type\r\n @param { object } dataType Document data type\r\n*/\r\n\r\nexport const launchApp = (webDavUrl = false, originalLink = false, appName = false, dataType = false) => {\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n // -- If appName isset, default to trying to open app locally.\r\n const { openAppInTarget, windowProperties, startInPopup } = getUserApplicationSettings((appName ? false : true));\r\n\r\n const popupLink = originalLink + (dataType !== \"#microsoft.graph.listItem\" ? \"?web=1\" : \"\");\r\n if (startInPopup) {\r\n openPopup(popupLink, openAppInTarget, windowProperties, appName);\r\n resolve();\r\n }\r\n\r\n let newLink = false;\r\n if (webDavUrl && appName) {\r\n newLink = `ms-${appName.toLowerCase()}:ofe|u|${webDavUrl}`;\r\n }\r\n\r\n\r\n if (newLink) {\r\n customProtocolCheck(\r\n newLink,\r\n () => {\r\n openPopup(popupLink, openAppInTarget, windowProperties);\r\n resolve();\r\n },\r\n () => {\r\n resolve();\r\n }, 5000\r\n );\r\n } else {\r\n openPopup(popupLink, openAppInTarget, windowProperties, appName);\r\n resolve();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n @Description Conditionally opens an application. We need a webDavUrl as provided by the MS Graph API to make this work. Otherwise, this will fall back on the original link and open that in a popup.\r\n @param { string } popupLink Link to open\r\n @param { string } openAppInTarget Window target (popup, _BLANK, parent...)\r\n @param { string } windowProperties May contain additional values like popup size, scrollbars\r\n @param { string } windowTitle Possible title to set to the opened window.\r\n*/\r\nexport const openPopup = (popupLink = false, openAppInTarget = false, windowProperties = false, windowTitle = false, openNewWindow = false) => {\r\n let openedWindow = window.open(popupLink, openNewWindow ? \"\" : openAppInTarget+JSON.stringify(popupLink), windowProperties);\r\n /*if (windowTitle) {\r\n openedWindow.onload = () => {\r\n openedWindow.document.title = windowTitle;\r\n }\r\n }*/\r\n}\r\n","import styled, { keyframes, css } from 'styled-components';\r\nimport * as Variables from '../../../ThemeVariables';\r\nimport styledContainerQuery from 'styled-container-query';\r\nimport { LinkContainer } from '../../../components/layout/widget/styled';\r\n\r\nexport const DocumentsList = styledContainerQuery.div`\r\n\tdisplay: grid;\r\n\tgrid-template-columns: repeat(1, 1fr);\r\n\tgrid-column-gap: 25px;\r\n\tgrid-row-gap:3px;\r\n\tmin-height:310px;\r\n\t@media(min-width: ${Variables.md}) and (max-width: ${Variables.xlg}) {\r\n\t\tmin-height:249px;\r\n\t}\r\n\t&:container(min-width: 365px) {\r\n\t\tgrid-template-columns: repeat(2, 1fr);\r\n\t}\r\n\r\n\ta {\r\n\t\tdisplay: inline-flex;\r\n\r\n\t\t@media(min-width: ${Variables.md}) and (max-width: ${Variables.xlg}) {\r\n\t\t\t&:nth-of-type(1n+9) {\r\n\t\t\t\tdisplay: none;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n`;\r\n\r\nexport const AddLink = styled.div`\r\n\tdisplay: inline;\r\n\tbackground: #636a73;\r\n\tborder-radius: 8px;\r\n\tfont-size: 12px;\r\n\tpadding: 0 5px;\r\n\tcursor: pointer;\r\n\tcolor: ${Variables.mainTextColor.lightMode};\r\n\tspan {\r\n\t\tfont-weight: regular;\r\n\t}\r\n`;\r\n\r\nexport const AddNoLink = styled.span`\r\n\ttext-decoration: none;\r\n\tfont-size: 12px;\r\n\tcursor: pointer;\r\n\tcolor: #40454c;\r\n\ttext-align: right;\r\n\r\n\t&:not(:last-of-type) {\r\n\t\t&:after {\r\n\t\t\tcontent: ' | ';\r\n\t\t}\r\n\t}\r\n\r\n\t&.darkmode {\r\n\t\tcolor: white;\r\n\t}\r\n`;\r\n\r\nexport const ListHeading = styledContainerQuery.div`\r\n\tmargin-bottom: 20px;\r\n\r\n\t&:container(min-width: 340px) {\r\n\t\tdisplay: flex;\r\n justify-content: space-between;\r\n\t}\r\n`;\r\n\r\n\r\nexport const Section = styled.div`\r\n\t&:nth-of-type(2) {\r\n\t\tdisplay: none;\r\n\t}\r\n\r\n\t@media(max-width: ${Variables.md}) {\r\n\t\t&:nth-of-type(2) {\r\n\t\t\tdisplay: block;\r\n\t\t}\r\n\t}\r\n\r\n\t@media(min-width: ${Variables.xlg}) {\r\n\t\t&:nth-of-type(2) {\r\n\t\t\tdisplay: block;\r\n\t\t}\r\n\t}\r\n`;\r\n\r\nexport const DocumentsListSlide = styled.div`\r\n\tdisplay: grid;\r\n`;\r\n\r\nexport const Container = styled.div`\r\n\tpadding: 20px 0px;\r\n\tdisplay: grid;\r\n\tgrid-template-columns: repeat(1, 1fr);\r\n\tgrid-auto-rows: minmax(30px, max-content);\r\n\tgrid-row-gap:3px;\r\n`;\r\n\r\nexport const DocumentWrapper = styled.div`\r\n\tdisplay: flex;\r\n\ttext-decoration: none;\r\n\tcursor: pointer;\r\n\tjustify-content:space-between;\r\n\tcolor: ${Variables.mainTextColor.lightMode};\r\n\tborder-radius: 6px;\r\n\tpadding-right:5px;\r\n\t&.darkmode {\r\n\t\tcolor: ${Variables.mainTextColor.darkMode};\r\n\t}\r\n\t&:hover{\r\n\t\ttext-decoration: underline;\r\n\t}\r\n\t&.popup {\r\n\t\tbackground : #ebedf0;\r\n\t}\r\n\t&.darkmode.popup {\r\n\t\tbackground: ${Variables.tileBackground.darkMode};\r\n\t}\r\n`\r\n\r\nexport const PDFIcon = styled.div`\r\n\tpadding:5px; \r\n\tdisplay:flex; \r\n\talign-items:center;\r\n\t&:hover > svg {\r\n\t\tcolor:#636A73;\r\n\t}\r\n`","import styled, { css } from 'styled-components'\r\nimport * as Variables from '../../../ThemeVariables';\r\n\r\nexport const MenuList = styled.ul`\r\n\tlist-style: none;\r\n\tdisplay: grid;\r\n\theight: calc(100% + 20px);\r\n\ttop: -10px;\r\n\t${props => (props.parent === 'header-col-center' || props.parent === 'header-col-right') && css`\r\n\t\ttext-align: right;\r\n\r\n\t\tgrid-template-columns: repeat(2, 1fr);\r\n\t\t@media ( min-width: ${Variables.md} ) {\r\n\t\t\tdisplay: block;\r\n\t\t\tgrid-template-columns: none;\r\n\t\t}\r\n\t`}\r\n\r\n\t${props => props.parent === 'slideout' && css`\r\n\t\tgrid-template-columns: 1fr;\r\n \tgrid-gap: 20px;\r\n\r\n\t`}\r\n\r\n`;\r\n\r\nexport const MenuButtonList = styled.ul`\r\n\tlist-style: none;\r\n\ttext-align: right;\r\n\r\n`;\r\n\r\n\r\nexport const ButtonWrapper = styled.div`\r\ngrid-area: notifications;\r\n`;\r\nexport const MenuListItemInner = styled.div`\r\ntransform: skew(25deg, 0deg);\r\ndisplay: flex;\r\nalign-items: center;\r\nheight: 100%;\r\njustify-content: center;\r\n`;\r\nexport const MenuListItem = styled.li`\r\n\r\n\theight: 100%;\r\n\tdisplay: inline-block;\r\n\tline-height: ${Variables.headerHeight};\r\n\tfont-size: 20px;\r\n\twidth: 45px;\r\n\tcursor: pointer;\r\n\r\n\ttransform: skew(-25deg, 0deg);\r\n\r\n\t@media ( min-width: ${Variables.md} ) {\r\n\t\twidth: 45px;\r\n\t\tfont-size: 20px;\r\n\t}\r\n\r\n\t&:hover {\r\n\t\topacity: 0.8;\r\n\t}\r\n\r\n\ttext-align: center;\r\n\t${props => props.parent === 'header-col-center' && css`\r\n\t\ttext-align: right;\r\n\t`}\r\n\t${props => (props.parent === 'header-col-center' || props.parent === 'header-col-right') && css`\r\n\t\tlabel {\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\r\n\t`}\r\n\r\n\t${props => props.parent === 'slideout' && css`\r\n\t\tbox-shadow: 0px 0px 5px 4px rgba(0,0,0,0.03);\r\n\t\tline-height: 1;\r\n\t\twidth: 100%;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\ttext-align: left;\r\n\t\tdisplay: grid;\r\n\t\tborder-radius: 8px;\r\n\r\n\r\n\t\tfont-size: 22px;\r\n\t\tgrid-template-columns: 40px 1fr;\r\n\t\tpadding: 15px;\r\n\t\tspan {\r\n\t\t\tmargin-left: 28px !important;\r\n\t\t\ttop: 16px !important;\r\n\t\t}\r\n\t\t@media ( min-width: ${Variables.xs}) {\r\n\t\t\tfont-size: 30px;\r\n\t\t\tgrid-template-columns: 75px 1fr;\r\n\t\t\tpadding: 20px;\r\n\t\t\tspan {\r\n\t\t\t\tmargin-left: 42px !important;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t&.darkmode {\r\n\t\t\tbackground: #1B2B3C;\r\n\t\t\tcolor: white;\r\n\r\n\t\t\ta {\r\n\t\t\t\tcolor: white;\r\n\t\t\t}\r\n\t\t}\r\n\t`}\r\n`;\r\n\r\nexport const MenuListItemLabel = styled.label`\r\n\tfont-size: 20px;\r\n`;\r\n\r\nexport const MenuButtonListItem = styled.li`\r\n\tdisplay: inline-block;\r\n\tline-height: ${Variables.headerHeight};\r\n\tfont-size: 18px;\r\n\ttext-align: center;\r\n\r\n\r\n`;\r\n\r\nexport const Link = styled.a`\r\n\tcolor: ${props => props.darkmode ? '#FFFFFF' : '#636a73'};\r\n\r\n\tli {\r\n\t\t&:before {\r\n\t\t\t\tbackground: #e9ebee;\r\n\t\t\tcontent: '';\r\n\t\t\twidth: 100%;\r\n\t\t\theight: 0%;\r\n\t\t\tposition: absolute;\r\n\t\t\tleft: 0;\r\n\t\t\ttop: 0;\r\n\t\t\ttransition: height .5s;\r\n\t\t}\r\n\r\n\t\t&.darkmode {\r\n\t\t\t&:before {\r\n\t\t\t\tbackground: #0d131b;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t&.btn-active, &:hover {\r\n\t\tli {\r\n\t\t\t&:before {\r\n\t\t\t\theight: 100%;\r\n\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t&.greyout {\r\n\t\topacity: .3;\r\n\t}\r\n\t&:after {\r\n\t\tcontent: '';\r\n\t\tposition: absolute;\r\n\t\twidth: 0%;\r\n\t\theight: 3px;\r\n\t\tbackground: ${Variables.mainColor};\r\n\t\tleft: 0;\r\n\t\tbottom: -28px;\r\n\t\ttransition: width .5s;\r\n\t}\r\n\t&.active {\r\n\t\t&:after {\r\n\t\t\twidth: 100%;\r\n\t\t}\r\n\t}\r\n\r\n`;\r\n\r\nexport const Nav = styled.nav`\r\n\theight: 100%;\r\n\t${props => props.parent === 'header-col-center' && css`\r\n\t\tdisplay: none;\r\n\t\t@media ( min-width: ${Variables.xlg}) {\r\n\t\t\tdisplay: block;\r\n\t\t}\r\n\r\n\t`}\r\n\r\n\t${props => props.parent === 'header-col-right' && css`\r\n\t\tdisplay: none;\r\n\t\t@media ( min-width: ${Variables.md}) {\r\n\t\t\tdisplay: block;\r\n\t\t}\r\n\t\t@media ( min-width: ${Variables.xlg}) {\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t`}\r\n\r\n\tgrid-area: menuIcons;\r\n`;\r\n","import React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { bindActionCreators } from 'redux';\r\nimport { withRouter } from 'react-router-dom'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\n\r\nimport actions from '../../../redux/slideOut/actions';\r\nimport callsActions from '../../../redux/common/calls/actions';\r\nimport Bubble from '../bubble';\r\nimport * as Styled from './styled';\r\nimport { getMS, capitalizeFirstLetter } from '../../../helpers/functions';\r\n\r\nimport { faConciergeBell, faTasks, faUserFriends, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\r\n//import { fas } from '@fortawesome/free-solid-svg-icons'\r\nimport { faWindowRestore, faCalendarAlt } from '@fortawesome/free-regular-svg-icons';\r\nimport ReactTooltip from 'react-tooltip';\r\nimport { withTranslate } from 'react-redux-multilingual'\r\nimport moment from 'moment/min/moment-with-locales';\r\n\r\nclass Menu extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n shoutWidgets: [],\r\n birthdays: false\r\n };\r\n }\r\n\r\n\r\n componentDidMount() {\r\n this._getCalls();\r\n\r\n if (this.timer) clearInterval(this.timer);\r\n this.timer = setInterval(this._getCalls.bind(this), getMS(11));\r\n this._checkShoutItems();\r\n }\r\n\r\n componentWillUnmount() {\r\n clearInterval(this.timer);\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.widgets.left?.length == 0 && this.props.widgets.left?.length > 0) {\r\n this._checkShoutItems();\r\n // if (this.state.shoutWidgets.length == 0 && this.props.widgets.left.length > 0) {\r\n //this._checkShoutItems();\r\n }\r\n\r\n //if (prevProps.showItem !== this.props.showItem) {\r\n ReactTooltip.rebuild();\r\n //}\r\n }\r\n\r\n _checkShoutItems = () => {\r\n //this.props.shoutItems.\r\n //if (this.props.shoutItems.length == 0 || this.state.shoutWidgets.length > 0) return;\r\n //const widgets = [...new Set(this.props.shoutItems.map(item => item.widget))];\r\n\r\n\r\n //this.props.widgets.find(w => w.)\r\n let widgets = this.findAll(this.props.widgets, \"MultiShout\");\r\n let birthdays = this.findAll(this.props.widgets, \"Birthdays\");\r\n\r\n this.setState({ shoutWidgets: widgets, birthdays: (birthdays?.length > 0) });\r\n }\r\n\r\n findAll = (obj, searchKey, results = []) => {\r\n const r = results;\r\n if (obj == null) return;\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key];\r\n if (value === searchKey && typeof value !== 'object') {\r\n r.push(obj);\r\n } else if (typeof value === 'object') {\r\n this.findAll(value, searchKey, r);\r\n }\r\n });\r\n return r;\r\n };\r\n\r\n //findAll = (array) => {\r\n // let result = [];\r\n\r\n // const searchItem = (item) => {\r\n // Object.keys(item).forEach(key => {\r\n // if (typeof item[key] === \"object\") {\r\n // searchItem(item[key])\r\n // }\r\n // if (typeof item[key] === \"string\") {\r\n // let searchAsRegEx = new RegExp(searchTerm, \"gi\");\r\n // if (item[key].match(searchAsRegEx)) {\r\n // result.push(item.id)\r\n // }\r\n // }\r\n // })\r\n // };\r\n\r\n // const getEachItem = (object) => {\r\n // //object.forEach(item => {\r\n // // this.searchItem(item)\r\n // //})\r\n // Object.keys(object).forEach(item => {\r\n // searchItem(item);\r\n // });\r\n // let uniqueResults = [...new Set(result)]\r\n // return uniqueResults.length\r\n // };\r\n\r\n // return getEachItem(array);\r\n //}\r\n\r\n _getCalls = () => {\r\n this.props.actions.getCalls();\r\n }\r\n\r\n _filterShoutItems = (items, widget) => {\r\n return items.filter(i => i.widget == widget?.title && moment.unix(i.unix) > moment().add(-14, 'days') && this._getIsNew(i) === true);\r\n }\r\n\r\n _getIsNew = (item) => {\r\n let viewedShouts = this.props.lastShoutViews;\r\n let shout = viewedShouts?.find((shout) => shout.url === item.url);\r\n if (shout) {\r\n return !shout.viewed;\r\n }\r\n return true;\r\n }\r\n\r\n _renderShoutWidgets = (w, key) => {\r\n return this.props.actions.setActiveSlideOut((this.props.activeSlideOut === 'MultiShout' ? false : 'MultiShout'), { title: w.title })\r\n }>\r\n \r\n \r\n {this._filterShoutItems(this.props.shoutItems, w).length > 0 ? : null}\r\n \r\n \r\n {w.title}\r\n \r\n \r\n \r\n ;\r\n }\r\n\r\n render() {\r\n\r\n return (\r\n \r\n \r\n \r\n\r\n {this.state.birthdays &&\r\n this.props.actions.setActiveSlideOut((this.props.activeSlideOut === 'Birthdays' ? false : 'Birthdays'))\r\n }>\r\n \r\n \r\n {/* this.props.upcomingBirthdays.filter(b => (b.when == 'Morgen' || b.when == 'Vandaag')).length > 0 ? : null */}\r\n \r\n\r\n \r\n {this.props.translate('birthdays')}\r\n \r\n \r\n \r\n \r\n }\r\n\r\n {this.state.shoutWidgets?.length > 0 && this.state.shoutWidgets.map(this._renderShoutWidgets)}\r\n\r\n this.props.actions.setActiveSlideOut((this.props.activeSlideOut === 'People' ? false : 'People'))\r\n }>\r\n \r\n \r\n {/*this.props.user.teams ? : null*/}\r\n \r\n\r\n \r\n {this.props.translate('people')}\r\n \r\n \r\n \r\n \r\n\r\n this.props.actions.setActiveSlideOut((this.props.activeSlideOut === 'tasks' ? false : 'tasks'))\r\n }>\r\n \r\n \r\n {this.props.user.tasks ? : null}\r\n \r\n\r\n \r\n {this.props.translate('tasks')}\r\n \r\n \r\n \r\n \r\n\r\n\r\n this.props.actions.setActiveSlideOut((this.props.activeSlideOut === 'calendar' ? false : 'calendar'))\r\n }>\r\n\r\n \r\n \r\n {this.props.user.calendarItems ? : null}\r\n \r\n \r\n {this.props.translate('calendar')}\r\n \r\n \r\n \r\n \r\n\r\n {window.tenantConfig.hulpDeactivated !== \"true\" &&\r\n {\r\n this.props.history.push('/online-hulp/mijn-meldingen');\r\n this.props.actions.setActiveSlideOut(false);\r\n }\r\n }>\r\n\r\n \r\n \r\n {this.props.calls?.filter(i => i.status != \"Afgesloten\").length > 0 ? i.status != \"Afgesloten\").length} /> : null}\r\n \r\n\r\n \r\n {this.props.translate('tickets')}\r\n \r\n \r\n \r\n \r\n }\r\n\r\n {/*window.tenantConfig.version == 'development' &&\r\n this.props.actions.setActiveSlideOut((this.props.activeSlideOut === 'goapps' ? false : 'goapps'), { page: 'init' })\r\n }>\r\n \r\n \r\n \r\n \r\n {this.props.translate('apps')}\r\n \r\n \r\n \r\n \r\n */}\r\n\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n//LATEN STAAN, moet weer terug worden gezet als we met de moderne werkplek live gaan\r\n// {\r\n// this.props.history.push('/online-hulp/mijn-meldingen');\r\n// this.props.actions.setActiveSlideOut(false);\r\n//} : null}>\r\n\r\n// \r\n// {this.props.user.tasks ? : null}\r\n// \r\n\r\n// \r\n// Meldingen\r\n// \r\n// \r\n//\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n return {\r\n activeSlideOut: state.SlideOut.activeSlideOut,\r\n user: state.User,\r\n calls: state.Calls.items,\r\n darkmode: state.Layout.darkmode,\r\n birthdays: state.Birthday.birthdays,\r\n upcomingBirthdays: state.Birthday.upcoming,\r\n shoutItems: state.MultiChannelShout.shoutItems,\r\n lastShoutViews: state.User.profile.data?.settings?.viewedShouts,\r\n slideoutData: state.SlideOut.data,\r\n widgets: state.Widgets.widgets\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = dispatch => ({ actions: bindActionCreators({ ...actions, ...callsActions }, dispatch) });\r\n\r\nexport default withTranslate(withRouter(connect(mapStateToProps, mapDispatchToProps)(Menu)));\r\n","import styled from 'styled-components';\r\nimport * as Variables from '../../../ThemeVariables';\r\nconst headingStyle = `\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n`\r\n\r\nexport const Heading = styled.div`\r\n\tmargin-top: 5px;\r\n\tmargin-bottom: 35px;\r\n\tcursor: pointer;\r\n\r\n\t${props => !props.positionBottom ? headingStyle : 'display: inline-block;'};\r\n\r\n\t${props => props.position ? 'float: '+props.position+';' : '' }\r\n\t${props => props.border ? \"border-bottom: 2px solid #e4e4e4;padding-bottom: 15px;\" : \"\"}\r\n\t${props => props.marginBottom ? 'margin-bottom: ' +props.marginBottom + 'px;' : ''};\r\n\t${props => props.marginTop ? 'margin-top: ' +props.marginTop + 'px;' : ''};\r\n\t&.task-tutorial-active, &.calendar-tutorial-active {\r\n\t\th2 {\r\n\t\t\t&:after {\r\n\t\t\ttop: 0;\r\n\t\t left: 0;\r\n\t\t content: '';\r\n\t\t position: absolute;\r\n\t\t border: 3px solid red;\r\n\t\t border-radius: 25px;\r\n\t\t width: calc(100% + 25px);\r\n\t\t height: calc(100% + 25px);\r\n\t\t margin-top: -15px;\r\n\t\t margin-left: -15px;\r\n\t\t}\r\n\t\t}\r\n\r\n\t}\r\n`;\r\n\r\nexport const Title = styled.h2`\r\n\tfont-size: ${props => !props.small ? \"1.1em\" : \"0.8em\"};\r\n\ttext-align: left;\r\n\r\n\tcolor : ${Variables.headingColor.lightMode};\r\n\r\n\t&.darkmode {\r\n\t\tcolor : ${Variables.headingColor.darkMode};\r\n\t}\r\n`;\r\n\r\nexport const Link = styled.a`\r\n\ttext-decoration: none;\r\n\tfont-size: 12px;\r\n\tcolor : ${Variables.headingColor.lightMode};\r\n\r\n\t&.darkmode {\r\n\t\tcolor : ${Variables.headingColor.darkMode};\r\n\t}\r\n\ttext-align: right;\r\n\t&:hover{\r\n\t\ttext-decoration: underline;\r\n\t}\r\n`;\r\n\r\nexport const NoLink = styled.span`\r\n\ttext-decoration: none;\r\n\tfont-size: 12px;\r\n\tcolor : ${Variables.headingColor.lightMode};\r\n\r\n\t&.darkmode {\r\n\t\tcolor : ${Variables.headingColor.darkMode};\r\n\t}\r\n\ttext-align: right;\r\n\t&:hover{\r\n\t\ttext-decoration: underline;\r\n\t}\r\n`;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport * as Styled from './styled';\r\nimport { connect } from 'react-redux';\r\n\r\nconst HeadingSlideout = props => (\r\n\t\r\n\t\t{props.title}\r\n\t\t{props.linkTitle && props.linkUrl ?\r\n\t\t\t{props.linkTitle}\r\n\t\t\t:\r\n\t\t\t{props.linkTitle}\r\n\t\t}\r\n\t\r\n)\r\n\r\nHeadingSlideout.propTypes = {\r\n\ttitle : PropTypes.string,\r\n\tlinkTitle : PropTypes.string,\r\n\tlinkUrl : PropTypes.string,\r\n\tmarginBottom: PropTypes.number\r\n}\r\n\r\n\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n return {\r\n darkmode : state.Layout.darkmode\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(HeadingSlideout);\r\n","import styled from 'styled-components';\r\nimport * as Variables from '../../../ThemeVariables';\r\nconst headingStyle = `\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n`\r\n\r\nexport const Heading = styled.div`\r\n\tmargin-bottom: ${props => !props.marginBottom ? \"20px\" : props.marginBottom + 'px'};\r\n\tmargin-top: ${props => !props.marginTop ? \"0\" : props.marginTop + 'px'};\r\n\t${props => !props.positionBottom ? headingStyle : ''};\r\n\r\n\t${props => props.position ? 'float: '+props.position+';' : '' }\r\n\t${props => props.border ? \"border-bottom: 2px solid #e4e4e4;padding-bottom: 15px;\" : \"\"}\r\n`;\r\n\r\nexport const Title = styled.h2`\r\n\tfont-size: ${props => !props.small ? \"1.1em\" : \"0.8em\"};\r\n\ttext-align: left;\r\n\tcolor: ${Variables.headingColor};\r\n\r\n\tcolor : ${Variables.headingColor.lightMode};\r\n\r\n\t&.darkmode {\r\n\t\tcolor : ${Variables.headingColor.darkMode};\r\n\t}\r\n`;\r\n\r\nexport const Link = styled.a`\r\n\ttext-decoration: none;\r\n\tfont-size: 12px;\r\n\tmargin-top: 4px;\r\n\theight: 21px;\r\n\tdisplay: inline-block;\r\n\tcolor : ${Variables.headingColor.lightMode};\r\n\r\n\t&.darkmode {\r\n\t\tcolor : ${Variables.headingColor.darkMode};\r\n\t}\r\n\ttext-align: right;\r\n\r\n\t&:hover{\r\n\t\ttext-decoration: underline;\r\n\t}\r\n`;\r\n\r\nexport const NoLink = styled.span`\r\n\ttext-decoration: none;\r\n\tfont-size: 12px;\r\n\theight: 21px;\r\n\tdisplay: inline-block;\r\n\tcursor: pointer;\r\n\tcolor : ${Variables.headingColor.lightMode};\r\n\t&:after {\r\n\t\tcontent: '';\r\n\t\twidth: 0;\r\n\t\theight: 1px;\r\n\t\tbackground: ${Variables.headingColor.lightMode};\r\n\t\tposition: absolute;\r\n\t\tbottom: 5px;\r\n\t\tleft: 0;\r\n\t\ttransition: width .5s;\r\n\t}\r\n\t&.darkmode {\r\n\t\tcolor : ${Variables.headingColor.darkMode};\r\n\r\n\t\t&:after {\r\n\t\t\tbackground : ${Variables.headingColor.darkMode};\r\n\t\t}\r\n\t}\r\n\ttext-align: right;\r\n\r\n\t&:hover{\r\n\t\t&:after {\r\n\t\t\twidth: 100%;\r\n\t\t}\r\n\t}\r\n`;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport * as Styled from './styled';\r\nimport { connect } from 'react-redux';\r\n\r\nconst Heading = props => (\r\n\t\r\n\t\t{props.title}\r\n\t\t{props.linkTitle && props.linkUrl ?\r\n\t\t\t{props.linkTitle}\r\n\t\t\t:\r\n\t\t\t{props.linkTitle}\r\n\t\t}\r\n\t\r\n)\r\n\r\nHeading.propTypes = {\r\n\ttitle : PropTypes.string,\r\n\tlinkTitle : PropTypes.string,\r\n\tlinkUrl : PropTypes.string,\r\n\tmarginBottom: PropTypes.number\r\n}\r\n\r\n\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n return {\r\n darkmode : state.Layout.darkmode\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(Heading);\r\n","import styled from 'styled-components'\r\nimport * as Variables from '../../../../ThemeVariables';\r\nexport const SearchInput = styled.input`\r\n\twidth: calc(100% - 50px);\r\n\tline-height: 40px;\r\n\tfont-size: 16px;\r\n\tbackground: transparent;\r\n\tfloat: left;\r\n\r\n\t&:focus {\r\n\t\toutline : none;\r\n\t}\r\n`;\r\n\r\nexport const SearchWrapper = styled.div`\r\n\twidth: 100%;\r\n\tbackground: #ebedf0;\r\n\tborder-radius: 25px;\r\n\toverflow: hidden;\r\n\theight: 40px;\r\n\tmargin-bottom: 25px;\r\n`;\r\n\r\nexport const Magnifier = styled.div`\r\n\twidth: 50px;\r\n\tfloat: left;\r\n\tline-height: ${Variables.headerHeight};\r\n\ttext-align: center;\r\n\r\n`;\r\n","import React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { faSearch } from '@fortawesome/free-solid-svg-icons'\r\nimport actions from '../../../../redux/slideOut/actions';\r\nimport { ScrollTo } from \"react-scroll-to\";\r\nimport { bindActionCreators } from 'redux';\r\nimport * as Styled from './styled';\r\n\r\nclass SearchBar extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default SearchBar\r\n","const actions = {\r\n\tSET_ACTIVE_POPUP : 'SET_ACTIVE_POPUP',\r\n\tSET_POPUP_DATA: 'SET_POPUP_DATA',\r\n\r\n\tsetActivePopup: (payload, data = false) => ({\r\n\t\ttype: actions.SET_ACTIVE_POPUP,\r\n\t\tpayload : {\r\n\t\t\titem : payload,\r\n\t\t\tdata : data\r\n\t\t}\r\n\t}),\r\n};\r\n\r\nexport default actions;\r\n","const actions = {\r\n\tSET_ACTIVE_YEAR_OVERVIEW_POPUP : 'SET_ACTIVE_YEAR_OVERVIEW_POPUP',\r\n\tSET_POPUP_YEAR_OVERVIEW_DATA: 'SET_POPUP_YEAR_OVERVIEW_DATA',\r\n\r\n\tsetActiveYearOverviewPopup: (payload, data = false) => ({\r\n\t\ttype: actions.SET_ACTIVE_YEAR_OVERVIEW_POPUP,\r\n\t\tpayload : {\r\n\t\t\titem : payload,\r\n\t\t\tdata : data\r\n\t\t}\r\n\t}),\r\n};\r\n\r\nexport default actions;\r\n","import styled from 'styled-components'\r\nimport * as Variables from '../../../../ThemeVariables';\r\n\r\nexport const DocumentsListItem = styled.a`\r\n\tdisplay: flex;\r\n\ttext-decoration: none;\r\n\tcursor: pointer;\r\n\tcolor: ${Variables.mainTextColor.lightMode};\r\n\tborder-radius: 6px;\r\n\tpadding:5px;\r\n\t&.darkmode {\r\n\t\tcolor: ${Variables.mainTextColor.darkMode};\r\n\t}\r\n\t&:hover{\r\n\t\ttext-decoration: underline;\r\n\t}\r\n\t&.popup {\r\n\t\tbackground : #ebedf0;\r\n\t}\r\n\t&.darkmode.popup {\r\n\t\tbackground: ${Variables.tileBackground.darkMode};\r\n\t}\r\n`;\r\n\r\nexport const Icon = styled.img`\r\n\theight: 22px;\r\n\twidth: auto;\r\n\tmargin-right: 12px;\r\n`;\r\n\r\nexport const Info = styled.span`\r\n\tfont-size: 12px;\r\n\tline-height: 22px;\r\n\t&.darkmode {\r\n\t\tcolor: ${Variables.mainTextColor.darkMode};\r\n\t}\r\n`;\r\n\r\nexport const Author = styled.span`\r\n\tfont-size: 12px;\r\n\tline-height: 22px;\r\n\t&.darkmode {\r\n\t\tcolor: ${Variables.mainTextColor.darkModeSoft};\r\n\t}\r\n`;\r\n","import React from \"react\";\r\nimport { FixedSizeList as List } from \"react-window\";\r\nimport InfiniteLoader from \"react-window-infinite-loader\";\r\n\r\nexport default function InfiniteScrollWrapper({\r\n // Are there more items to load?\r\n // (This information comes from the most recent API request.)\r\n hasNextPage,\r\n\r\n // Are we currently loading a page of items?\r\n // (This may be an in-flight flag in your Redux store for example.)\r\n isNextPageLoading,\r\n\r\n // Array of items loaded so far.\r\n items,\r\n\r\n // Callback function responsible for loading the next page of items.\r\n loadNextPage,\r\n\r\n // -- Render function for a single item\r\n renderItem,\r\n\r\n // -- Single item height\r\n itemHeight,\r\n\r\n // -- Full list heigt\r\n listHeight\r\n}) {\r\n // If there are more items to be loaded then add an extra row to hold a loading indicator.\r\n const itemCount = hasNextPage ? items.length + 1 : items.length;\r\n\r\n // Only load 1 page of items at a time.\r\n // Pass an empty callback to InfiniteLoader in case it asks us to load more than once.\r\n const loadMoreItems = isNextPageLoading ? () => {} : loadNextPage;\r\n\r\n // Every row is loaded except for our loading indicator row.\r\n const isItemLoaded = index => !hasNextPage || index < items.length;\r\n\r\n // Render an item or a loading indicator.\r\n const Item = ({ index, style }) => {\r\n\r\n let content;\r\n if (isItemLoaded(index)) {\r\n return
\r\n Meldingen\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n\r\n render() {\r\n //if (this.provider.authenticationState === \"Authenticated\") return this._renderApplication();\r\n\r\n if (this.state.failure) {\r\n return (\r\n Er is een fout opgetreden! {this.state.error}\r\n \r\n )\r\n }\r\n\r\n if (this.state.authenticated && this.state.loaded) {\r\n return this._renderApplication();\r\n }\r\n\r\n if (!this.state.authenticated && !this.state.loaded) {\r\n return (\r\n Bezig met authenticeren..\r\n \r\n )\r\n }\r\n\r\n if (this.state.authenticated && !this.state.loaded) {\r\n return (\r\n Bezig met authenticeren..\r\n \r\n )\r\n }\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n return {\r\n activeSlideOut: state.SlideOut.activeSlideOut,\r\n isUnmounting: state.SlideOut.isUnmounting,\r\n activeOverlaySlideOut: state.SlideOut.activeOverlaySlideOut,\r\n sliderHidden: state.Layout.sliderHidden,\r\n isLoaded: state.Layout.IsLoaded,\r\n darkmode: state.Layout.darkmode,\r\n darkmodeAuto: state.Layout.darkmodeAuto,\r\n searchbarActive: state.Search.searchbarActive,\r\n Clients: state.Client,\r\n calls: state.Calls.items,\r\n appOnline: state.App.appOnline,\r\n locale: state.Intl.locale,\r\n savedLocale: state.User.profile.data?.settings?.locale,\r\n user: state.User.profile,\r\n widgets: state.Widgets.widgets,\r\n darkmodeSettings: state.User.profile?.data?.settings?.darkmode,\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = dispatch => ({ actions: bindActionCreators({ ...actions, ...IntlActions, ...userActions, ...action }, dispatch) });\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(Main));\r\n","import React, { Component } from 'react';\r\nimport Boot from \"./redux/boot\";\r\nimport { Provider } from \"react-redux\";\r\nimport { PersistGate } from 'redux-persist/integration/react';\r\nimport store from \"./redux/store\";\r\nimport Main from './components/main';\r\nimport translations from './translate/translations'\r\nimport { IntlReducer as Intl, IntlProvider } from 'react-redux-multilingual'\r\nimport { Router } from 'react-router-dom';\r\n\r\nimport localForage from \"localforage\";\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core' //allows later to just use icon name to render-them\r\nimport { fas } from '@fortawesome/free-solid-svg-icons'\r\nimport { far } from '@fortawesome/free-regular-svg-icons'\r\n\r\nlibrary.add(fas);\r\nlibrary.add(far);\r\n\r\nconst onBeforeLift = () => {\r\n}\r\n\r\nclass App extends Component {\r\n\r\n componentDidMount() {\r\n Boot(store.store);\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import authActions from './auth/actions';\r\nimport appActions from './app/actions';\r\n\r\nexport default (store) =>\r\n\tnew Promise(() => {\r\n\t\tstore.dispatch(appActions.checkAppOnline())\r\n store.dispatch(authActions.checkAuthorization());\r\n\t});\r\n","const buildMsalConfig = () => ({\r\n auth: {\r\n clientId: window.tenantConfig.clientId,\r\n authority: 'https://login.microsoftonline.com/' + (window.tenantConfig.clientId === \"68a590d3-db74-4205-9bdc-bf3286663216\" ? 'common' : window.tenantConfig.tenant),\r\n knownAuthorities: [],\r\n cloudDiscoveryMetadata: \"\",\r\n redirectUri: window.location.origin,\r\n //postLogoutRedirectUri: \"enter_postlogout_uri_here\",\r\n navigateToLoginRequestUrl: true,\r\n clientCapabilities: [\"CP1\"] //conditional access, needs to be implemented continious evaluation access\r\n },\r\n cache: {\r\n cacheLocation: \"localStorage\",\r\n storeAuthStateInCookie: false\r\n },\r\n system: {\r\n //loggerOptions: {\r\n // loggerCallback: (level, message, containsPii) => {\r\n // if (containsPii) {\r\n // return;\r\n // }\r\n // switch (level) {\r\n // case LogLevel.Error:\r\n // console.error(message);\r\n // return;\r\n // case LogLevel.Info:\r\n // console.info(message);\r\n // return;\r\n // case LogLevel.Verbose:\r\n // console.debug(message);\r\n // return;\r\n // case LogLevel.Warning:\r\n // console.warn(message);\r\n // return;\r\n // }\r\n // },\r\n // piiLoggingEnabled: false\r\n //},\r\n windowHashTimeout: 60000,\r\n iframeHashTimeout: 6000,\r\n loadFrameTimeout: 0,\r\n asyncPopups: false\r\n }\r\n});\r\n\r\nexport default buildMsalConfig;\r\n\r\n//const msalInstance = new PublicClientApplication(msalConfig());","import { AccountInfo, Configuration, AuthenticationResult, PublicClientApplication, SilentRequest, RedirectRequest, EndSessionRequest } from \"@azure/msal-browser\"\r\n\r\nclass AuthService {\r\n\r\n constructor(msalConfig) {\r\n if (!msalConfig) {\r\n throw new Error('the msal settings was not provided');\r\n }\r\n\r\n this.msalConfig = msalConfig;\r\n this.msalApplication = new PublicClientApplication(msalConfig);\r\n\r\n //this.account = new AccountInfo;\r\n\r\n //let msalConfig = this.GetMsalClientConfiguration();\r\n //this.msalApplication = new PublicClientApplication(msalConfig);\r\n }\r\n\r\n //// msal application object\r\n //msalApplication: PublicClientApplication;\r\n\r\n //// settings service\r\n //appSettings: AppSettingsService;\r\n\r\n //// cached account info\r\n //account?: AccountInfo;\r\n\r\n HandlePageLoadEvent = () => {\r\n // let exceptions bubble up to the caller to handle\r\n return this.msalApplication.handleRedirectPromise().then((authResult) => {\r\n this.HandleRedirectResponse(authResult);\r\n });\r\n }\r\n\r\n HandleRedirectResponse = (authResult) => {\r\n // if this page load is redirect from the Microsoft Identity platform then the\r\n // authResult will be populated. Otherwise null on other page loads.\r\n\r\n if (authResult !== null) {\r\n // save the fresh account info from the result.\r\n this.account = authResult.account;\r\n }\r\n else {\r\n // see if we have cached accounts.\r\n const currentAccounts = this.msalApplication.getAllAccounts();\r\n\r\n if (currentAccounts === null) {\r\n // no cached accounts.\r\n // user will need to click the sign-in button and redirect to login.\r\n return;\r\n }\r\n else if (currentAccounts.length > 1) {\r\n // there are some situations where the user may have multiple (different) cached logins.\r\n // this code sample does not cover that scenario but just logs a warning here.\r\n // this conditional block would need to be updated to support multiple accounts.\r\n // otherwise it will just grab the first one below.\r\n console.warn(\"Multiple accounts detected in MSAL account cache.\");\r\n this.account = currentAccounts[0];\r\n }\r\n else if (currentAccounts.length === 1) {\r\n // we have exactly 1 cached account.\r\n // set the account info. user may not need to sign in.\r\n this.account = currentAccounts[0];\r\n }\r\n }\r\n }\r\n\r\n GetToken = async (scopes) => {\r\n\r\n let tokenRequest = {\r\n account: this.account,\r\n scopes: scopes,\r\n forceRefresh: false\r\n }\r\n // msal will return the cached token if present, or call to get a new one\r\n // if it is expired or near expiring.\r\n //return await this.msalApplication.acquireTokenSilent(tokenRequest);\r\n if (window.applicationOnline) {\r\n return this.msalApplication.acquireTokenSilent(tokenRequest).then((response) => {\r\n\r\n return response;\r\n })\r\n .catch((error) => {\r\n console.log('Raw error: ', error);\r\n //\r\n\r\n this.msalApplication.acquireTokenRedirect(tokenRequest).then((response) => {\r\n return response;\r\n }).catch(function (error) {\r\n if (error instanceof InteractionRequiredAuthError) {\r\n\r\n }\r\n });\r\n })\r\n } else {\r\n console.log(\"Offline\");\r\n }\r\n return null;\r\n }\r\n\r\n\r\n\r\n GetIdToken = async (scopes) => {\r\n\r\n // msal will return the cached token if present, or call to get a new one\r\n // if it is expired or near expiring.\r\n //return await this.account.getIdToken();\r\n //let test = this.msalApplication.getAccount();\r\n //return test.idToken;\r\n //this.account\r\n\r\n let test = this.account;\r\n return null;\r\n }\r\n\r\n\r\n\r\n SignIn() {\r\n let request = {\r\n scopes: [\r\n 'User.ReadBasic.All',\r\n 'email',\r\n 'profile',\r\n 'User.Read',\r\n 'Mail.Read',\r\n 'People.Read',\r\n 'offline_access'\r\n ],\r\n prompt: \"select_account\"\r\n }\r\n\r\n if (this.account) request.loginHint = this.account.username;\r\n\r\n\r\n // this will redirect the web application to the Microsoft Identity platform sign in pages.\r\n // no code will execute after this point.\r\n this.msalApplication.loginRedirect(request);\r\n }\r\n\r\n SignOut() {\r\n if (!this.account) {\r\n // no cached login to signout\r\n return;\r\n }\r\n\r\n let accountInfo = this.msalApplication.getAccountByUsername(this.account?.username);\r\n\r\n if (accountInfo !== null) {\r\n let logoutRequestPayload = {\r\n account: accountInfo\r\n }\r\n\r\n this.msalApplication.logout(logoutRequestPayload)\r\n }\r\n }\r\n}\r\n\r\nexport default AuthService;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://cra.link/PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n caches.keys().then(cacheNames => {\r\n cacheNames.forEach(cacheName => {\r\n caches.delete(cacheName);\r\n });\r\n });\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://cra.link/PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then((registration) => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://cra.link/PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch((error) => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' },\r\n })\r\n .then((response) => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log('No internet connection found. App is running in offline mode.');\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then((registration) => {\r\n registration.unregister();\r\n })\r\n .catch((error) => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import styled from 'styled-components';\r\nimport * as Variables from '../../ThemeVariables';\r\n\r\n\r\nexport const StatusWrapper = styled.div`\r\n *{\r\n padding:0;\r\n margin:0;\r\n border:0;\r\n box-sizing:border-box;\r\n position:relative;\r\n font-family: 'Montserrat', sans-serif;\r\n }\r\n\r\n background: #F10000;\r\n width: 100%;\r\n height: 100%;\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n`;\r\n\r\nexport const StatusInner = styled.div`\r\n text-align: center;\r\n color: white;\r\n font-size: 35px;\r\n\r\n h4 {\r\n font-size: 35px;\r\n }\r\n p {\r\n font-size: 24px;\r\n }\r\n`;\r\nexport const StatusLogo = styled.div`\r\n margin-bottom: 25px;\r\n`;\r\n","export default __webpack_public_path__ + \"static/media/logo.fe8cd13e.svg\";","import styled from 'styled-components'\r\nimport * as Variables from './ThemeVariables';\r\n//import { WrappedToastContainer } from '../layout/WrappedToastContainer';\r\nexport const Wrapper = styled.div`\r\n\t&.darkmode {\r\n\t\tbackground: ${Variables.outerColumnBackground.darkMode};\r\n\t}\r\n`;\r\n\r\nexport const Body = styled.div`\r\n\tmin-height: ${Variables.appHeight};\r\n width: 100%;\r\n overflow-x: hidden;\r\n\t@media(min-width: ${Variables.md}) {\r\n\t\tmax-height: ${Variables.appHeight};\r\n\t\toverflow: hidden;\r\n\t}\r\n background: #f2f3f5;\r\n\r\n &.darkmode {\r\n\t\tbackground: ${Variables.outerColumnBackground.darkMode};\r\n\t}\r\n`;\r\n\r\nexport const Loader = styled.div`\r\n width: 100%;\r\n height: 100vh;\r\n background: #F10000;\r\n text-align: center;\r\n padding-top: 40vh;\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n z-index: 10;\r\n transition: all .5s;\r\n\r\n &.loader--hidden {\r\n margin-top: -100vh;\r\n opacity: 0;\r\n }\r\n &--visible {\r\n margin-top: 0;\r\n opacity: 1;\r\n }\r\n\r\n`;\r\n\r\nexport const LoaderText = styled.p`\r\n color: #FFF;\r\n margin-bottom: 50px;\r\n font-weight: bold;\r\n font-size: 2em;\r\n\r\n small {\r\n font-size: 12px;\r\n font-weight: normal;\r\n margin-top: 40px;\r\n }\r\n`;\r\n\r\n/*\r\nexport const StyledToastContainer = styled(WrappedToastContainer).attrs({\r\n // custom props\r\n})`\r\n .Toastify__toast-container {\r\n \t&--top-right {\r\n \t\ttop: 75px;\r\n \t}\r\n }\r\n .Toastify__toast {\r\n \tbackground: white;\r\n \tcolor: black;\r\n \tpadding: 25px 15px;\r\n }\r\n .Toastify__toast--error {}\r\n .Toastify__toast--warning {}\r\n .Toastify__toast--success {}\r\n .Toastify__toast-body {}\r\n .Toastify__progress-bar {\r\n \tbackground: ${Variables.mainColor}\r\n }\r\n .Toastify__close-button {\r\n \topacity: 1;\r\n\r\n }\r\n`;*/\r\n","import React, { Component } from 'react';\r\nimport { Offline, Online } from \"react-detect-offline\";\r\nimport * as Styled from './styled';\r\nimport Logo from '../../assets/img/logo.svg';\r\nclass AppStatus extends Component {\r\n\r\n render() {\r\n return(\r\n\r\n \r\n \r\n \r\n \r\n \r\n
Offline..
\r\n
Je hebt geen internetverbinding
\r\n \r\n \r\n \r\n
Online..
\r\n
Het lijkt erop dat er iets is misgegaan tijdens het aanmelden