├── .czrc ├── app ├── renderer │ ├── assets │ │ ├── stub.js │ │ ├── images │ │ │ ├── cog.png │ │ │ ├── file.png │ │ │ ├── icon.png │ │ │ ├── play.png │ │ │ ├── stop.png │ │ │ ├── camera.png │ │ │ ├── logout.png │ │ │ ├── search.png │ │ │ ├── tasks.png │ │ │ ├── camera@2x.png │ │ │ ├── icon@2x.png │ │ │ ├── logout@2x.png │ │ │ ├── no-issues.png │ │ │ ├── play@2x.png │ │ │ ├── refresh.png │ │ │ ├── search@2x.png │ │ │ ├── stop@2x.png │ │ │ ├── guidelines.png │ │ │ ├── icon-active.png │ │ │ ├── left-arrow.png │ │ │ ├── logo256x256.png │ │ │ ├── refresh@2x.png │ │ │ ├── rigth-arrow.png │ │ │ ├── transparent.png │ │ │ ├── trash-icon.png │ │ │ ├── user-avatar.png │ │ │ ├── Logo-shadowed.png │ │ │ ├── download_icon.png │ │ │ ├── triangle-right.png │ │ │ ├── button-surrounding.png │ │ │ ├── screenshot-deleted.png │ │ │ ├── button-surrounding@2x.png │ │ │ ├── camera-crossed-out@2x.png │ │ │ ├── index.js │ │ │ └── ring-alt.svg │ │ ├── fonts │ │ │ ├── OpenSans-Bold.ttf │ │ │ ├── OpenSans-Light.ttf │ │ │ ├── OpenSans-Semibold.ttf │ │ │ ├── lineto-circular-bold-c.woff │ │ │ ├── lineto-circular-book-c.woff │ │ │ ├── open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.eot │ │ │ ├── open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.ttf │ │ │ ├── open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.woff │ │ │ └── open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.woff2 │ │ ├── stylesheets │ │ │ ├── aui │ │ │ │ ├── arrow.png │ │ │ │ ├── wait.gif │ │ │ │ ├── bg-grippy.png │ │ │ │ ├── fav_off_16.png │ │ │ │ ├── fav_on_16.png │ │ │ │ ├── icons_form.gif │ │ │ │ ├── atlassian-icons.eot │ │ │ │ ├── atlassian-icons.ttf │ │ │ │ ├── aui-icon-close.png │ │ │ │ ├── aui-icon-tools.gif │ │ │ │ ├── bg-000-trans20.png │ │ │ │ ├── bg-000-trans50.png │ │ │ │ ├── core │ │ │ │ │ ├── icon-move.png │ │ │ │ │ ├── icon-move-d.png │ │ │ │ │ ├── icon-search.png │ │ │ │ │ ├── icon-dropdown-d.png │ │ │ │ │ ├── icon-dropdown.png │ │ │ │ │ ├── icon-maximize-d.png │ │ │ │ │ ├── icon-maximize.png │ │ │ │ │ ├── icon-minimize-d.png │ │ │ │ │ ├── icon-minimize.png │ │ │ │ │ ├── icon-dropdown-active.png │ │ │ │ │ └── icon-dropdown-active-d.png │ │ │ │ ├── forms │ │ │ │ │ ├── icon-date.png │ │ │ │ │ ├── icon-help.png │ │ │ │ │ ├── icon-range.png │ │ │ │ │ ├── icon-users.png │ │ │ │ │ ├── icons_form.gif │ │ │ │ │ └── icon-required.png │ │ │ │ ├── atlassian-icons.woff │ │ │ │ ├── aui-toolbar-24px.png │ │ │ │ ├── icons │ │ │ │ │ ├── aui-icon-close.png │ │ │ │ │ ├── aui-icon-tools.gif │ │ │ │ │ ├── core │ │ │ │ │ │ ├── icon-move.png │ │ │ │ │ │ ├── icon-move-d.png │ │ │ │ │ │ ├── icon-search.png │ │ │ │ │ │ ├── icon-dropdown.png │ │ │ │ │ │ ├── icon-maximize.png │ │ │ │ │ │ ├── icon-minimize.png │ │ │ │ │ │ ├── icon-dropdown-d.png │ │ │ │ │ │ ├── icon-maximize-d.png │ │ │ │ │ │ ├── icon-minimize-d.png │ │ │ │ │ │ ├── icon-dropdown-active.png │ │ │ │ │ │ └── icon-dropdown-active-d.png │ │ │ │ │ ├── forms │ │ │ │ │ │ ├── icon-date.png │ │ │ │ │ │ ├── icon-help.png │ │ │ │ │ │ ├── icon-range.png │ │ │ │ │ │ ├── icon-users.png │ │ │ │ │ │ └── icon-required.png │ │ │ │ │ ├── messages │ │ │ │ │ │ ├── icon-close.png │ │ │ │ │ │ ├── icon-error.png │ │ │ │ │ │ ├── icon-hint.png │ │ │ │ │ │ ├── icon-info.png │ │ │ │ │ │ ├── icon-generic.png │ │ │ │ │ │ ├── icon-success.png │ │ │ │ │ │ ├── icon-warning.png │ │ │ │ │ │ ├── icon-error-white.png │ │ │ │ │ │ └── icon-close-inverted.png │ │ │ │ │ └── aui-message-icon-sprite.png │ │ │ │ ├── messages │ │ │ │ │ ├── icon-close.png │ │ │ │ │ ├── icon-error.png │ │ │ │ │ ├── icon-hint.png │ │ │ │ │ ├── icon-info.png │ │ │ │ │ ├── icon-generic.png │ │ │ │ │ ├── icon-success.png │ │ │ │ │ ├── icon-warning.png │ │ │ │ │ ├── icon-error-white.png │ │ │ │ │ └── icon-close-inverted.png │ │ │ │ ├── aui-message-icon-sprite.png │ │ │ │ ├── toolbar │ │ │ │ │ ├── aui-toolbar-24px.png │ │ │ │ │ ├── aui-toolbar-button-active-bg.png │ │ │ │ │ └── aui-toolbar-button-inactive-bg.png │ │ │ │ ├── aui-toolbar-button-active-bg.png │ │ │ │ └── aui-toolbar-button-inactive-bg.png │ │ │ ├── popup.less │ │ │ └── main.less │ │ └── svg │ │ │ ├── filter-blue.svg │ │ │ ├── chevron-down-white.svg │ │ │ ├── chevron-down.svg │ │ │ ├── stop-icon.svg │ │ │ ├── stopHoverNew.svg │ │ │ ├── stop.svg │ │ │ ├── stop-new.svg │ │ │ ├── stopHover.svg │ │ │ ├── filter.svg │ │ │ ├── stop-white.svg │ │ │ ├── play.svg │ │ │ ├── play--hover.svg │ │ │ ├── stop-dark-blue.svg │ │ │ ├── stopwatch.svg │ │ │ └── account-box.svg │ ├── utils │ │ ├── data │ │ │ ├── svg │ │ │ │ └── index.js │ │ │ └── assets │ │ │ │ └── index.js │ │ ├── jiraColors-util │ │ │ └── index.js │ │ ├── time-util │ │ │ └── index.js │ │ ├── random.js │ │ ├── timer-helper │ │ │ └── index.js │ │ ├── preload │ │ │ └── index.js │ │ ├── stat.js │ │ └── external-open-util │ │ │ └── index.js │ ├── components │ │ ├── FeatureHighlight │ │ │ ├── index.jsx │ │ │ └── styled │ │ │ │ └── index.js │ │ ├── Img │ │ │ ├── index.jsx │ │ │ └── Img.jsx │ │ ├── Flex │ │ │ ├── index.jsx │ │ │ ├── Flex.jsx │ │ │ └── styled │ │ │ │ └── index.jsx │ │ ├── Calendar │ │ │ └── index.jsx │ │ ├── TextField │ │ │ ├── index.jsx │ │ │ └── TextField.jsx │ │ ├── SingleSelect │ │ │ └── index.jsx │ │ ├── ReduxFormComponents │ │ │ ├── index.jsx │ │ │ ├── Input.jsx │ │ │ └── UnderlineInput.jsx │ │ ├── ErrorBoundary │ │ │ └── index.jsx │ │ ├── AttachmentPopup │ │ │ ├── index.jsx │ │ │ ├── DownloadAttachment │ │ │ │ ├── index.jsx │ │ │ │ ├── styled │ │ │ │ │ └── index.js │ │ │ │ └── DownloadAttachment.jsx │ │ │ ├── LoaderAttachment │ │ │ │ ├── index.jsx │ │ │ │ ├── styled │ │ │ │ │ └── index.js │ │ │ │ └── LoaderAttachmentPopup.jsx │ │ │ └── AttachmentsList │ │ │ │ ├── styled │ │ │ │ └── index.js │ │ │ │ └── AttachmentsList.jsx │ │ ├── Virtualized │ │ │ ├── index.jsx │ │ │ ├── AutosizableList.jsx │ │ │ └── InfiniteLoadingList.jsx │ │ ├── Placeholders │ │ │ ├── IssueItemPlaceholder │ │ │ │ ├── index.jsx │ │ │ │ └── IssueItemPlaceholder.jsx │ │ │ ├── IssueViewPlaceholder │ │ │ │ ├── index.jsx │ │ │ │ ├── IssueViewPlaceholder.jsx │ │ │ │ └── styled │ │ │ │ │ └── index.jsx │ │ │ ├── IssueCommentPlaceholder │ │ │ │ ├── index.jsx │ │ │ │ └── IssueCommentPlaceholder.jsx │ │ │ ├── RecentItemsPlaceholder │ │ │ │ ├── index.jsx │ │ │ │ ├── styled │ │ │ │ │ └── index.jsx │ │ │ │ └── RecentItemsPlaceholder.jsx │ │ │ ├── index.jsx │ │ │ └── styled │ │ │ │ └── index.js │ │ ├── RemainingEstimatePicker │ │ │ └── styled │ │ │ │ └── index.js │ │ ├── DescriptionSectionAttachment │ │ │ └── index.jsx │ │ └── index.jsx │ ├── actions │ │ ├── actionTypes │ │ │ ├── filters.js │ │ │ ├── profile.js │ │ │ ├── settings.js │ │ │ ├── sprints.js │ │ │ ├── projects.js │ │ │ ├── resources.js │ │ │ ├── attachments.js │ │ │ ├── auth.js │ │ │ ├── worklogs.js │ │ │ ├── timer.js │ │ │ ├── index.js │ │ │ ├── ui.js │ │ │ ├── issues.js │ │ │ └── screenshots.js │ │ ├── filters.js │ │ ├── settings.js │ │ ├── sprints.js │ │ ├── projects.js │ │ ├── profile.js │ │ ├── attachments.js │ │ ├── updater.js │ │ ├── resources.js │ │ ├── worklogs.js │ │ ├── index.js │ │ └── auth.js │ ├── containers │ │ ├── Main │ │ │ ├── index.js │ │ │ ├── styled │ │ │ │ └── index.js │ │ │ └── Main.jsx │ │ ├── Header │ │ │ └── index.js │ │ ├── Sidebar │ │ │ ├── index.js │ │ │ ├── SidebarIssues │ │ │ │ ├── Filters │ │ │ │ │ ├── index.js │ │ │ │ │ └── FilterOption │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── styled │ │ │ │ │ │ └── index.jsx │ │ │ │ │ │ └── FilterOption.jsx │ │ │ │ ├── IssueItem │ │ │ │ │ └── index.js │ │ │ │ ├── NoIssues │ │ │ │ │ ├── index.js │ │ │ │ │ ├── NoIssues.jsx │ │ │ │ │ └── styled │ │ │ │ │ │ └── index.jsx │ │ │ │ ├── index.js │ │ │ │ ├── IssuesHeader │ │ │ │ │ └── index.js │ │ │ │ └── styled │ │ │ │ │ └── index.jsx │ │ │ ├── SidebarRecentWorklogs │ │ │ │ ├── NoWorklogs │ │ │ │ │ ├── index.js │ │ │ │ │ ├── NoWorklogs.jsx │ │ │ │ │ └── styled │ │ │ │ │ │ └── index.jsx │ │ │ │ ├── WorklogItem │ │ │ │ │ └── index.js │ │ │ │ ├── TimestampItem │ │ │ │ │ ├── index.js │ │ │ │ │ ├── styled │ │ │ │ │ │ └── index.jsx │ │ │ │ │ └── TimestampItem.jsx │ │ │ │ ├── index.js │ │ │ │ └── styled │ │ │ │ │ └── index.jsx │ │ │ └── IssuesSourcePicker │ │ │ │ ├── index.js │ │ │ │ └── styled │ │ │ │ └── index.jsx │ │ ├── AuthForm │ │ │ ├── index.js │ │ │ ├── TeamStep │ │ │ │ └── index.jsx │ │ │ ├── AccountsStep │ │ │ │ ├── index.jsx │ │ │ │ └── AccountsStep.jsx │ │ │ ├── AuthDebugger │ │ │ │ └── index.jsx │ │ │ ├── SelfHostLoginStep │ │ │ │ └── index.jsx │ │ │ ├── CloudLoginStep │ │ │ │ └── index.js │ │ │ └── utils.js │ │ ├── IssueView │ │ │ ├── index.js │ │ │ ├── DataRenderer │ │ │ │ └── index.js │ │ │ ├── IssueDetails │ │ │ │ └── index.js │ │ │ ├── IssueComments │ │ │ │ └── index.jsx │ │ │ ├── IssueWorklogs │ │ │ │ ├── index.jsx │ │ │ │ ├── WorklogItem │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styled │ │ │ │ │ │ └── index.jsx │ │ │ │ └── styled │ │ │ │ │ └── index.jsx │ │ │ ├── IssueReport │ │ │ │ ├── index.jsx │ │ │ │ ├── MetaColumn │ │ │ │ │ └── StatisticsColumn │ │ │ │ │ │ └── styled │ │ │ │ │ │ └── index.jsx │ │ │ │ └── MainColumn │ │ │ │ │ ├── StatisticsRow │ │ │ │ │ ├── styled │ │ │ │ │ │ └── index.jsx │ │ │ │ │ └── StatisticsRow.jsx │ │ │ │ │ └── ProgressBar │ │ │ │ │ ├── ProgressBarFill.jsx │ │ │ │ │ └── styled │ │ │ │ │ └── index.jsx │ │ │ ├── TrackingBar │ │ │ │ ├── index.jsx │ │ │ │ ├── WorklogCommentDialog │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styled │ │ │ │ │ │ └── index.jsx │ │ │ │ └── ProgressBar │ │ │ │ │ └── styled │ │ │ │ │ └── index.jsx │ │ │ ├── IssueViewTabs │ │ │ │ ├── index.jsx │ │ │ │ ├── styled │ │ │ │ │ └── index.jsx │ │ │ │ └── IssueViewTabs.jsx │ │ │ └── IssueViewHeader │ │ │ │ └── index.jsx │ │ ├── Popups │ │ │ ├── IdlePopup │ │ │ │ ├── index.js │ │ │ │ └── styled │ │ │ │ │ └── index.jsx │ │ │ ├── AttachmentPopup │ │ │ │ └── index.js │ │ │ ├── ScreenshotsViewerPopup │ │ │ │ ├── WorklogReport │ │ │ │ │ └── index.js │ │ │ │ ├── ActivityReport │ │ │ │ │ └── index.js │ │ │ │ ├── index.js │ │ │ │ ├── ScreenshotsSection │ │ │ │ │ └── index.js │ │ │ │ └── styled │ │ │ │ │ └── index.js │ │ │ └── ScreenshotNotificationPopup │ │ │ │ ├── index.js │ │ │ │ ├── styled │ │ │ │ └── index.jsx │ │ │ │ └── ScreenshotNotificationPopup.jsx │ │ ├── FlagsContainer │ │ │ ├── FlagHoc │ │ │ │ ├── index.jsx │ │ │ │ └── FlagHoc.jsx │ │ │ ├── index.jsx │ │ │ └── SpinnerContainer │ │ │ │ ├── index.js │ │ │ │ ├── SpinnerContainer.jsx │ │ │ │ └── styled │ │ │ │ └── index.js │ │ └── Modals │ │ │ ├── AlertModal │ │ │ ├── index.js │ │ │ └── styled │ │ │ │ └── index.jsx │ │ │ ├── WorklogModal │ │ │ ├── index.jsx │ │ │ └── styled │ │ │ │ └── index.jsx │ │ │ ├── SettingsModal │ │ │ ├── index.js │ │ │ ├── General │ │ │ │ ├── index.js │ │ │ │ └── styled │ │ │ │ │ └── index.jsx │ │ │ ├── Update │ │ │ │ ├── index.js │ │ │ │ └── styled │ │ │ │ │ └── index.jsx │ │ │ ├── ScreenshotsSettings │ │ │ │ ├── index.js │ │ │ │ └── styled │ │ │ │ │ └── index.jsx │ │ │ └── styled │ │ │ │ └── index.jsx │ │ │ ├── ConfirmDeleteWorklogModal │ │ │ └── index.js │ │ │ ├── SaveWorklogInetIssueModal │ │ │ ├── index.js │ │ │ └── styled │ │ │ │ └── index.jsx │ │ │ └── index.js │ ├── store.js │ ├── types │ │ ├── options.js │ │ ├── epics.js │ │ ├── issuesReports.js │ │ ├── boards.js │ │ ├── issuesTypes.js │ │ ├── resources.js │ │ ├── issuesComments.js │ │ ├── issuesStatuses.js │ │ ├── sprints.js │ │ ├── projects.js │ │ ├── auth.js │ │ ├── profile.js │ │ ├── worklogs.js │ │ ├── filters.js │ │ ├── settings.js │ │ └── issues.js │ ├── index.tpl.html │ ├── idlePopup.tpl.html │ ├── selectors │ │ ├── timer.js │ │ ├── index.js │ │ ├── profile.js │ │ └── sprints.js │ ├── attachmentWindow.tpl.html │ ├── styles │ │ ├── modals │ │ │ └── index.jsx │ │ └── animations │ │ │ └── index.jsx │ ├── screenshotsViewer.tpl.html │ ├── screenshotNotification.tpl.html │ ├── store │ │ ├── configureStore.js │ │ ├── configureStore.production.js │ │ ├── configureStore.development.js │ │ └── configurePreloadStore.js │ ├── sagas │ │ ├── worklogTypes.js │ │ └── ipc.js │ └── reducers │ │ ├── profile.js │ │ └── resourcesPlugins │ │ ├── metaPlugin.js │ │ ├── clearListPlugin.js │ │ └── clearAllPlugin.js ├── shared │ ├── utils │ │ ├── index.js │ │ └── is-electron-renderer.js │ ├── reducers │ │ └── index.js │ ├── sagas │ │ └── index.js │ └── actions │ │ ├── index.js │ │ ├── ui.js │ │ ├── timer.js │ │ ├── tray.js │ │ └── windowsManager.js ├── main │ ├── store.js │ ├── reducers │ │ └── index.js │ ├── sagas │ │ └── index.js │ └── store │ │ └── configureStore.js ├── config │ ├── index.js │ ├── config.testing.js │ ├── config.production.js │ └── config.development.js └── package.json ├── .eslintignore ├── dev-app-update.yml ├── resources ├── icon.icns ├── icon.ico ├── icon.png └── icons │ ├── 16x16.png │ ├── 24x24.png │ ├── 32x32.png │ ├── 48x48.png │ ├── 64x64.png │ ├── 128x128.png │ ├── 256x256.png │ ├── 512x512.png │ └── 1024x1024.png ├── PULL_REQUEST_TEMPLATE.md ├── flow-typed └── npm │ ├── flow-bin_v0.x.x.js │ ├── smoothscroll-polyfill_v0.x.x.js │ ├── font-awesome_vx.x.x.js │ ├── calculate-size_vx.x.x.js │ ├── electron-debug_vx.x.x.js │ ├── @babel │ ├── preset-flow_vx.x.x.js │ ├── preset-react_vx.x.x.js │ ├── plugin-external-helpers_vx.x.x.js │ ├── plugin-proposal-do-expressions_vx.x.x.js │ ├── plugin-proposal-class-properties_vx.x.x.js │ ├── plugin-proposal-optional-chaining_vx.x.x.js │ ├── plugin-proposal-export-default-from_vx.x.x.js │ └── plugin-proposal-export-namespace-from_vx.x.x.js │ ├── webpack-sentry-plugin_vx.x.x.js │ ├── write-file-webpack-plugin_vx.x.x.js │ ├── bufferutil_vx.x.x.js │ ├── file-loader_vx.x.x.js │ ├── nanotimer_vx.x.x.js │ ├── merge-images_vx.x.x.js │ └── babel-plugin-import_vx.x.x.js ├── ISSUE_TEMPLATE.md ├── .editorconfig ├── scripts ├── release.sh └── dockerBuild.sh ├── dockerBuild.sh ├── afterPack.js ├── .gitignore ├── LICENSE.md └── babel.config.js /.czrc: -------------------------------------------------------------------------------- 1 | { "path": "cz-customizable" } 2 | -------------------------------------------------------------------------------- /app/renderer/assets/stub.js: -------------------------------------------------------------------------------- 1 | export default {}; 2 | -------------------------------------------------------------------------------- /app/renderer/utils/data/svg/index.js: -------------------------------------------------------------------------------- 1 | export * from '../../../assets/svg'; 2 | -------------------------------------------------------------------------------- /app/shared/utils/index.js: -------------------------------------------------------------------------------- 1 | export isRenderer from './is-electron-renderer'; 2 | -------------------------------------------------------------------------------- /app/renderer/utils/data/assets/index.js: -------------------------------------------------------------------------------- 1 | export * from '../../../assets/images'; 2 | -------------------------------------------------------------------------------- /app/renderer/utils/jiraColors-util/index.js: -------------------------------------------------------------------------------- 1 | export * from './lib/jiraColors'; 2 | -------------------------------------------------------------------------------- /app/shared/reducers/index.js: -------------------------------------------------------------------------------- 1 | export windowsManager from './windowsManager'; 2 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | flow-typed/ 2 | app/dist/ 3 | app/main.js 4 | node_modules 5 | dll 6 | -------------------------------------------------------------------------------- /app/shared/sagas/index.js: -------------------------------------------------------------------------------- 1 | export * as windowsManagerSagas from './windowsManager'; 2 | -------------------------------------------------------------------------------- /dev-app-update.yml: -------------------------------------------------------------------------------- 1 | owner: web-pal 2 | repo: chronos-timetracker 3 | provider: github 4 | -------------------------------------------------------------------------------- /app/renderer/utils/time-util/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | export { jts, stj } from './lib/time'; 3 | -------------------------------------------------------------------------------- /app/renderer/components/FeatureHighlight/index.jsx: -------------------------------------------------------------------------------- 1 | export default from './FeatureHighlight'; 2 | -------------------------------------------------------------------------------- /app/renderer/components/Img/index.jsx: -------------------------------------------------------------------------------- 1 | import Img from './Img'; 2 | 3 | export default Img; 4 | -------------------------------------------------------------------------------- /app/renderer/components/Flex/index.jsx: -------------------------------------------------------------------------------- 1 | import Flex from './Flex'; 2 | 3 | export default Flex; 4 | -------------------------------------------------------------------------------- /resources/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icon.icns -------------------------------------------------------------------------------- /resources/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icon.ico -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icon.png -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/filters.js: -------------------------------------------------------------------------------- 1 | export const SAVE_FILTER_REQUEST = 'SAVE_FILTER_REQUEST'; 2 | -------------------------------------------------------------------------------- /app/renderer/components/Flex/Flex.jsx: -------------------------------------------------------------------------------- 1 | import { Flex } from './styled'; 2 | 3 | export default Flex; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/Main/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import Main from './Main'; 3 | 4 | export default Main; 5 | -------------------------------------------------------------------------------- /resources/icons/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icons/16x16.png -------------------------------------------------------------------------------- /resources/icons/24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icons/24x24.png -------------------------------------------------------------------------------- /resources/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icons/32x32.png -------------------------------------------------------------------------------- /resources/icons/48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icons/48x48.png -------------------------------------------------------------------------------- /resources/icons/64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icons/64x64.png -------------------------------------------------------------------------------- /app/renderer/components/Calendar/index.jsx: -------------------------------------------------------------------------------- 1 | import Calendar from './Calendar'; 2 | 3 | export default Calendar; 4 | -------------------------------------------------------------------------------- /resources/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icons/128x128.png -------------------------------------------------------------------------------- /resources/icons/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icons/256x256.png -------------------------------------------------------------------------------- /resources/icons/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icons/512x512.png -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/profile.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export const FILL_USER_DATA = 'profile/FILL_USER_DATA'; 4 | -------------------------------------------------------------------------------- /app/renderer/components/TextField/index.jsx: -------------------------------------------------------------------------------- 1 | import TextField from './TextField'; 2 | 3 | export default TextField; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/Header/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import Header from './Header'; 3 | 4 | export default Header; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import Sidebar from './Sidebar'; 3 | 4 | export default Sidebar; 5 | -------------------------------------------------------------------------------- /resources/icons/1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/resources/icons/1024x1024.png -------------------------------------------------------------------------------- /app/renderer/containers/AuthForm/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import AuthForm from './AuthForm'; 3 | 4 | export default AuthForm; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/images/cog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/cog.png -------------------------------------------------------------------------------- /app/renderer/assets/images/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/file.png -------------------------------------------------------------------------------- /app/renderer/assets/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/icon.png -------------------------------------------------------------------------------- /app/renderer/assets/images/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/play.png -------------------------------------------------------------------------------- /app/renderer/assets/images/stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/stop.png -------------------------------------------------------------------------------- /app/renderer/components/SingleSelect/index.jsx: -------------------------------------------------------------------------------- 1 | import SingleSelect from './SingleSelect'; 2 | 3 | export default SingleSelect; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import IssueView from './IssueView'; 3 | 4 | export default IssueView; 5 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/settings.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export const CLEAR_ELECTRON_CACHE = 'settings/CLEAR_ELECTRON_CACHE'; 4 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/sprints.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export const FETCH_SPRINTS_REQUEST = 'projects/FETCH_SPRINTS_REQUEST'; 4 | -------------------------------------------------------------------------------- /app/renderer/assets/images/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/camera.png -------------------------------------------------------------------------------- /app/renderer/assets/images/logout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/logout.png -------------------------------------------------------------------------------- /app/renderer/assets/images/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/search.png -------------------------------------------------------------------------------- /app/renderer/assets/images/tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/tasks.png -------------------------------------------------------------------------------- /app/renderer/components/ReduxFormComponents/index.jsx: -------------------------------------------------------------------------------- 1 | export Input from './Input'; 2 | export UnderlineInput from './UnderlineInput'; 3 | -------------------------------------------------------------------------------- /app/renderer/containers/AuthForm/TeamStep/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import TeamStep from './TeamStep'; 3 | 4 | export default TeamStep; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Popups/IdlePopup/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import IdlePopup from './IdlePopup'; 3 | 4 | export default IdlePopup; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/images/camera@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/camera@2x.png -------------------------------------------------------------------------------- /app/renderer/assets/images/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/icon@2x.png -------------------------------------------------------------------------------- /app/renderer/assets/images/logout@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/logout@2x.png -------------------------------------------------------------------------------- /app/renderer/assets/images/no-issues.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/no-issues.png -------------------------------------------------------------------------------- /app/renderer/assets/images/play@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/play@2x.png -------------------------------------------------------------------------------- /app/renderer/assets/images/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/refresh.png -------------------------------------------------------------------------------- /app/renderer/assets/images/search@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/search@2x.png -------------------------------------------------------------------------------- /app/renderer/assets/images/stop@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/stop@2x.png -------------------------------------------------------------------------------- /app/renderer/containers/FlagsContainer/FlagHoc/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import FlagHoc from './FlagHoc'; 3 | 4 | export default FlagHoc; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/DataRenderer/index.js: -------------------------------------------------------------------------------- 1 | import DataRenderer from './DataRenderer'; 2 | 3 | export default DataRenderer; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueDetails/index.js: -------------------------------------------------------------------------------- 1 | import IssueDetails from './IssueDetails'; 2 | 3 | export default IssueDetails; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/AlertModal/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import AlertModal from './AlertModal'; 3 | 4 | export default AlertModal; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/images/guidelines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/guidelines.png -------------------------------------------------------------------------------- /app/renderer/assets/images/icon-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/icon-active.png -------------------------------------------------------------------------------- /app/renderer/assets/images/left-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/left-arrow.png -------------------------------------------------------------------------------- /app/renderer/assets/images/logo256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/logo256x256.png -------------------------------------------------------------------------------- /app/renderer/assets/images/refresh@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/refresh@2x.png -------------------------------------------------------------------------------- /app/renderer/assets/images/rigth-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/rigth-arrow.png -------------------------------------------------------------------------------- /app/renderer/assets/images/transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/transparent.png -------------------------------------------------------------------------------- /app/renderer/assets/images/trash-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/trash-icon.png -------------------------------------------------------------------------------- /app/renderer/assets/images/user-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/user-avatar.png -------------------------------------------------------------------------------- /app/renderer/components/ErrorBoundary/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import ErrorBoundary from './ErrorBoundary'; 3 | 4 | export default ErrorBoundary; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueComments/index.jsx: -------------------------------------------------------------------------------- 1 | import IssueComments from './IssueComments'; 2 | 3 | export default IssueComments; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueWorklogs/index.jsx: -------------------------------------------------------------------------------- 1 | import IssueWorklogs from './IssueWorklogs'; 2 | 3 | export default IssueWorklogs; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/Filters/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import Filters from './Filters'; 3 | 4 | export default Filters; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/fonts/OpenSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/fonts/OpenSans-Bold.ttf -------------------------------------------------------------------------------- /app/renderer/assets/fonts/OpenSans-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/fonts/OpenSans-Light.ttf -------------------------------------------------------------------------------- /app/renderer/assets/images/Logo-shadowed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/Logo-shadowed.png -------------------------------------------------------------------------------- /app/renderer/assets/images/download_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/download_icon.png -------------------------------------------------------------------------------- /app/renderer/assets/images/triangle-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/triangle-right.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/arrow.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/wait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/wait.gif -------------------------------------------------------------------------------- /app/renderer/containers/AuthForm/AccountsStep/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import AccountsStep from './AccountsStep'; 3 | 4 | export default AccountsStep; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/AuthForm/AuthDebugger/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import AuthDebugger from './AuthDebugger'; 3 | 4 | export default AuthDebugger; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/FlagsContainer/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import FlagsContainer from './FlagsContainer'; 3 | 4 | export default FlagsContainer; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueReport/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import IssueReport from './IssueReport'; 3 | 4 | export default IssueReport; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/TrackingBar/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import TrackingBar from './TrackingBar'; 3 | 4 | export default TrackingBar; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/WorklogModal/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import WorklogModal from './WorklogModal'; 3 | 4 | export default WorklogModal; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/IssueItem/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import IssueItem from './IssueItem'; 3 | 4 | export default IssueItem; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/NoIssues/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import NoIssues from './NoIssues'; 3 | 4 | export default NoIssues; 5 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/projects.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export const FETCH_PROJECT_STATUSES_REQUEST = 'projects/FETCH_PROJECT_STATUSES_REQUEST'; 4 | -------------------------------------------------------------------------------- /app/renderer/assets/fonts/OpenSans-Semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/fonts/OpenSans-Semibold.ttf -------------------------------------------------------------------------------- /app/renderer/containers/AuthForm/SelfHostLoginStep/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import SelfHostStep from './SelfHostStep'; 3 | 4 | export default SelfHostStep; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueViewTabs/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import IssueViewTabs from './IssueViewTabs'; 3 | 4 | export default IssueViewTabs; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/SettingsModal/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import SettingsModal from './SettingsModal'; 3 | 4 | export default SettingsModal; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import SidebarIssues from './SidebarIssues'; 3 | 4 | export default SidebarIssues; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/images/button-surrounding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/button-surrounding.png -------------------------------------------------------------------------------- /app/renderer/assets/images/screenshot-deleted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/screenshot-deleted.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/bg-grippy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/bg-grippy.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/fav_off_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/fav_off_16.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/fav_on_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/fav_on_16.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons_form.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons_form.gif -------------------------------------------------------------------------------- /app/renderer/components/AttachmentPopup/index.jsx: -------------------------------------------------------------------------------- 1 | import AttachmentPopupComponent from './AttachmentPopup'; 2 | 3 | export default AttachmentPopupComponent; 4 | -------------------------------------------------------------------------------- /app/renderer/components/Virtualized/index.jsx: -------------------------------------------------------------------------------- 1 | export AutosizableList from './AutosizableList'; 2 | export InfiniteLoadingList from './InfiniteLoadingList'; 3 | -------------------------------------------------------------------------------- /app/renderer/containers/FlagsContainer/SpinnerContainer/index.js: -------------------------------------------------------------------------------- 1 | import SpinnerContainer from './SpinnerContainer'; 2 | 3 | export default SpinnerContainer; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/Popups/AttachmentPopup/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import AttachmentPopup from './AttachmentPopup'; 3 | 4 | export default AttachmentPopup; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/images/button-surrounding@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/button-surrounding@2x.png -------------------------------------------------------------------------------- /app/renderer/assets/images/camera-crossed-out@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/images/camera-crossed-out@2x.png -------------------------------------------------------------------------------- /app/renderer/containers/AuthForm/CloudLoginStep/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import CloudLoginStep from './CloudLoginStep'; 3 | 4 | export default CloudLoginStep; 5 | 6 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueViewHeader/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import IssueViewHeader from './IssueViewHeader'; 3 | 4 | export default IssueViewHeader; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueWorklogs/WorklogItem/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import WorklogItem from './WorklogItem'; 3 | 4 | export default WorklogItem; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/SettingsModal/General/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import GeneralSettings from './GeneralSettings'; 3 | 4 | export default GeneralSettings; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/SettingsModal/Update/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import UpdateSettings from './UpdateSettings'; 3 | 4 | export default UpdateSettings; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/IssuesHeader/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import IssuesHeader from './IssuesHeader'; 3 | 4 | export default IssuesHeader; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarRecentWorklogs/NoWorklogs/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import NoWorklogs from './NoWorklogs'; 3 | 4 | export default NoWorklogs; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/fonts/lineto-circular-bold-c.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/fonts/lineto-circular-bold-c.woff -------------------------------------------------------------------------------- /app/renderer/assets/fonts/lineto-circular-book-c.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/fonts/lineto-circular-book-c.woff -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/atlassian-icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/atlassian-icons.eot -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/atlassian-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/atlassian-icons.ttf -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/aui-icon-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/aui-icon-close.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/aui-icon-tools.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/aui-icon-tools.gif -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/bg-000-trans20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/bg-000-trans20.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/bg-000-trans50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/bg-000-trans50.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-move.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-move.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/forms/icon-date.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/forms/icon-date.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/forms/icon-help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/forms/icon-help.png -------------------------------------------------------------------------------- /app/renderer/components/AttachmentPopup/DownloadAttachment/index.jsx: -------------------------------------------------------------------------------- 1 | import DownloadAttachment from './DownloadAttachment'; 2 | 3 | export default DownloadAttachment; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/Filters/FilterOption/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import FilterOption from './FilterOption'; 3 | 4 | export default FilterOption; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarRecentWorklogs/WorklogItem/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import WorklogItem from './WorklogItem'; 3 | 4 | export default WorklogItem; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/atlassian-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/atlassian-icons.woff -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/aui-toolbar-24px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/aui-toolbar-24px.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-move-d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-move-d.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-search.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/forms/icon-range.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/forms/icon-range.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/forms/icon-users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/forms/icon-users.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/forms/icons_form.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/forms/icons_form.gif -------------------------------------------------------------------------------- /app/renderer/components/AttachmentPopup/LoaderAttachment/index.jsx: -------------------------------------------------------------------------------- 1 | import LoaderAttachmentPopup from './LoaderAttachmentPopup'; 2 | 3 | export default LoaderAttachmentPopup; 4 | -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/IssueItemPlaceholder/index.jsx: -------------------------------------------------------------------------------- 1 | import IssueItemPlaceholder from './IssueItemPlaceholder'; 2 | 3 | export default IssueItemPlaceholder; 4 | -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/IssueViewPlaceholder/index.jsx: -------------------------------------------------------------------------------- 1 | import IssueViewPlaceholder from './IssueViewPlaceholder'; 2 | 3 | export default IssueViewPlaceholder; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/Popups/ScreenshotsViewerPopup/WorklogReport/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import WorklogReport from './WorklogReport'; 3 | 4 | export default WorklogReport; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/IssuesSourcePicker/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import IssuesSourcePicker from './IssuesSourcePicker'; 3 | 4 | export default IssuesSourcePicker; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarRecentWorklogs/TimestampItem/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import TimestampItem from './TimestampItem'; 3 | 4 | export default TimestampItem; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-dropdown-d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-dropdown-d.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-dropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-dropdown.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-maximize-d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-maximize-d.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-maximize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-maximize.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-minimize-d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-minimize-d.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-minimize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-minimize.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/forms/icon-required.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/forms/icon-required.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/aui-icon-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/aui-icon-close.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/aui-icon-tools.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/aui-icon-tools.gif -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-move.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-move.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/messages/icon-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/messages/icon-close.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/messages/icon-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/messages/icon-error.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/messages/icon-hint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/messages/icon-hint.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/messages/icon-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/messages/icon-info.png -------------------------------------------------------------------------------- /app/renderer/containers/Popups/ScreenshotsViewerPopup/ActivityReport/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import ActivityReport from './ActivityReport'; 3 | 4 | export default ActivityReport; 5 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/resources.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export const CLEAR_RESOURCES_LIST = 'resources/CLEAR_LIST'; 4 | export const SET_RESOURCES_META = 'resources/SET_META'; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-move-d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-move-d.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-search.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/forms/icon-date.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/forms/icon-date.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/forms/icon-help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/forms/icon-help.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/forms/icon-range.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/forms/icon-range.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/forms/icon-users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/forms/icon-users.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/messages/icon-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/messages/icon-generic.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/messages/icon-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/messages/icon-success.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/messages/icon-warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/messages/icon-warning.png -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/IssueCommentPlaceholder/index.jsx: -------------------------------------------------------------------------------- 1 | import IssueCommentPlaceholder from './IssueCommentPlaceholder'; 2 | 3 | export default IssueCommentPlaceholder; 4 | -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/RecentItemsPlaceholder/index.jsx: -------------------------------------------------------------------------------- 1 | import RecentItemsPlaceholder from './RecentItemsPlaceholder'; 2 | 3 | export default RecentItemsPlaceholder; 4 | -------------------------------------------------------------------------------- /app/renderer/components/RemainingEstimatePicker/styled/index.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const InputExample = styled.span` 4 | margin-left: 5px; 5 | `; 6 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarRecentWorklogs/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import SidebarRecentWorklogs from './SidebarRecentWorklogs'; 3 | 4 | export default SidebarRecentWorklogs; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/aui-message-icon-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/aui-message-icon-sprite.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-dropdown-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-dropdown-active.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-dropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-dropdown.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-maximize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-maximize.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-minimize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-minimize.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/forms/icon-required.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/forms/icon-required.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/messages/icon-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/messages/icon-close.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/messages/icon-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/messages/icon-error.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/messages/icon-hint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/messages/icon-hint.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/messages/icon-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/messages/icon-info.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/messages/icon-error-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/messages/icon-error-white.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/toolbar/aui-toolbar-24px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/toolbar/aui-toolbar-24px.png -------------------------------------------------------------------------------- /app/renderer/containers/Modals/SettingsModal/ScreenshotsSettings/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import ScreenshotsSettings from './ScreenshotsSettings'; 3 | 4 | export default ScreenshotsSettings; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Popups/ScreenshotsViewerPopup/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import ScreenshotsViewerPopup from './ScreenshotsViewerPopup'; 3 | 4 | export default ScreenshotsViewerPopup; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/core/icon-dropdown-active-d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/core/icon-dropdown-active-d.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-dropdown-d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-dropdown-d.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-maximize-d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-maximize-d.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-minimize-d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-minimize-d.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/messages/icon-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/messages/icon-generic.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/messages/icon-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/messages/icon-success.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/messages/icon-warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/messages/icon-warning.png -------------------------------------------------------------------------------- /app/renderer/components/DescriptionSectionAttachment/index.jsx: -------------------------------------------------------------------------------- 1 | import DescriptionSectionAttachment from './DescriptionSectionAttacment'; 2 | 3 | export default DescriptionSectionAttachment; 4 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/TrackingBar/WorklogCommentDialog/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import WorklogCommentDialog from './WorklogCommentDialog'; 3 | 4 | export default WorklogCommentDialog; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Popups/ScreenshotsViewerPopup/ScreenshotsSection/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import ScreenshotsSection from './ScreenshotsSection'; 3 | 4 | export default ScreenshotsSection; 5 | -------------------------------------------------------------------------------- /app/renderer/utils/random.js: -------------------------------------------------------------------------------- 1 | // min and max included 2 | export function randomIntFromInterval(min, max) { 3 | return Math.floor( 4 | Math.random() * (max - min + 1) + min, 5 | ); 6 | } 7 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/aui-toolbar-button-active-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/aui-toolbar-button-active-bg.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/aui-toolbar-button-inactive-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/aui-toolbar-button-inactive-bg.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/aui-message-icon-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/aui-message-icon-sprite.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/messages/icon-close-inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/messages/icon-close-inverted.png -------------------------------------------------------------------------------- /app/renderer/containers/Modals/ConfirmDeleteWorklogModal/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import ConfirmDeleteWorklogModal from './ConfirmDeleteWorklogModal'; 3 | 4 | export default ConfirmDeleteWorklogModal; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/SaveWorklogInetIssueModal/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import SaveWorklogInetIssueModal from './SaveWorklogInetIssueModal'; 3 | 4 | export default SaveWorklogInetIssueModal; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-dropdown-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-dropdown-active.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/messages/icon-error-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/messages/icon-error-white.png -------------------------------------------------------------------------------- /app/main/store.js: -------------------------------------------------------------------------------- 1 | import configureStore from './store/configureStore'; 2 | import rootSaga from './sagas'; 3 | 4 | const store = configureStore(); 5 | store.runSaga(rootSaga); 6 | 7 | export default store; 8 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/attachments.js: -------------------------------------------------------------------------------- 1 | export const NEXT_ATTACHMENT = 'NEXT_ATTACHMENT'; 2 | export const PREV_ATTACHMENT = 'PREV_ATTACHMENT'; 3 | export const SELECT_ATTACHMENT = 'SELECT_ATTACHMENT'; 4 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/core/icon-dropdown-active-d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/core/icon-dropdown-active-d.png -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/icons/messages/icon-close-inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/icons/messages/icon-close-inverted.png -------------------------------------------------------------------------------- /app/renderer/containers/Popups/ScreenshotNotificationPopup/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import ScreenshotNotificationPopup from './ScreenshotNotificationPopup'; 3 | 4 | export default ScreenshotNotificationPopup; 5 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/toolbar/aui-toolbar-button-active-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/toolbar/aui-toolbar-button-active-bg.png -------------------------------------------------------------------------------- /app/renderer/store.js: -------------------------------------------------------------------------------- 1 | import configureStore from './store/configureStore'; 2 | import rootSaga from './sagas'; 3 | 4 | const store = configureStore(); 5 | store.runSaga(rootSaga); 6 | 7 | export default store; 8 | -------------------------------------------------------------------------------- /app/renderer/types/options.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | Project, 4 | } from './'; 5 | 6 | export type SelectedOption = { 7 | content: string, 8 | meta: Project, 9 | value: string, 10 | }; 11 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/aui/toolbar/aui-toolbar-button-inactive-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/stylesheets/aui/toolbar/aui-toolbar-button-inactive-bg.png -------------------------------------------------------------------------------- /app/renderer/index.tpl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Chronos 6 | 7 | 8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | #### What's this PR do? 2 | #### Where should the reviewer start? 3 | #### How should this be manually tested? 4 | #### Any background context you want to provide? 5 | #### Screenshots (if appropriate) 6 | -------------------------------------------------------------------------------- /app/renderer/types/epics.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export type Epic = { 4 | id: string, 5 | self: string, 6 | name: string, 7 | summary: string, 8 | color: { 9 | key: string, 10 | }, 11 | done: boolean, 12 | }; 13 | -------------------------------------------------------------------------------- /app/renderer/utils/timer-helper/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export function randomInteger(min: number, max: number): number { 4 | const rand: number = (min - 0.5) + (Math.random() * ((max - min) + 1)); 5 | return Math.round(rand); 6 | } 7 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const ListContainer = styled.div` 5 | height: 100%; 6 | backgroundColor: rgba(0, 255, 0, .5); 7 | flex: 1; 8 | `; 9 | -------------------------------------------------------------------------------- /app/renderer/idlePopup.tpl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Idle popup 6 | 7 | 8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /flow-typed/npm/flow-bin_v0.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583 2 | // flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x 3 | 4 | declare module "flow-bin" { 5 | declare module.exports: string; 6 | } 7 | -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Expected Behavior 2 | 3 | 4 | ## Actual Behavior 5 | 6 | 7 | ## Steps to Reproduce the Problem 8 | 9 | 1. 10 | 1. 11 | 1. 12 | 13 | ## Specifications 14 | 15 | - Chronos-timetracker version: 16 | - OS: 17 | -------------------------------------------------------------------------------- /app/renderer/components/Img/Img.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Img = ({ 4 | src, 5 | className, 6 | }) => stringForLinter; 7 | 8 | export default Img; 9 | -------------------------------------------------------------------------------- /app/renderer/selectors/timer.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | TimerState, 4 | } from 'types'; 5 | 6 | export const getTimerState = (key: string) => 7 | ({ 8 | timer, 9 | }: { 10 | timer: TimerState, 11 | }) => timer[key]; 12 | -------------------------------------------------------------------------------- /app/renderer/attachmentWindow.tpl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Attachments popup 6 | 7 | 8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /app/renderer/styles/modals/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ModalContentContainer = styled.div` 4 | `; 5 | 6 | export const DangerIcon = styled.img` 7 | margin-right: 5px; 8 | height: 18px; 9 | `; 10 | -------------------------------------------------------------------------------- /app/renderer/screenshotsViewer.tpl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Screenshots viewer popup 6 | 7 | 8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /app/renderer/actions/filters.js: -------------------------------------------------------------------------------- 1 | import * as types from './actionTypes'; 2 | 3 | export const saveFilterRequest = ({ 4 | name, 5 | jql, 6 | filterId, 7 | }) => ({ 8 | type: types.SAVE_FILTER_REQUEST, 9 | name, 10 | jql, 11 | filterId, 12 | }); 13 | -------------------------------------------------------------------------------- /app/shared/actions/index.js: -------------------------------------------------------------------------------- 1 | export * as actionTypes from './actionTypes'; 2 | 3 | export * as windowsManagerActions from './windowsManager'; 4 | export * as trayActions from './tray'; 5 | export * as timerActions from './timer'; 6 | export * as uiActions from './ui'; 7 | -------------------------------------------------------------------------------- /app/renderer/screenshotNotification.tpl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Screenshot notification popup 6 | 7 | 8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /app/renderer/actions/settings.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | SettingsAction, 4 | } from 'types'; 5 | 6 | import * as types from './actionTypes'; 7 | 8 | export const clearElectronCache = (): SettingsAction => ({ 9 | type: types.CLEAR_ELECTRON_CACHE, 10 | }); 11 | -------------------------------------------------------------------------------- /app/renderer/styles/animations/index.jsx: -------------------------------------------------------------------------------- 1 | import { keyframes } from 'styled-components'; 2 | 3 | export const placeholderShimmer = keyframes` 4 | 0%{ 5 | background-position: -468px 0 6 | } 7 | 8 | 100%{ 9 | background-position: 468px 0 10 | } 11 | `; 12 | -------------------------------------------------------------------------------- /app/main/reducers/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { 3 | combineReducers, 4 | } from 'redux'; 5 | import { 6 | windowsManager, 7 | } from 'shared/reducers'; 8 | 9 | const rootReducer = combineReducers({ 10 | windowsManager, 11 | }); 12 | 13 | export default rootReducer; 14 | -------------------------------------------------------------------------------- /app/renderer/actions/sprints.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | SprintsAction, 4 | } from 'types'; 5 | 6 | import * as types from './actionTypes'; 7 | 8 | 9 | export const fetchSprintsRequest = (): SprintsAction => ({ 10 | type: types.FETCH_SPRINTS_REQUEST, 11 | }); 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | 15 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/AlertModal/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ModalContent = styled.div` 4 | margin: 20px 4px; 5 | `; 6 | 7 | export const DangerIcon = styled.img` 8 | margin-right: 5px; 9 | height: 18px; 10 | `; 11 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/auth.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export const AUTH_REQUEST = 'auth/AUTH_REQUEST'; 4 | export const AUTH_SELF_HOST_REQUEST = 'auth/AUTH_SELF_HOST_REQUEST'; 5 | export const LOGOUT_REQUEST = 'auth/LOGOUT_REQUEST'; 6 | export const SWITCH_ACCOUNT = 'auth/SWITCH_ACCOUNT'; 7 | -------------------------------------------------------------------------------- /app/renderer/assets/fonts/open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/fonts/open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.eot -------------------------------------------------------------------------------- /app/renderer/assets/fonts/open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/fonts/open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.ttf -------------------------------------------------------------------------------- /app/renderer/assets/fonts/open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/fonts/open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.woff -------------------------------------------------------------------------------- /app/renderer/assets/fonts/open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web-pal/chronos-timetracker/HEAD/app/renderer/assets/fonts/open-sans-v13-greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext-regular.woff2 -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/index.jsx: -------------------------------------------------------------------------------- 1 | export IssueCommentPlaceholder from './IssueCommentPlaceholder'; 2 | export IssueItemPlaceholder from './IssueItemPlaceholder'; 3 | export IssueViewPlaceholder from './IssueViewPlaceholder'; 4 | export RecentItemsPlaceholder from './RecentItemsPlaceholder'; 5 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/SaveWorklogInetIssueModal/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ModalContent = styled.div` 4 | margin: 20px 4px; 5 | `; 6 | 7 | export const DangerIcon = styled.img` 8 | margin-right: 5px; 9 | height: 18px; 10 | `; 11 | -------------------------------------------------------------------------------- /app/renderer/assets/images/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable global-require */ 2 | export const logoShadowed = require('./Logo-shadowed.png'); 3 | export const userAvatar = require('./user-avatar.png'); 4 | export const noIssuesImage = require('./no-issues.png'); 5 | export const tasks = require('./tasks.png'); 6 | -------------------------------------------------------------------------------- /app/shared/actions/ui.js: -------------------------------------------------------------------------------- 1 | import { 2 | actionTypes, 3 | } from '.'; 4 | 5 | export const setModalState = ( 6 | modalName, 7 | state, 8 | ) => ({ 9 | type: actionTypes.SET_MODAL_STATE, 10 | scope: ['mainRenderer'], 11 | payload: { 12 | modalName, 13 | state, 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /app/renderer/actions/projects.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | ProjectsAction, 4 | } from 'types'; 5 | 6 | import * as actionTypes from './actionTypes'; 7 | 8 | 9 | export const fetchProjectStatusesRequest = (): ProjectsAction => ({ 10 | type: actionTypes.FETCH_PROJECT_STATUSES_REQUEST, 11 | }); 12 | -------------------------------------------------------------------------------- /flow-typed/npm/smoothscroll-polyfill_v0.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: f5d1cd32fd86e3c7b132d220e88b3454 2 | // flow-typed version: 463c76ef0c/smoothscroll-polyfill_v0.x.x/flow_>=v0.47.x 3 | 4 | declare module "smoothscroll-polyfill" { 5 | declare module.exports: { 6 | polyfill: () => void 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /app/renderer/components/AttachmentPopup/DownloadAttachment/styled/index.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const DownloadMain = styled.div``; 4 | 5 | export const DownloadLink = styled.a``; 6 | 7 | export const FileImage = styled.img` 8 | weight:80px; 9 | height:60px; 10 | `; 11 | -------------------------------------------------------------------------------- /app/renderer/containers/Popups/IdlePopup/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | // eslint-disable-next-line import/prefer-default-export 4 | export const Popup = styled.div` 5 | display: flex; 6 | flex-direction: column; 7 | & > div { 8 | height: 100%; 9 | } 10 | `; 11 | -------------------------------------------------------------------------------- /app/renderer/store/configureStore.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | if (process.env.NODE_ENV === 'production') { 3 | module.exports = require('./configureStore.production'); // eslint-disable-line global-require 4 | } else { 5 | module.exports = require('./configureStore.development'); // eslint-disable-line global-require 6 | } 7 | -------------------------------------------------------------------------------- /app/renderer/utils/preload/index.js: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | 3 | export function getPreload(fileName) { 4 | return ( 5 | process.env.NODE_ENV === 'development' 6 | ? path.join(process.cwd(), `app/dist/${fileName}.js`) 7 | : path.join(__dirname, `/${fileName}.prod.js`) 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /app/renderer/components/FeatureHighlight/styled/index.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Feature = styled.div` 4 | position: relative; 5 | & > span:last-child { 6 | position: absolute; 7 | top: 0; 8 | right: 0; 9 | transform: translateX(100%); 10 | } 11 | `; 12 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueReport/MetaColumn/StatisticsColumn/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const MetaItem = styled.div` 4 | width: 100%; 5 | display: flex; 6 | flex-direction: row; 7 | justify-content: space-between; 8 | margin-bottom: 4px; 9 | `; 10 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/index.js: -------------------------------------------------------------------------------- 1 | export AlertModal from './AlertModal'; 2 | export SaveWorklogInetIssueModal from './SaveWorklogInetIssueModal'; 3 | export SettingsModal from './SettingsModal'; 4 | export WorklogModal from './WorklogModal'; 5 | export ConfirmDeleteWorklogModal from './ConfirmDeleteWorklogModal'; 6 | -------------------------------------------------------------------------------- /app/renderer/actions/profile.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | ProfileAction, 4 | User, 5 | } from 'types'; 6 | 7 | import * as actionTypes from './actionTypes'; 8 | 9 | 10 | export const fillUserData = ( 11 | payload: User, 12 | ): ProfileAction => ({ 13 | type: actionTypes.FILL_USER_DATA, 14 | payload, 15 | }); 16 | -------------------------------------------------------------------------------- /app/shared/actions/timer.js: -------------------------------------------------------------------------------- 1 | import { 2 | actionTypes, 3 | } from '.'; 4 | 5 | export const startTimer = () => ({ 6 | type: actionTypes.START_TIMER, 7 | scope: ['mainRenderer'], 8 | }); 9 | 10 | export const stopTimerRequest = () => ({ 11 | type: actionTypes.STOP_TIMER_REQUEST, 12 | scope: ['mainRenderer'], 13 | }); 14 | -------------------------------------------------------------------------------- /app/renderer/types/issuesReports.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | export type IssuesReports = { 3 | estimate: number, 4 | loggedTotal: number, 5 | remaining: number, 6 | timespent: number, 7 | originalestimate: number, 8 | youLoggedToday: number, 9 | youLoggedTotal: number, 10 | yourWorklogs: Array, 11 | yourWorklogsToday: Array, 12 | }; 13 | -------------------------------------------------------------------------------- /app/main/sagas/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | all, 3 | fork, 4 | } from 'redux-saga/effects'; 5 | 6 | import { 7 | initialize, 8 | } from './initialize'; 9 | 10 | import { 11 | updaterFlow, 12 | } from './updater'; 13 | 14 | export default function* rootSaga() { 15 | yield all([ 16 | fork(initialize), 17 | fork(updaterFlow), 18 | ]); 19 | } 20 | -------------------------------------------------------------------------------- /app/renderer/components/AttachmentPopup/LoaderAttachment/styled/index.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Spinner = styled.div` 4 | display: flex; 5 | justify-content:center; 6 | align-items:center; 7 | height: 100vh; 8 | `; 9 | 10 | export const SpinnerDesc = styled.img` 11 | width:100px; 12 | height:100px; 13 | `; 14 | -------------------------------------------------------------------------------- /app/renderer/containers/Main/styled/index.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { 3 | Flex, 4 | } from 'components'; 5 | 6 | 7 | export const Main = styled(Flex).attrs({ 8 | row: true, 9 | })` 10 | height: 100%; 11 | `; 12 | 13 | export const Left = styled(Flex).attrs({ 14 | column: true, 15 | })` 16 | flex: 0 0 435px; 17 | `; 18 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/SettingsModal/Update/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const SettingsSectionContent = styled.div` 5 | margin-bottom: 30px; 6 | `; 7 | export const ContentLabel = styled.span` 8 | margin-left: 6px; 9 | margin-bottom: 10px; 10 | display: block; 11 | font-weight: 600; 12 | color: black; 13 | `; 14 | -------------------------------------------------------------------------------- /app/renderer/selectors/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | export * from './resources'; 3 | export * from './profile'; 4 | export * from './ui'; 5 | export * from './projects'; 6 | export * from './sprints'; 7 | export * from './issues'; 8 | export * from './timer'; 9 | export * from './screenshots'; 10 | 11 | export { 12 | getStatus as getResourceStatus, 13 | } from 'redux-resource'; 14 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/worklogs.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export const SAVE_WORKLOG_REQUEST = 'worklogs/SAVE_WORKLOG_REQUEST'; 4 | export const TRY_SAVE_WORKLOG_AGAIN_REQUEST = 'worklogs/TRY_SAVE_WORKLOG_AGAIN_REQUEST'; 5 | export const STOP_TRY_SAVE_WORKLOG_REQUEST = 'worklogs/STOP_TRY_SAVE_WORKLOG_REQUEST'; 6 | export const DELETE_WORKLOG_REQUEST = 'worklogs/DELETE_WORKLOG_REQUEST'; 7 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/IssuesSourcePicker/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const IssuesSource = styled.div` 5 | padding: 20px; 6 | border-bottom: 1px solid #e1e4e9; 7 | `; 8 | 9 | export const InputLabel = styled.span` 10 | color: #6B778C; 11 | font-size: 12px; 12 | font-weight: 600; 13 | margin-bottom: 4px; 14 | `; 15 | -------------------------------------------------------------------------------- /app/renderer/actions/attachments.js: -------------------------------------------------------------------------------- 1 | import * as types from './actionTypes'; 2 | 3 | 4 | export const nextAttachment = () => ({ 5 | type: types.NEXT_ATTACHMENT, 6 | }); 7 | 8 | export const prevAttachment = () => ({ 9 | type: types.PREV_ATTACHMENT, 10 | }); 11 | 12 | export const selectAttachment = index => ({ 13 | type: types.SELECT_ATTACHMENT, 14 | payload: index, 15 | }); 16 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarRecentWorklogs/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const List = styled.div` 5 | height: 100%; 6 | flex: 1; 7 | z-index: 1; 8 | overflow-y: scroll; 9 | background: #F4F5F7; 10 | `; 11 | 12 | export const Item = styled.div` 13 | padding: 10px 0; 14 | display: flex; 15 | flex-flow: column nowrap; 16 | `; 17 | -------------------------------------------------------------------------------- /app/shared/utils/is-electron-renderer.js: -------------------------------------------------------------------------------- 1 | function isRenderer() { 2 | // running in a web browser 3 | if (typeof process === 'undefined') return true; 4 | 5 | // node-integration is disabled 6 | if (!process) return true; 7 | 8 | // We're in node.js somehow 9 | if (!process.type) return false; 10 | 11 | return process.type === 'renderer'; 12 | } 13 | 14 | export default isRenderer(); 15 | -------------------------------------------------------------------------------- /app/renderer/types/boards.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | Id, 4 | } from './'; 5 | 6 | export type Board = { 7 | id: number, 8 | location: { 9 | avatarURI: string, 10 | name: string, 11 | projectId: number, 12 | projectTypeKey: string, 13 | }, 14 | name: string, 15 | self: string, 16 | type: string, 17 | }; 18 | 19 | export type BoardsResources = { 20 | [Id]: Board, 21 | } 22 | -------------------------------------------------------------------------------- /app/renderer/components/AttachmentPopup/LoaderAttachment/LoaderAttachmentPopup.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import spinner from 'images/spinner.svg'; 3 | import * as S from './styled'; 4 | 5 | 6 | const LoaderAttachmentPopup = () => ( 7 | 8 | 12 | 13 | ); 14 | 15 | export default LoaderAttachmentPopup; 16 | -------------------------------------------------------------------------------- /app/renderer/sagas/worklogTypes.js: -------------------------------------------------------------------------------- 1 | import * as eff from 'redux-saga/effects'; 2 | import * as Api from 'api'; 3 | 4 | import { 5 | infoLog, 6 | } from './ui'; 7 | 8 | 9 | export function* getWorklogTypes() { 10 | try { 11 | const { payload } = yield eff.call(Api.fetchWorklogTypes); 12 | yield eff.call(infoLog, 'got worklog types', payload); 13 | } catch (err) { 14 | console.log(err); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/renderer/types/issuesTypes.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | Id, 4 | } from './'; 5 | 6 | 7 | export type IssueType = { 8 | avatarId?: number, 9 | description: string, 10 | iconUrl: string, 11 | id: string, 12 | name: string, 13 | self: string, 14 | subtask?: boolean 15 | }; 16 | 17 | export type IssuesTypesResources = { 18 | [Id]: IssueType, 19 | } 20 | 21 | export type IssuesTypesState = any; 22 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/SettingsModal/ScreenshotsSettings/styled/index.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-confusing-arrow */ 2 | import styled from 'styled-components'; 3 | 4 | 5 | export const SettingsSectionContent = styled.div` 6 | margin-bottom: 30px; 7 | `; 8 | export const ContentLabel = styled.span` 9 | margin-left: 6px; 10 | margin-bottom: 10px; 11 | display: block; 12 | font-weight: 600; 13 | color: black; 14 | `; 15 | -------------------------------------------------------------------------------- /app/renderer/selectors/profile.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | ProfileState, 4 | } from 'types'; 5 | 6 | 7 | export const getUserData = 8 | ({ 9 | profile, 10 | }: { 11 | profile: ProfileState, 12 | }) => 13 | profile.userData; 14 | 15 | export const getSelfKey = 16 | ({ 17 | profile, 18 | }: { 19 | profile: ProfileState, 20 | }): string | null => 21 | profile.userData && profile.userData.key; 22 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/Filters/FilterOption/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const Option = styled.label` 5 | width: 50%; 6 | display: inline-block; 7 | `; 8 | 9 | export const OptionLabel = styled.span` 10 | display: flex; 11 | align-items: center; 12 | `; 13 | 14 | export const OptionImage = styled.img` 15 | height: 14px; 16 | margin-right: 3px; 17 | `; 18 | 19 | -------------------------------------------------------------------------------- /app/renderer/types/resources.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import * as actionTypes from '../actions/actionTypes/resources'; 3 | 4 | 5 | export type ResourcesAction = 6 | {| 7 | type: typeof actionTypes.CLEAR_RESOURCES_LIST, 8 | list: string, 9 | resourceType: string, 10 | |} | 11 | {| 12 | type: typeof actionTypes.SET_RESOURCES_META, 13 | meta: any, 14 | resourceType: string, 15 | resources?: Array, 16 | |}; 17 | -------------------------------------------------------------------------------- /app/renderer/containers/Popups/ScreenshotNotificationPopup/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Popup = styled.div` 4 | display: flex; 5 | flex-flow: row nowrap; 6 | justify-content: flex-center; 7 | height: 100%; 8 | padding: 15px 12px 12px 14px; 9 | `; 10 | 11 | export const PopupImage = styled.img` 12 | height: 70%; 13 | cursor: ${props => (props.allowToResize ? 'pointer' : 'default')}; 14 | `; 15 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarRecentWorklogs/TimestampItem/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const Timestamp = styled.div` 5 | display: flex; 6 | flex-direction: row; 7 | align-items: center; 8 | justify-content: space-between; 9 | padding: 4px 20px; 10 | span { 11 | font-weight: 600; 12 | font-size: 12px; 13 | color: #6C798F; 14 | } 15 | border-bottom: 1px solid #dfe1e6; 16 | `; 17 | -------------------------------------------------------------------------------- /app/shared/actions/tray.js: -------------------------------------------------------------------------------- 1 | import { 2 | actionTypes, 3 | } from '.'; 4 | 5 | 6 | export const trayStartTimer = () => ({ 7 | type: actionTypes.TRAY_START_TIMER, 8 | scope: ['main'], 9 | }); 10 | 11 | export const trayStopTimer = () => ({ 12 | type: actionTypes.TRAY_STOP_TIMER, 13 | scope: ['main'], 14 | }); 15 | 16 | export const traySelectIssue = issueKey => ({ 17 | type: actionTypes.TRAY_SELECT_ISSUE, 18 | scope: ['main'], 19 | issueKey, 20 | }); 21 | -------------------------------------------------------------------------------- /app/config/index.js: -------------------------------------------------------------------------------- 1 | import devConfig from './config.development'; 2 | import prodConfig from './config.production'; 3 | import testConfig from './config.testing'; 4 | 5 | let config = prodConfig; // eslint-disable-line 6 | 7 | if (process.env.NODE_ENV === 'production') { 8 | config = prodConfig; 9 | } else if (process.env.NODE_ENV === 'test') { 10 | config = testConfig; 11 | } else if (process.env.NODE_ENV === 'development') { 12 | config = devConfig; 13 | } 14 | export default config; 15 | -------------------------------------------------------------------------------- /app/config/config.testing.js: -------------------------------------------------------------------------------- 1 | const config = { 2 | apiUrl: 'http://127.0.0.1:5000', // server url 3 | socketUrl: 'https://chronos-socket.web-pal.com', // url of socket server 4 | 5 | supportLink: 'https://web-pal.atlassian.net/servicedesk/customer/portal/2', 6 | githubLink: 'https://github.com/web-pal/chronos-timetracker', 7 | 8 | idleTimeThreshold: 300, // seconds of inactivity considering user is idle 9 | checkUpdates: false, 10 | infoLog: false, 11 | }; 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /app/renderer/types/issuesComments.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | Id, 4 | User, 5 | } from './'; 6 | 7 | 8 | export type IssueComment = { 9 | self: string, 10 | id: string, 11 | author: User, 12 | body: string, 13 | updateAuthor: User, 14 | created: string, 15 | updated: string, 16 | visibility: { 17 | type: string, 18 | value: string, 19 | }, 20 | }; 21 | 22 | export type IssuesCommentsResources = { 23 | [Id]: IssueComment, 24 | } 25 | 26 | export type IssuesCommentsState = any; 27 | -------------------------------------------------------------------------------- /app/renderer/containers/Popups/ScreenshotsViewerPopup/styled/index.js: -------------------------------------------------------------------------------- 1 | import styled, { 2 | keyframes, 3 | } from 'styled-components'; 4 | 5 | const flash = keyframes` 6 | 0% { 7 | opacity: 1; 8 | } 9 | 50% { 10 | opacity: 0; 11 | } 12 | 100% { 13 | opacity: 1; 14 | } 15 | `; 16 | 17 | export const RecordIconAnimated = styled.div` 18 | color: red; 19 | animation-name: ${flash}; 20 | animation-duration: 1.4s; 21 | animation-iteration-count: infinite; 22 | animation-fill-mode: both; 23 | `; 24 | -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Chronos", 3 | "version": "3.2.6", 4 | "description": "Native app for time-tracking fully integrated with JIRA", 5 | "main": "./dist/main.prod.js", 6 | "author": { 7 | "name": "Webpal", 8 | "url": "https://github.com/web-pal" 9 | }, 10 | "license": "ISC", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/web-pal/chronos-timetracker.git" 14 | }, 15 | "dependencies": { 16 | "desktop-idle": "1.1.2", 17 | "keytar": "4.6.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/timer.js: -------------------------------------------------------------------------------- 1 | 2 | // @flow 3 | 4 | export const TICK = 'timer/TICK'; 5 | export const START_TIMER = 'timer/START'; 6 | export const STOP_TIMER = 'timer/STOP'; 7 | export const SET_TIME = 'timer/SET_TIME'; 8 | export const CONTINUE_TIMER = 'timer/CONTINUE'; 9 | export const STOP_TIMER_REQUEST = 'timer/STOP_REQUEST'; 10 | export const SET_IDLE_STATE = 'timer/SET_IDLE_STATE'; 11 | export const RESET_TIMER = 'timer/RESET'; 12 | export const KEEP_IDLE_TIME = 'timer/KEEP_IDLE_TIME'; 13 | export const DISMISS_IDLE_TIME = 'timer/DISMISS_IDLE_TIME'; 14 | -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/IssueViewPlaceholder/IssueViewPlaceholder.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { tasks } from 'utils/data/assets'; 4 | 5 | import * as S from './styled'; 6 | 7 | const IssueViewPlaceholder = () => ( 8 | 9 | 10 | Start your tracking experience! 11 | Select issue from the left in order to start tracking 12 | 13 | ); 14 | 15 | export default IssueViewPlaceholder; 16 | -------------------------------------------------------------------------------- /app/renderer/actions/updater.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { 3 | actionTypes, 4 | } from 'shared/actions'; 5 | 6 | export const checkUpdates = () => ({ 7 | type: actionTypes.CHECK_UPDATES_REQUEST, 8 | scope: 'main', 9 | }); 10 | 11 | export const downloadUpdate = () => ({ 12 | type: actionTypes.DOWNLOAD_UPDATE_REQUEST, 13 | scope: 'main', 14 | }); 15 | 16 | export const setUpdateSettings = ({ 17 | autoDownload, 18 | allowPrerelease, 19 | }) => ({ 20 | type: actionTypes.SET_UPDATE_SETTINGS, 21 | autoDownload, 22 | allowPrerelease, 23 | scope: 'main', 24 | }); 25 | -------------------------------------------------------------------------------- /app/renderer/components/AttachmentPopup/DownloadAttachment/DownloadAttachment.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import fileImages from 'images/file.png'; 3 | import * as S from './styled'; 4 | 5 | const DownloadAttachment = ({ attachment }) => ( 6 | 7 | 11 | 15 | 16 | 17 | ); 18 | 19 | export default DownloadAttachment; 20 | -------------------------------------------------------------------------------- /app/renderer/types/issuesStatuses.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | Id, 4 | } from './'; 5 | 6 | export type IssueStatusCategory = { 7 | colorName: string, 8 | id: number, 9 | key: string, 10 | name: string, 11 | self: string, 12 | }; 13 | 14 | export type IssueStatus = { 15 | description: string, 16 | iconUrl: string, 17 | id: string, 18 | name: string, 19 | self: string, 20 | statusCategory: IssueStatusCategory, 21 | }; 22 | 23 | export type IssuesStatusesResources = { 24 | [Id]: IssueStatus, 25 | } 26 | 27 | export type IssuesStatusesState = any; 28 | -------------------------------------------------------------------------------- /flow-typed/npm/font-awesome_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 9c28d56816e7e2d5bcc26cef6f954676 2 | // flow-typed version: <>/font-awesome_v4.7.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'font-awesome' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'font-awesome' { 17 | declare module.exports: any; 18 | } 19 | -------------------------------------------------------------------------------- /app/renderer/types/sprints.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import * as actionTypes from '../actions/actionTypes/sprints'; 3 | import type { 4 | Id, 5 | } from './'; 6 | 7 | 8 | export type SprintsAction = 9 | {| 10 | type: typeof actionTypes.FETCH_SPRINTS_REQUEST, 11 | |}; 12 | 13 | export type Sprint = { 14 | id: number, 15 | self: string, 16 | state: string, 17 | name: string, 18 | startDate: string, 19 | endDate: string, 20 | completeDate: string, 21 | originBoardId: number, 22 | goal: string, 23 | }; 24 | 25 | export type SprintsResources = { 26 | [Id]: Sprint, 27 | } 28 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export * from './auth'; 4 | export * from './profile'; 5 | export * from './ui'; 6 | export * from './settings'; 7 | export * from './filters'; 8 | export * from './projects'; 9 | export * from './resources'; 10 | export * from './sprints'; 11 | export * from './issues'; 12 | export * from './timer'; 13 | export * from './worklogs'; 14 | export * from './attachments'; 15 | export * from './screenshots'; 16 | 17 | export const INITIAL_CONFIGURE_APP = 'INITIAL_CONFIGURE_APP'; 18 | export const __CLEAR_ALL_REDUCERS__ = '__CLEAR_ALL_REDUCERS__'; 19 | -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/styled/index.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { placeholderShimmer } from 'styles/animations'; 3 | 4 | export const AnimatedPlaceholder = styled.div` 5 | animation-duration: 1s; 6 | animation-fill-mode: forwards; 7 | animation-iteration-count: infinite; 8 | animation-name: ${placeholderShimmer}; 9 | animation-timing-function: linear; 10 | background: #f6f7f8; 11 | background: linear-gradient(to right, #eeeeee 8%, #dddddd 18%, #eeeeee 33%); 12 | background-size: 800px 104px; 13 | height: 100%; 14 | position: relative; 15 | `; 16 | -------------------------------------------------------------------------------- /scripts/release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | releaseType=${1:?USAGE: yarn release . ('major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease')} 4 | 5 | version=$(node ./scripts/bumpVersion.js ${releaseType} --dry) 6 | 7 | git flow release start ${version} 8 | 9 | node ./scripts/bumpVersion.js ${releaseType} 10 | 11 | git commit -a -m "chore: bump version to ${version}" 12 | 13 | conventional-changelog -p angular -i CHANGELOG.md -s -k ./app/package.json 14 | 15 | git commit -a -m 'chore: update CHANGELOG' 16 | 17 | git flow release publish ${version} 18 | 19 | echo 'done!' 20 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/popup.less: -------------------------------------------------------------------------------- 1 | .image.screenshot-preview { 2 | width: 188px; 3 | height: 105px; 4 | margin: 3px; 5 | object-fit: contain; 6 | background: #e6e6e6; 7 | } 8 | 9 | .popup { 10 | height: 100%; 11 | background: #fff; 12 | padding: 15px 12px 12px 14px; 13 | .button { 14 | height: 33px; 15 | color: white; 16 | font-size: 16px; 17 | padding: 5px 22px; 18 | } 19 | } 20 | 21 | .popup-timer { 22 | span { 23 | backface-visibility: hidden; 24 | } 25 | text-align: center; 26 | font-size: 2em; 27 | font-weight: bold; 28 | color: #373737; 29 | } 30 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueViewTabs/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const TabItem = styled.div` 5 | display: flex; 6 | flex-direction: row; 7 | justify-content: center; 8 | align-items: center; 9 | height: 30px; 10 | width: 100%; 11 | color: white; 12 | background-color: white; 13 | border-bottom: 2px solid ${props => (props.active ? props.theme.primary : '#E1E4E9')}; 14 | color: ${props => (props.active ? props.theme.primary : '#42526E')}; 15 | font-weight: 500; 16 | cursor: pointer; 17 | :hover { 18 | color: ${props => props.theme.primary}; 19 | } 20 | `; 21 | 22 | -------------------------------------------------------------------------------- /app/renderer/containers/Popups/ScreenshotNotificationPopup/ScreenshotNotificationPopup.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { 3 | connect, 4 | } from 'react-redux'; 5 | 6 | import ScreenshotPopup from './ScreenshotPopup'; 7 | 8 | const ScreenshotNotificationPopup = ({ decisionTime }) => ( 9 | decisionTime && ( 10 | 11 | ) 12 | ); 13 | 14 | function mapStateToProps(state) { 15 | return { 16 | decisionTime: state.screenshotNotificationReducer.decisionTime, 17 | }; 18 | } 19 | 20 | const connector = connect( 21 | mapStateToProps, 22 | ); 23 | 24 | export default connector(ScreenshotNotificationPopup); 25 | -------------------------------------------------------------------------------- /app/renderer/containers/AuthForm/utils.js: -------------------------------------------------------------------------------- 1 | export function transformValidHost(host: string): URL { 2 | try { 3 | return new URL(host); 4 | } catch (err) { 5 | if (err instanceof TypeError) { 6 | try { 7 | if (/^[a-zA-Z0-9-]*$/.test(host)) { 8 | const atlassianUrl = `https://${host}.atlassian.net`; 9 | return new URL(atlassianUrl); 10 | } if (!host.match(/^(http:\/\/|https:\/\/)/)) { 11 | const protocolUrl = `https://${host}`; 12 | return new URL(protocolUrl); 13 | } 14 | } catch (err2) { 15 | return null; 16 | } 17 | } 18 | return null; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/ui.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | export const SET_UI_STATE = 'ui/SET_UI_STATE'; 3 | export const RESET_UI_STATE = 'ui/RESET_UI_STATE'; 4 | export const SET_MODAL_STATE = 'ui/SET_MODAL_STATE'; 5 | export const SET_ISSUES_FILTER = 'ui/SET_ISSUES_FILTER'; 6 | export const CHECK_FOR_UPDATES_REQUEST = 'ui/CHECK_FOR_UPDATES_REQUEST'; 7 | export const INSTALL_UPDATE_REQUEST = 'ui/INSTALL_UPDATE_REQUEST'; 8 | export const ADD_FLAG = 'ui/ADD_FLAG'; 9 | export const DELETE_FLAG = 'ui/DELETE_FLAG'; 10 | export const ISSUE_WORKLOGS_SCROLL_TO_INDEX_REQUEST = 'ui/ISSUE_WORKLOGS_SCROLL_TO_INDEX_REQUEST'; 11 | export const ACKNOWLEDGE_FEATURE = 'ui/ACKNOWLEDGE_FEATURE'; 12 | -------------------------------------------------------------------------------- /app/renderer/types/projects.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import * as actionTypes from '../actions/actionTypes/projects'; 3 | import type { 4 | Id, 5 | } from './'; 6 | 7 | 8 | export type ProjectsAction = 9 | {| 10 | type: typeof actionTypes.FETCH_PROJECT_STATUSES_REQUEST, 11 | |}; 12 | 13 | export type Project = { 14 | avatarUrls: { 15 | '16x16': string, 16 | '24x24': string, 17 | '32x32': string, 18 | '48x48': string, 19 | }, 20 | expand?: string, 21 | id: string, 22 | key: string, 23 | name: string, 24 | projectTypeKey?: string, 25 | self: string, 26 | simplified: boolean, 27 | }; 28 | 29 | export type ProjectsResources = { 30 | [Id]: Project, 31 | } 32 | -------------------------------------------------------------------------------- /app/renderer/reducers/profile.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { 3 | actionTypes, 4 | } from 'actions'; 5 | 6 | import type { 7 | ProfileState, 8 | Action, 9 | } from '../types'; 10 | 11 | 12 | const initialState: ProfileState = { 13 | userData: null, 14 | }; 15 | 16 | function profile( 17 | state: ProfileState = initialState, 18 | action: Action, 19 | ) { 20 | switch (action.type) { 21 | case actionTypes.FILL_USER_DATA: 22 | return { 23 | ...state, 24 | userData: action.payload, 25 | }; 26 | case actionTypes.__CLEAR_ALL_REDUCERS__: 27 | return initialState; 28 | default: 29 | return state; 30 | } 31 | } 32 | 33 | export default profile; 34 | -------------------------------------------------------------------------------- /app/renderer/components/index.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | export Flex from './Flex'; 3 | export { 4 | AutosizableList, 5 | InfiniteLoadingList, 6 | } from './Virtualized'; 7 | export { 8 | IssueCommentPlaceholder, 9 | IssueItemPlaceholder, 10 | IssueViewPlaceholder, 11 | RecentItemsPlaceholder, 12 | } from './Placeholders'; 13 | export ErrorBoundary from './ErrorBoundary'; 14 | export Img from './Img'; 15 | export Calendar from './Calendar'; 16 | export TextField from './TextField'; 17 | export SingleSelect from './SingleSelect'; 18 | export * as ReduxFormComponents from './ReduxFormComponents'; 19 | export RemainingEstimatePicker from './RemainingEstimatePicker'; 20 | export FeatureHighlight from './FeatureHighlight'; 21 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/NoIssues/NoIssues.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | 4 | import type { 5 | StatelessFunctionalComponent, 6 | Node, 7 | } from 'react'; 8 | 9 | import { 10 | noIssuesImage, 11 | } from 'utils/data/assets'; 12 | import * as S from './styled'; 13 | 14 | 15 | const NoIssues: StatelessFunctionalComponent<*> = (): Node => ( 16 | 17 | 21 | 22 | No issues found 23 | 24 | 25 | Try to change filters and try again 26 | 27 | 28 | ); 29 | 30 | export default NoIssues; 31 | -------------------------------------------------------------------------------- /app/renderer/assets/images/ring-alt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarRecentWorklogs/NoWorklogs/NoWorklogs.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | 4 | import type { 5 | StatelessFunctionalComponent, 6 | Node, 7 | } from 'react'; 8 | 9 | import { 10 | noIssuesImage, 11 | } from 'utils/data/assets'; 12 | import * as S from './styled'; 13 | 14 | 15 | const NoWorklogs: StatelessFunctionalComponent<*> = (): Node => ( 16 | 17 | 18 | 19 | Nothing tracked recently 20 | 21 | 22 | Track any issue to see it in {'"Recent"'} tab 23 | 24 | 25 | ); 26 | 27 | export default NoWorklogs; 28 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/WorklogModal/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import ClickOutside from 'react-click-outside'; 3 | 4 | export const Calendar = styled(ClickOutside)` 5 | margin-top: 5px; 6 | position: absolute; 7 | z-index: 2; // bigger than rc-time-picker popup 8 | `; 9 | 10 | 11 | export const CalendarIcon = styled.div` 12 | margin-left: -30px; 13 | margin-top: 2px; 14 | cursor: pointer; 15 | `; 16 | 17 | export const InputLabel = styled.div` 18 | color: #6B778C; 19 | font-size: 12px; 20 | font-weight: 600; 21 | line-height: 1.3333333333333333; 22 | padding: 20px 0px 4px 0px; 23 | `; 24 | 25 | export const InputExample = styled.span` 26 | margin-left: 5px; 27 | `; 28 | -------------------------------------------------------------------------------- /app/renderer/components/Virtualized/AutosizableList.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { 4 | AutoSizer, List, 5 | } from 'react-virtualized'; 6 | 7 | type Props = { 8 | listProps: any, 9 | autoSized?: boolean, 10 | }; 11 | 12 | const AutosizableList = (props: Props) => ( 13 | 16 | {({ height, width }) => ( 17 | 22 | )} 23 | 24 | ); 25 | 26 | AutosizableList.defaultProps = { 27 | autoSized: false, 28 | }; 29 | 30 | export default AutosizableList; 31 | -------------------------------------------------------------------------------- /app/renderer/components/Virtualized/InfiniteLoadingList.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { 4 | InfiniteLoader, 5 | } from 'react-virtualized'; 6 | 7 | import AutosizableList from './AutosizableList'; 8 | 9 | type Props = { 10 | listProps: any, 11 | }; 12 | 13 | const InfiniteLoadingList = (props: Props) => ( 14 | 15 | {({ onRowsRendered, registerChild }) => ( 16 | 24 | )} 25 | 26 | ); 27 | 28 | export default InfiniteLoadingList; 29 | -------------------------------------------------------------------------------- /app/renderer/sagas/ipc.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { 3 | eventChannel, 4 | } from 'redux-saga'; 5 | import { 6 | ipcRenderer, 7 | } from 'electron'; 8 | import EventEmitter from 'events'; 9 | 10 | type Handler = { 11 | (ev: Event): void; 12 | }; 13 | 14 | 15 | export default function createIpcChannel( 16 | channel: string, 17 | listener: EventEmitter | any = ipcRenderer, 18 | ) { 19 | return eventChannel((emit) => { 20 | const handler: Handler = (ev, ...payload) => { 21 | emit({ ev, channel, payload }); 22 | }; 23 | listener.on(channel, handler); 24 | // eventChannel must return unsubcribe function 25 | return () => { 26 | ipcRenderer.removeListener(channel, handler); 27 | }; 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /app/renderer/types/auth.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import * as actionTypes from '../actions/actionTypes/auth'; 3 | 4 | 5 | export type AuthAction = 6 | {| 7 | type: typeof actionTypes.AUTH_REQUEST, 8 | payload: {| 9 | host: any, 10 | token: string, 11 | |}, 12 | |} | 13 | {| 14 | type: typeof actionTypes.LOGOUT_REQUEST, 15 | payload: { 16 | dontForget: boolean, 17 | } 18 | |} | 19 | {| 20 | type: typeof actionTypes.SWITCH_ACCOUNT, 21 | payload: {| 22 | host: string, 23 | username: string, 24 | |} 25 | |}; 26 | 27 | export type Account = { 28 | name: string, 29 | protocol: string, 30 | hostname: string, 31 | port: string | number, 32 | pathname: string, 33 | }; 34 | -------------------------------------------------------------------------------- /app/main/store/configureStore.js: -------------------------------------------------------------------------------- 1 | import { 2 | createStore, 3 | applyMiddleware, 4 | } from 'redux'; 5 | import createSagaMiddleware, { 6 | END, 7 | } from 'redux-saga'; 8 | 9 | import mainEnhancer from './middleware'; 10 | import reducer from '../reducers'; 11 | 12 | const sagaMiddleware = createSagaMiddleware(); 13 | const middleware = [ 14 | mainEnhancer, 15 | sagaMiddleware, 16 | ].filter(Boolean); 17 | 18 | function configureStore(initialState = {}) { 19 | const store = createStore( 20 | reducer, 21 | initialState, 22 | applyMiddleware(...middleware), 23 | ); 24 | store.runSaga = sagaMiddleware.run; 25 | store.close = () => store.dispatch(END); 26 | 27 | return store; 28 | } 29 | 30 | export default configureStore; 31 | -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/IssueCommentPlaceholder/IssueCommentPlaceholder.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import type { StatelessFunctionalComponent, Node } from 'react'; 4 | import Flex from '../../Flex/Flex'; 5 | 6 | import * as S from './styled'; 7 | 8 | const IssueCommentPlaceholder: StatelessFunctionalComponent<{}> = (): Node => ( 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | ); 21 | 22 | export default IssueCommentPlaceholder; 23 | -------------------------------------------------------------------------------- /app/renderer/actions/resources.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | ResourcesAction, 4 | } from 'types'; 5 | 6 | import * as actionTypes from './actionTypes/resources'; 7 | 8 | 9 | export const clearResourceList = ({ 10 | list, 11 | resourceType, 12 | }: {| 13 | list: string, 14 | resourceType: string, 15 | |}): ResourcesAction => ({ 16 | type: actionTypes.CLEAR_RESOURCES_LIST, 17 | list, 18 | resourceType, 19 | }); 20 | 21 | export const setResourceMeta = ({ 22 | meta, 23 | resourceType, 24 | resources, 25 | }: {| 26 | meta: any, 27 | resourceType: string, 28 | resources?: Array, 29 | |}): ResourcesAction => ({ 30 | type: actionTypes.SET_RESOURCES_META, 31 | meta, 32 | resourceType, 33 | resources, 34 | }); 35 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueReport/MainColumn/StatisticsRow/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const StatisticsItem = styled.div` 4 | min-width: 125px; 5 | height: 60px; 6 | display: flex; 7 | align-items: flex-start; 8 | padding: 8px; 9 | border-radius: 3px; 10 | ${props => (props.bgTheme === 'orange' ? ` 11 | background-color: #FFAB00; 12 | .MetaItemName { 13 | color: #42526E !important; 14 | } 15 | .MetaItemValue { 16 | color: #091E42 !important; 17 | } 18 | ` : ` 19 | background-color: white; 20 | .MetaItemName { 21 | color: #0052CC !important; 22 | } 23 | .MetaItemValue { 24 | color: #0052CC !important; 25 | } 26 | `)} 27 | `; 28 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/filter-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Shape 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/renderer/actions/worklogs.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | Id, 4 | WorklogsAction, 5 | } from 'types'; 6 | 7 | import * as actionTypes from './actionTypes'; 8 | 9 | 10 | export const saveWorklogRequest = ( 11 | payload: any, 12 | ): WorklogsAction => ({ 13 | type: actionTypes.SAVE_WORKLOG_REQUEST, 14 | payload, 15 | }); 16 | 17 | export const deleteWorklogRequest = ( 18 | worklogId: Id, 19 | ): WorklogsAction => ({ 20 | type: actionTypes.DELETE_WORKLOG_REQUEST, 21 | worklogId, 22 | }); 23 | 24 | export const trySaveWorklogAgainRequest = (): WorklogsAction => ({ 25 | type: actionTypes.TRY_SAVE_WORKLOG_AGAIN_REQUEST, 26 | }); 27 | 28 | export const stopTrySaveWorklogRequest = (): WorklogsAction => ({ 29 | type: actionTypes.STOP_TRY_SAVE_WORKLOG_REQUEST, 30 | }); 31 | -------------------------------------------------------------------------------- /app/renderer/reducers/resourcesPlugins/metaPlugin.js: -------------------------------------------------------------------------------- 1 | import { 2 | setResourceMeta, 3 | } from 'redux-resource'; 4 | import { 5 | actionTypes, 6 | } from 'actions'; 7 | 8 | 9 | const metaPlugin = () => 10 | (state, action) => { 11 | if (action.type !== actionTypes.SET_RESOURCES_META) { 12 | return state; 13 | } 14 | 15 | if (action.resources) { 16 | return { 17 | ...state, 18 | meta: setResourceMeta({ 19 | resources: action.resources, 20 | meta: state.meta, 21 | newMeta: action.meta, 22 | }), 23 | }; 24 | } 25 | return { 26 | ...state, 27 | meta: { 28 | ...state.meta, 29 | ...action.meta, 30 | }, 31 | }; 32 | }; 33 | 34 | 35 | export default metaPlugin; 36 | -------------------------------------------------------------------------------- /app/renderer/store/configureStore.production.js: -------------------------------------------------------------------------------- 1 | import createSagaMiddleware, { 2 | END, 3 | } from 'redux-saga'; 4 | import { 5 | createStore, 6 | applyMiddleware, 7 | compose, 8 | } from 'redux'; 9 | 10 | import rendererEnhancer from './middleware'; 11 | import rootReducer from '../reducers'; 12 | 13 | const sagaMiddleware = createSagaMiddleware(); 14 | const middleware = [ 15 | rendererEnhancer, 16 | sagaMiddleware, 17 | ].filter(Boolean); 18 | 19 | 20 | function configureStore(initialState) { 21 | const store = createStore(rootReducer, initialState, compose( 22 | applyMiddleware(...middleware), 23 | )); 24 | 25 | store.runSaga = sagaMiddleware.run; 26 | store.close = () => store.dispatch(END); 27 | return store; 28 | } 29 | 30 | export default configureStore; 31 | -------------------------------------------------------------------------------- /app/config/config.production.js: -------------------------------------------------------------------------------- 1 | const config = { 2 | apiUrl: 'https://chronos-api.web-pal.com/api', // server url 3 | socketUrl: 'https://chronos-socket.web-pal.com', // url of socket server 4 | 5 | supportLink: 'https://web-pal.atlassian.net/servicedesk/customer/portal/2', 6 | githubLink: 'https://github.com/web-pal/chronos-timetracker', 7 | 8 | // idleTimeThreshold: 60 * 60 * 24, // seconds of inactivity considering user is idle 9 | idleTimeThreshold: 300, 10 | checkUpdates: true, 11 | infoLog: false, 12 | issueWindowDevTools: false, 13 | idleWindowDevTools: false, 14 | loginWindowDevTools: false, 15 | attachmentsWindowDevtools: false, 16 | screenshotNotificationWindowDevtools: false, 17 | screenshotsViewerWindowDevtools: false, 18 | }; 19 | 20 | export default config; 21 | -------------------------------------------------------------------------------- /app/renderer/containers/FlagsContainer/SpinnerContainer/SpinnerContainer.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import type { 4 | StatelessFunctionalComponent, 5 | Node, 6 | } from 'react'; 7 | 8 | import Spinner from '@atlaskit/spinner'; 9 | 10 | import * as S from './styled'; 11 | 12 | type Props = { 13 | spinnerTitle: string, 14 | }; 15 | 16 | const SpinnerContainer: StatelessFunctionalComponent = ({ 17 | spinnerTitle, 18 | }: Props): Node => ( 19 | 20 | 21 | 22 | {spinnerTitle} 23 | . 24 | . 25 | . 26 | 27 | 28 | ); 29 | 30 | export default SpinnerContainer; 31 | -------------------------------------------------------------------------------- /app/renderer/utils/stat.js: -------------------------------------------------------------------------------- 1 | import mixpanel from 'mixpanel-browser'; 2 | 3 | import { 4 | version, 5 | } from '../../package.json'; 6 | 7 | export const trackMixpanel = (event, data = {}) => { 8 | if (process.env.DISABLE_MIXPANEL !== '1' && process.env.MIXPANEL_API_TOKEN) { 9 | try { 10 | mixpanel.track( 11 | event, 12 | { 13 | ...data, 14 | version, 15 | }, 16 | ); 17 | } catch (err) { 18 | console.error(err); 19 | } 20 | } 21 | }; 22 | 23 | export const incrementMixpanel = (event, data) => { 24 | if (process.env.DISABLE_MIXPANEL !== '1' && process.env.MIXPANEL_API_TOKEN) { 25 | try { 26 | mixpanel.people.increment(event, data); 27 | } catch (err) { 28 | console.error(err); 29 | } 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/TrackingBar/ProgressBar/styled/index.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-confusing-arrow */ 2 | import styled from 'styled-components'; 3 | import { 4 | Flex, 5 | } from 'components'; 6 | 7 | export const ProgressBar = styled(Flex).attrs({ 8 | alignCenter: true, 9 | })` 10 | position: absolute; 11 | right: 20px; 12 | bottom: 6px; 13 | cursor: pointer; 14 | `; 15 | 16 | export const CircleBackground = styled.circle` 17 | fill: #172B4D; 18 | stroke: white; 19 | cursor: pointer; 20 | `; 21 | 22 | export const CircleProgress = styled.circle` 23 | fill: none; 24 | stroke: #FFAB00; 25 | stroke-linecap: round; 26 | stroke-linejoin: round; 27 | cursor: pointer; 28 | `; 29 | 30 | export const CircleStop = styled.rect` 31 | fill: white; 32 | cursor: pointer; 33 | `; 34 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/chevron-down-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | chevron-down 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/renderer/actions/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | export * as profileActions from './profile'; 3 | export * as authActions from './auth'; 4 | export * as uiActions from './ui'; 5 | export * as settingsActions from './settings'; 6 | export * as projectsActions from './projects'; 7 | export * as issuesActions from './issues'; 8 | export * as timerActions from './timer'; 9 | export * as worklogsActions from './worklogs'; 10 | export * as sprintsActions from './sprints'; 11 | export * as resourcesActions from './resources'; 12 | export * as filtersActions from './filters'; 13 | export * as updaterActions from './updater'; 14 | export * as attachmentsActions from './attachments'; 15 | export * as screenshotsActions from './screenshots'; 16 | 17 | export * as types from './actionTypes'; 18 | export * as actionTypes from './actionTypes'; 19 | -------------------------------------------------------------------------------- /app/config/config.development.js: -------------------------------------------------------------------------------- 1 | const config = { 2 | // apiUrl: 'http://127.0.0.1:5000/api', // server url 3 | apiUrl: 'https://chronos-api.web-pal.com/api', // server url 4 | socketUrl: 'https://chronos-socket.web-pal.com', // url of socket server 5 | 6 | supportLink: 'https://web-pal.atlassian.net/servicedesk/customer/portal/2', 7 | githubLink: 'https://github.com/web-pal/chronos-timetracker', 8 | 9 | idleTimeThreshold: 300, // seconds of inactivity considering user is idle 10 | checkUpdates: false, 11 | infoLog: false, 12 | reduxLogger: true, 13 | issueWindowDevTools: false, 14 | idleWindowDevTools: false, 15 | loginWindowDevTools: false, 16 | attachmentsWindowDevtools: false, 17 | screenshotNotificationWindowDevtools: false, 18 | screenshotsViewerWindowDevtools: false, 19 | }; 20 | 21 | export default config; 22 | -------------------------------------------------------------------------------- /dockerBuild.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker run --rm -ti \ 4 | --env-file <(env | grep -iE 'DEBUG|NODE_|ELECTRON_|YARN_|NPM_|CI|CIRCLE|TRAVIS|APPVEYOR_|CSC_|GH_|GITHUB_|BT_|AWS_|STRIP|BUILD_') \ 5 | --env ELECTRON_CACHE="/root/.cache/electron" \ 6 | --env ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder" \ 7 | --env SENTRY_API_KEY="${SENTRY_API_KEY:?'error: SENTRY_API_KEY is empty'}" \ 8 | --env MIXPANEL_API_TOKEN="${MIXPANEL_API_TOKEN:?error: MIXPANEL_API_TOKEN is empty}" \ 9 | --env SENTRY_LINK="${SENTRY_LINK:?error SENTRY_LINK is empty}" \ 10 | --env GH_TOKEN="${GH_TOKEN:?error GH_TOKEN is empty}" \ 11 | -v ${PWD}:/project \ 12 | -v ${PWD##*/}-node-modules:/project/node_modules \ 13 | -v ~/.cache/electron:/root/.cache/electron \ 14 | -v ~/.cache/electron-builder:/root/.cache/electron-builder \ 15 | chronos/builder:wine 16 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/chevron-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Icon Dark / Chevron down / Disabled 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /afterPack.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fs = require('fs'); 3 | 4 | exports.default = async function afterPack(context) { 5 | if (process.platform === 'win32') { 6 | const libPath = ( 7 | path.join( 8 | __dirname.split('node_modules')[0], 9 | 'node_modules/screenshot-desktop/lib/win32', 10 | ) 11 | ); 12 | const screenshotDesktopPath = path.join( 13 | context.appOutDir, 14 | 'resources/screenshot-desktop', 15 | ); 16 | fs.mkdirSync(screenshotDesktopPath); 17 | 18 | fs.copyFileSync( 19 | path.join(libPath, 'screencapture_1.3.2.bat'), 20 | path.join(screenshotDesktopPath, 'screenCapture_1.3.2.bat'), 21 | ); 22 | fs.copyFileSync( 23 | path.join(libPath, 'app.manifest'), 24 | path.join(screenshotDesktopPath, 'app.manifest'), 25 | ); 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /scripts/dockerBuild.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker run --rm -ti \ 4 | --env-file <(env | grep -iE 'DEBUG|NODE_|ELECTRON_|YARN_|NPM_|CI|CIRCLE|TRAVIS|APPVEYOR_|CSC_|GH_|GITHUB_|BT_|AWS_|STRIP|BUILD_') \ 5 | --env ELECTRON_CACHE="/root/.cache/electron" \ 6 | --env ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder" \ 7 | --env SENTRY_API_KEY="${SENTRY_API_KEY}:?'error: $SENTRY_API_KEY is empty'" \ 8 | --env MIXPANEL_API_TOKEN="${MIXPANEL_API_TOKEN}:?error: $MIXPANEL_API_TOKEN is empty" \ 9 | --env SENTRY_LINK="${SENTRY_LINK}:?error $SENTRY_LINK is empty" \ 10 | --env GH_TOKEN="${GH_TOKEN}:?error $GH_TOKEN is empty" \ 11 | -v ${PWD}:/project \ 12 | -v ${PWD##*/}-node-modules:/project/node_modules \ 13 | -v ~/.cache/electron:/root/.cache/electron \ 14 | -v ~/.cache/electron-builder:/root/.cache/electron-builder \ 15 | chronos/builder:wine 16 | -------------------------------------------------------------------------------- /app/renderer/utils/external-open-util/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { 3 | shell, 4 | } from 'electron'; 5 | import type { 6 | Worklog, 7 | } from 'types'; 8 | 9 | export function openWorklogInBrowser( 10 | worklogId: Worklog, 11 | issueKey: string, 12 | baseUrl: string, 13 | ): { (ev: SyntheticMouseEvent): void } { 14 | return (ev: SyntheticMouseEvent) => { 15 | ev.preventDefault(); 16 | const urlQuery = `focusedWorklogId=${worklogId}&page=com.atlassian.jira.plugin.system.issuetabpanels%3Aworklog-tabpanel#worklog-${worklogId}`; 17 | shell.openExternal(`${baseUrl}/browse/${issueKey}?${urlQuery}`); 18 | }; 19 | } 20 | 21 | export function openURLInBrowser(url: string): { (ev: SyntheticMouseEvent): void } { 22 | return (ev: SyntheticMouseEvent) => { 23 | ev.preventDefault(); 24 | shell.openExternal(url); 25 | }; 26 | } 27 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/SettingsModal/General/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const SettingsSectionContent = styled.div` 5 | margin-bottom: 30px; 6 | `; 7 | 8 | export const ContentLabel = styled.span` 9 | margin-left: 6px; 10 | margin-bottom: 10px; 11 | display: block; 12 | font-weight: 600; 13 | color: black; 14 | `; 15 | 16 | export const InputNumber = styled.input.attrs({ 17 | type: 'number', 18 | })` 19 | appearance: none; 20 | color: inherit; 21 | font-size: 16px; 22 | font-family: inherit; 23 | letter-spacing: inherit; 24 | 25 | background: transparent; 26 | border: 0; 27 | box-sizing: border-box; 28 | cursor: inherit; 29 | line-height: inherit; 30 | margin: 0; 31 | outline: none; 32 | padding: 0; 33 | width: 100%; 34 | :invalid { 35 | box-shadow: none; 36 | } 37 | `; 38 | -------------------------------------------------------------------------------- /app/renderer/types/profile.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import * as actionTypes from '../actions/actionTypes/profile'; 3 | 4 | export type User = { 5 | accountId: string, 6 | active: boolean, 7 | applicationRoles?: { 8 | size: number, 9 | items: Array, 10 | }, 11 | avatarUrls: { 12 | '16x16': string, 13 | '24x24': string, 14 | '32x32': string, 15 | '48x48': string, 16 | }, 17 | displayName: string, 18 | emailAddress: string, 19 | expand?: string, 20 | groups?: { 21 | size: number, 22 | items: Array, 23 | }, 24 | key: string, 25 | name: string, 26 | locale?: string, 27 | self: string, 28 | timeZone: string, 29 | }; 30 | 31 | export type ProfileAction = 32 | {| 33 | type: typeof actionTypes.FILL_USER_DATA, 34 | payload: User, 35 | |}; 36 | 37 | export type ProfileState = {| 38 | userData: User | null, 39 | |}; 40 | -------------------------------------------------------------------------------- /app/renderer/types/worklogs.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import * as actionTypes from '../actions/actionTypes/worklogs'; 3 | import type { 4 | Id, 5 | User, 6 | } from './'; 7 | 8 | 9 | export type WorklogsAction = 10 | {| 11 | type: typeof actionTypes.SAVE_WORKLOG_REQUEST, 12 | payload: any, 13 | |} | 14 | {| 15 | type: typeof actionTypes.DELETE_WORKLOG_REQUEST, 16 | worklogId: Id, 17 | |}; 18 | 19 | export type Worklog = {| 20 | __type: 'group' | 'single', 21 | self: string, 22 | author: User, 23 | updateAuthor: User, 24 | comment: string | null, 25 | created: string, 26 | updated: string, 27 | started: string, 28 | timeSpent: string, 29 | timeSpentSeconds: number, 30 | id: string, 31 | issueId: string, 32 | worklogsCount?: number, 33 | worklogs?: Array, 34 | |}; 35 | 36 | export type WorklogsResources = { 37 | [Id]: Worklog, 38 | } 39 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/NoIssues/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { 3 | Flex, 4 | } from 'components'; 5 | 6 | 7 | export const NoIssues = styled(Flex).attrs({ 8 | column: true, 9 | justifyCenter: true, 10 | alignCenter: true, 11 | })` 12 | width: 100%; 13 | height: 100%; 14 | flex: 1 0 100%; 15 | `; 16 | 17 | export const Title = styled.span` 18 | margin-top: 10px; 19 | color: #172b4d; 20 | font-size: 24px; 21 | font-weight: 500; 22 | font-style: normal; 23 | line-height: 24px; 24 | letter-spacing: -0.24px; 25 | `; 26 | 27 | export const Subtitle = styled.span` 28 | margin-bottom: 20px; 29 | margin: 6px; 30 | color: #172b4d; 31 | font-size: 14px; 32 | font-weight: 400; 33 | font-style: normal; 34 | line-height: 20px; 35 | `; 36 | 37 | export const NoIssuesImage = styled.img` 38 | width: 140px; 39 | `; 40 | -------------------------------------------------------------------------------- /app/renderer/components/Flex/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Flex = styled.div` 4 | display: flex; 5 | flex-direction: ${props => (props.column ? 'column' : 'row')}; 6 | flex-wrap: ${props => (props.wrap ? 'wrap' : 'nowrap')}; 7 | align-items: ${(props) => { 8 | if (props.alignCenter) { 9 | return 'center'; 10 | } 11 | if (props.alignEnd) { 12 | return 'flex-end'; 13 | } 14 | if (props.alignStart) { 15 | return 'flex-start'; 16 | } 17 | return props.alignItems || 'normal'; 18 | }}; 19 | justify-content: ${(props) => { 20 | if (props.justifyCenter) { 21 | return 'center'; 22 | } 23 | if (props.spaceBetween) { 24 | return 'space-between'; 25 | } 26 | if (props.spaceAround) { 27 | return 'space-around'; 28 | } 29 | return props.justifyContent || 'normal'; 30 | }}; 31 | `; 32 | -------------------------------------------------------------------------------- /app/renderer/store/configureStore.development.js: -------------------------------------------------------------------------------- 1 | import { 2 | createStore, 3 | applyMiddleware, 4 | compose, 5 | } from 'redux'; 6 | import createSagaMiddleware, { 7 | END, 8 | } from 'redux-saga'; 9 | 10 | import rendererEnhancer from './middleware'; 11 | import rootReducer from '../reducers'; 12 | 13 | const sagaMiddleware = createSagaMiddleware(); 14 | const middleware = [ 15 | rendererEnhancer, 16 | sagaMiddleware, 17 | ].filter(Boolean); 18 | 19 | const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; 20 | 21 | function configureStore(initialState) { 22 | const store = createStore( 23 | rootReducer, 24 | initialState, 25 | composeEnhancers( 26 | applyMiddleware(...middleware), 27 | ), 28 | ); 29 | 30 | store.runSaga = sagaMiddleware.run; 31 | store.close = () => store.dispatch(END); 32 | return store; 33 | } 34 | 35 | export default configureStore; 36 | -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/IssueViewPlaceholder/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const IssueViewPlaceholder = styled.div` 4 | display: flex; 5 | flex-direction: column; 6 | justify-content: center; 7 | align-items: center; 8 | flex-grow: 1; 9 | height: 100vh; 10 | border-left: 1px solid rgba(0, 0, 0, 0.18); 11 | background: hsla(0, 0%, 98%, 1); 12 | `; 13 | export const Title = styled.span` 14 | margin-top: 16px; 15 | color: #172b4d; 16 | font-size: 24px; 17 | font-weight: 500; 18 | font-style: normal; 19 | line-height: 24px; 20 | letter-spacing: -0.24px; 21 | `; 22 | export const Subtitle = styled.span` 23 | margin-bottom: 20px; 24 | margin: 6px; 25 | color: #172b4d; 26 | font-size: 14px; 27 | font-weight: 400; 28 | font-style: normal; 29 | line-height: 20px; 30 | `; 31 | export const NoIssuesImage = styled.img` 32 | width: 120px; 33 | `; 34 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueReport/MainColumn/ProgressBar/ProgressBarFill.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import type { 4 | StatelessFunctionalComponent, 5 | Node, 6 | } from 'react'; 7 | 8 | import * as S from './styled'; 9 | 10 | 11 | type Props = { 12 | name: string, 13 | label: string, 14 | width: number, 15 | color: string, 16 | time: string, 17 | style: any, 18 | }; 19 | 20 | // eslint-disable-next-line 21 | const ProgressBarFillContainer: StatelessFunctionalComponent = ({ 22 | name, 23 | label, 24 | width, 25 | color, 26 | time, 27 | style, 28 | }: Props): Node => ( 29 | 30 | {time} 31 | 32 | {label} 33 | 34 | ); 35 | 36 | export default ProgressBarFillContainer; 37 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarRecentWorklogs/NoWorklogs/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { 3 | Flex, 4 | } from 'components'; 5 | 6 | 7 | export const NoWorklogs = styled(Flex).attrs({ 8 | column: true, 9 | justifyCenter: true, 10 | alignCenter: true, 11 | })` 12 | width: 100%; 13 | height: 100%; 14 | flex: 1 0 100%; 15 | background: white; 16 | `; 17 | 18 | export const Title = styled.span` 19 | margin-top: 10px; 20 | color: #172b4d; 21 | font-size: 24px; 22 | font-weight: 500; 23 | font-style: normal; 24 | line-height: 24px; 25 | letter-spacing: -0.24px; 26 | `; 27 | export const Subtitle = styled.span` 28 | margin-bottom: 20px; 29 | margin: 6px; 30 | color: #172b4d; 31 | font-size: 14px; 32 | font-weight: 400; 33 | font-style: normal; 34 | line-height: 20px; 35 | `; 36 | export const NoIssuesImage = styled.img` 37 | width: 140px; 38 | `; 39 | 40 | -------------------------------------------------------------------------------- /app/renderer/types/filters.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | Id, 4 | User, 5 | } from './'; 6 | 7 | export type Filter = { 8 | assignee: Array, 9 | status: Array, 10 | type: Array, 11 | }; 12 | 13 | export type JIRAFilter = { 14 | self: string, 15 | id: Id, 16 | name: string, 17 | owner: User, 18 | jql: string, 19 | viewUrl: string, 20 | searchUrl: string, 21 | favourite: boolean, 22 | favouritedCount: number, 23 | sharePermissions: Array, 24 | sharedUsers: { 25 | size: number, 26 | items: Array, 27 | // max-results: number, 28 | // start-index: number, 29 | // end-index: number, 30 | }, 31 | subscriptions: { 32 | size: number, 33 | items: Array, 34 | // max-results: number, 35 | // start-index: number, 36 | // end-index: number, 37 | }, 38 | }; 39 | 40 | export type FiltersResources = { 41 | [Id]: JIRAFilter, 42 | }; 43 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarRecentWorklogs/TimestampItem/TimestampItem.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import moment from 'moment'; 4 | import type { 5 | StatelessFunctionalComponent, 6 | Node, 7 | } from 'react'; 8 | import type Moment from 'moment'; 9 | import type { 10 | Worklog, 11 | } from 'types'; 12 | 13 | import { 14 | stj, 15 | } from 'utils/time-util'; 16 | 17 | import * as S from './styled'; 18 | 19 | 20 | type Props = { 21 | date: Moment, 22 | worklogs: Array, 23 | }; 24 | 25 | const TimestampItem: StatelessFunctionalComponent = ({ 26 | date, 27 | worklogs, 28 | }: Props): Node => ( 29 | 30 | 31 | {moment(date).calendar()}  32 | 33 | 34 | {stj(worklogs.reduce((total, item) => total + item.timeSpentSeconds, 0), 'h[h] m[m]')} 35 | 36 | 37 | ); 38 | 39 | export default TimestampItem; 40 | -------------------------------------------------------------------------------- /app/renderer/store/configurePreloadStore.js: -------------------------------------------------------------------------------- 1 | import { 2 | createStore, 3 | applyMiddleware, 4 | combineReducers, 5 | compose, 6 | } from 'redux'; 7 | import createSagaMiddleware, { 8 | END, 9 | } from 'redux-saga'; 10 | import { 11 | windowsManager, 12 | } from 'shared/reducers'; 13 | 14 | import rendererEnhancer from './middleware'; 15 | 16 | const sagaMiddleware = createSagaMiddleware(); 17 | const middleware = [ 18 | rendererEnhancer, 19 | sagaMiddleware, 20 | ].filter(Boolean); 21 | 22 | export default function configureStore( 23 | initialState = {}, 24 | reducers = {}, 25 | ) { 26 | const store = createStore( 27 | combineReducers({ 28 | windowsManager, 29 | ...reducers, 30 | }), 31 | initialState, 32 | compose( 33 | applyMiddleware(...middleware), 34 | ), 35 | ); 36 | 37 | store.runSaga = sagaMiddleware.run; 38 | store.close = () => store.dispatch(END); 39 | return store; 40 | } 41 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueWorklogs/WorklogItem/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const Worklog = styled.div` 5 | display: flex; 6 | flex-flow: column nowrap; 7 | background-color: ${props => (props.selected ? '#f4f5f7' : 'transparent')}; 8 | &:hover { 9 | background-color: #f4f5f7 !important; 10 | }; 11 | flex: 1 0 0%; 12 | `; 13 | 14 | export const UserAvatar = styled.img` 15 | width: 24px; 16 | height: 24px; 17 | border-radius: 50%; 18 | user-select: none; 19 | margin-right: 8px; 20 | `; 21 | 22 | export const WorklogActions = styled.div` 23 | display: flex; 24 | align-self: flex-end; 25 | flex-flow: row nowrap; 26 | margin-left: auto; 27 | > div { 28 | cursor: pointer; 29 | &:hover { 30 | color: black; 31 | } 32 | } 33 | `; 34 | 35 | export const Edited = styled.span` 36 | margin-left: 5px; 37 | span { 38 | color: #de350b; 39 | } 40 | `; 41 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueWorklogs/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const WorklogContainer = styled.div` 5 | display: flex; 6 | flex-flow: column nowrap; 7 | background-color: ${props => (props.selected ? '#f4f5f7' : 'transparent')}; 8 | &:hover { 9 | background-color: #f4f5f7 !important; 10 | }; 11 | flex: 1 0 0%; 12 | `; 13 | 14 | export const UserAvatar = styled.img` 15 | width: 24px; 16 | height: 24px; 17 | border-radius: 50%; 18 | user-select: none; 19 | margin-right: 8px; 20 | `; 21 | 22 | export const WorklogActions = styled.div` 23 | display: flex; 24 | align-self: flex-end; 25 | flex-flow: row nowrap; 26 | margin-left: auto; 27 | > div { 28 | cursor: pointer; 29 | &:hover { 30 | color: black; 31 | } 32 | } 33 | `; 34 | 35 | export const Edited = styled.span` 36 | margin-left: 5px; 37 | span { 38 | color: #de350b; 39 | } 40 | `; 41 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/issues.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export const FETCH_ISSUES_REQUEST = 'issues/FETCH_REQUEST'; 4 | export const FETCH_RECENT_ISSUES_REQUEST = 'issues/FETCH_RECENT_REQUEST'; 5 | export const REFETCH_ISSUES_REQUEST = 'issues/REFETCH_REQUEST'; 6 | export const FETCH_NEW_ISSUE_REQUEST = 'issues/FETCH_NEW_ISSUE_REQUEST'; 7 | export const FETCH_UPDATE_ISSUE_REQUEST = 'issues/FETCH_UPDATE_ISSUE_REQUEST'; 8 | export const TRANSITION_ISSUE_REQUEST = 'issues/TRANSITION_ISSUE_REQUEST'; 9 | export const COMMENT_REQUEST = 'issues/COMMENT_REQUEST'; 10 | export const ASSIGN_ISSUE_REQUEST = 'issues/ASSIGN_ISSUE_REQUEST'; 11 | export const SELECT_ISSUE = 'issues/SELECT'; 12 | export const SHOW_ISSUE_FORM_WINDOW = 'issues/SHOW_ISSUE_FORM_WINDOW'; 13 | export const CLOSE_ISSUE_FORM_WINDOW = 'issues/CLOSE_ISSUE_FORM_WINDOW'; 14 | export const SHOW_ATTACHMENT_WINDOW = 'issues/SHOW_ATTACHMENT_WINDOW'; 15 | export const SET_ATTACHMENTS = 'issues/SET_ATTACHMENTS'; 16 | -------------------------------------------------------------------------------- /app/renderer/containers/FlagsContainer/SpinnerContainer/styled/index.js: -------------------------------------------------------------------------------- 1 | import styled, { 2 | keyframes, 3 | } from 'styled-components'; 4 | 5 | export const SpinnerWrapper = styled.div` 6 | display: flex; 7 | justify-content: flex-start; 8 | align-items: center; 9 | `; 10 | 11 | export const SpinnerTitle = styled.p` 12 | margin: 0; 13 | padding: 0 10px; 14 | font-size: 14px; 15 | `; 16 | 17 | const blink = keyframes` 18 | 0% { 19 | opacity: .2; 20 | } 21 | 20% { 22 | opacity: 1; 23 | } 24 | 100% { 25 | opacity: .2; 26 | } 27 | `; 28 | 29 | export const SpinnerDot = styled.span` 30 | font-size: 14px; 31 | animation-name: ${blink}; 32 | animation-duration: 1.4s; 33 | animation-iteration-count: infinite; 34 | animation-fill-mode: both; 35 | 36 | &:nth-child(3) { 37 | animation-delay: .3s; 38 | } 39 | 40 | &:nth-child(2) { 41 | animation-delay: .2s; 42 | } 43 | 44 | &::nth-child(1) { 45 | animation-delay: .1s; 46 | } 47 | `; 48 | -------------------------------------------------------------------------------- /app/renderer/actions/auth.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import type { 3 | AuthAction, 4 | } from 'types'; 5 | 6 | import * as actionTypes from './actionTypes'; 7 | 8 | 9 | export const authRequest = (payload: {| 10 | protocol: string, 11 | hostname: string, 12 | port: string, 13 | pathname: string, 14 | cookies: any, 15 | |}): AuthAction => ({ 16 | type: actionTypes.AUTH_REQUEST, 17 | ...payload, 18 | }); 19 | 20 | export const authSelfHostRequest = (payload: {| 21 | username: string, 22 | password: string, 23 | |}): AuthAction => ({ 24 | type: actionTypes.AUTH_SELF_HOST_REQUEST, 25 | payload, 26 | }); 27 | 28 | export const logoutRequest = ({ forget = true }): AuthAction => ({ 29 | type: actionTypes.LOGOUT_REQUEST, 30 | forget, 31 | }); 32 | 33 | export const switchAccount = (payload: {| 34 | name: string, 35 | protocol: string, 36 | hostname: string, 37 | port: string, 38 | pathname: string, 39 | |}) => ({ 40 | type: actionTypes.SWITCH_ACCOUNT, 41 | ...payload, 42 | }); 43 | -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/IssueItemPlaceholder/IssueItemPlaceholder.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import type { 4 | StatelessFunctionalComponent, Node, 5 | } from 'react'; 6 | 7 | import { 8 | PlaceholderContainer, Placeholder, 9 | } from './styled'; 10 | import { 11 | AnimatedPlaceholder, 12 | } from '../styled'; 13 | 14 | const IssueItemPlaceholder: StatelessFunctionalComponent<{}> = (): Node => ( 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | ); 28 | 29 | export default IssueItemPlaceholder; 30 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/stop-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Stop-icon 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/renderer/components/ReduxFormComponents/Input.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React, { 3 | Component, 4 | } from 'react'; 5 | 6 | 7 | import type { 8 | FieldProps, 9 | } from 'redux-form'; 10 | 11 | import * as S from './styled'; 12 | 13 | type Props = { 14 | autoFocus: boolean, 15 | type: string, 16 | placeholder: string, 17 | } & FieldProps; 18 | 19 | class Input extends Component { 20 | input = null; 21 | 22 | render() { 23 | const { 24 | meta, 25 | input, 26 | autoFocus, 27 | type, 28 | placeholder, 29 | } = this.props; 30 | return ( 31 | 32 | { 35 | this.input = el; 36 | }} 37 | type={type} 38 | autoFocus={autoFocus} 39 | placeholder={placeholder} 40 | /> 41 | {meta.touched && meta.error && {meta.error}} 42 | 43 | ); 44 | } 45 | } 46 | 47 | export default Input; 48 | -------------------------------------------------------------------------------- /app/shared/actions/windowsManager.js: -------------------------------------------------------------------------------- 1 | import { 2 | actionTypes, 3 | } from '.'; 4 | 5 | 6 | export const setWindowsState = ({ 7 | byId = {}, 8 | allIds = [], 9 | scopes = {}, 10 | merge = false, 11 | scope = [], 12 | }) => ({ 13 | type: actionTypes.SET_WINDOWS_STATE, 14 | payload: { 15 | byId, 16 | allIds, 17 | scopes, 18 | }, 19 | meta: { 20 | merge, 21 | }, 22 | scope, 23 | }); 24 | 25 | export const addWindow = ({ 26 | id, 27 | scopes = [], 28 | scope = [], 29 | }) => ({ 30 | type: actionTypes.ADD_WINDOW, 31 | payload: { 32 | id, 33 | scopes, 34 | }, 35 | scope, 36 | }); 37 | 38 | export const removeWindow = ({ 39 | id, 40 | scope = [], 41 | }) => ({ 42 | type: actionTypes.REMOVE_WINDOW, 43 | payload: { 44 | id, 45 | }, 46 | scope, 47 | }); 48 | 49 | export const addWindowEvent = ({ 50 | id, 51 | log, 52 | scope = [], 53 | }) => ({ 54 | type: actionTypes.ADD_WINDOW_EVENT, 55 | payload: { 56 | id, 57 | log, 58 | }, 59 | scope, 60 | }); 61 | -------------------------------------------------------------------------------- /flow-typed/npm/calculate-size_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 6577d782f3c828e61a26a0670835649d 2 | // flow-typed version: <>/calculate-size_v1.1.1/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'calculate-size' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'calculate-size' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'calculate-size/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module 'calculate-size/lib/index.jsx' { 31 | declare module.exports: $Exports<'calculate-size/lib/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /flow-typed/npm/electron-debug_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: c9996ad94efb307bec9f8d41e0e6617a 2 | // flow-typed version: <>/electron-debug_v2.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'electron-debug' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'electron-debug' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | 26 | 27 | // Filename aliases 28 | declare module 'electron-debug/index' { 29 | declare module.exports: $Exports<'electron-debug'>; 30 | } 31 | declare module 'electron-debug/index.jsx' { 32 | declare module.exports: $Exports<'electron-debug'>; 33 | } 34 | -------------------------------------------------------------------------------- /flow-typed/npm/@babel/preset-flow_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 5c676b8023e6acf939b174357f247963 2 | // flow-typed version: <>/@babel/preset-flow_v7.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * '@babel/preset-flow' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module '@babel/preset-flow' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module '@babel/preset-flow/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module '@babel/preset-flow/lib/index.jsx' { 31 | declare module.exports: $Exports<'@babel/preset-flow/lib/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /app/renderer/components/ReduxFormComponents/UnderlineInput.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React, { 3 | Component, 4 | } from 'react'; 5 | 6 | import type { 7 | FieldProps, 8 | } from 'redux-form'; 9 | 10 | import * as S from './styled'; 11 | 12 | type Props = { 13 | autoFocus: boolean, 14 | type: string, 15 | placeholder: string, 16 | } & FieldProps; 17 | 18 | class UnderlineInput extends Component { 19 | input = null; 20 | 21 | render() { 22 | const { 23 | meta, 24 | input, 25 | autoFocus, 26 | type, 27 | placeholder, 28 | } = this.props; 29 | return ( 30 | 31 | { 34 | this.input = el; 35 | }} 36 | type={type} 37 | autoFocus={autoFocus} 38 | placeholder={placeholder} 39 | /> 40 | {meta.touched && meta.error && {meta.error}} 41 | 42 | ); 43 | } 44 | } 45 | 46 | export default UnderlineInput; 47 | -------------------------------------------------------------------------------- /flow-typed/npm/@babel/preset-react_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: b1515e14567b39c221ebc8303c367629 2 | // flow-typed version: <>/@babel/preset-react_v7.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * '@babel/preset-react' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module '@babel/preset-react' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module '@babel/preset-react/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module '@babel/preset-react/lib/index.jsx' { 31 | declare module.exports: $Exports<'@babel/preset-react/lib/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueViewTabs/IssueViewTabs.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | 4 | import type { 5 | StatelessFunctionalComponent, 6 | Node, 7 | } from 'react'; 8 | 9 | import { 10 | Flex, 11 | } from 'components'; 12 | 13 | import * as S from './styled'; 14 | 15 | 16 | type Props = { 17 | tabs: Array, 18 | currentTab: string, 19 | onTabClick: (tab: string) => void, 20 | }; 21 | 22 | const IssueViewTabs: StatelessFunctionalComponent = ({ 23 | tabs, 24 | currentTab, 25 | onTabClick, 26 | }: Props): Node => ( 27 | 28 | 29 | {tabs.map( 30 | tab => ( 31 | { 35 | onTabClick(tab); 36 | }} 37 | > 38 | {tab} 39 | 40 | ), 41 | )} 42 | 43 | 44 | ); 45 | 46 | export default IssueViewTabs; 47 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/TrackingBar/WorklogCommentDialog/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import EditFilledIcon from '@atlaskit/icon/glyph/edit-filled'; 3 | import { 4 | gridSize, 5 | fontSize, 6 | } from '@atlaskit/theme'; 7 | 8 | export const EditButton = styled(EditFilledIcon)` 9 | cursor: pointer; 10 | background: white; 11 | height: 27px; 12 | width: 27px; 13 | display: flex; 14 | justify-content: center; 15 | align-items: center; 16 | border-radius: 50%; 17 | border: 2px solid white; 18 | padding: 2px; 19 | `; 20 | 21 | export const EditButtonContainer = styled.div` 22 | cursor: pointer; 23 | `; 24 | 25 | export const IssueCommentCheckboxWrapper = styled.div` 26 | margin-left: -10px; 27 | `; 28 | 29 | export const ReadViewContainer = styled.div` 30 | display: flex; 31 | max-width: 100%; 32 | overflow: hidden; 33 | padding: ${gridSize()}px ${gridSize() - 2}px; 34 | font-size: ${fontSize()}px; 35 | height: ${(gridSize() * 2.5) / fontSize()}em; 36 | line-height: ${(gridSize() * 2.5) / fontSize()}; 37 | `; 38 | -------------------------------------------------------------------------------- /app/renderer/containers/Modals/SettingsModal/styled/index.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-confusing-arrow */ 2 | import styled from 'styled-components'; 3 | 4 | export const SettingsSectionLabel = styled.a` 5 | margin-bottom: 15px; 6 | color: ${props => props.active ? 'black' : '#0052CC'}; 7 | font-weight: ${props => props.active ? '600' : 'normal'}; 8 | cursor: pointer; 9 | `; 10 | export const SettingsSectionContent = styled.div` 11 | margin-bottom: 30px; 12 | `; 13 | export const Separator = styled.div` 14 | height: 100%; 15 | width: 1px; 16 | min-width: 1px; 17 | background: #d2d7dc; 18 | margin: 0px 25px 0px 30px; 19 | `; 20 | export const ContentLabel = styled.span` 21 | margin-left: 6px; 22 | margin-bottom: 10px; 23 | display: block; 24 | font-weight: 600; 25 | color: black; 26 | `; 27 | export const CheckboxContainer = styled.div` 28 | padding: 2px 4px; 29 | border-radius: 3px; 30 | cursor: pointer; 31 | user-select: none; 32 | :hover { 33 | background-color: #F4F5F7; 34 | } 35 | :active { 36 | background-color: #B3D4FF; 37 | } 38 | `; 39 | -------------------------------------------------------------------------------- /flow-typed/npm/webpack-sentry-plugin_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: eb2528b3fd0ae12f27e74a702c24110a 2 | // flow-typed version: <>/webpack-sentry-plugin_v1.16.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'webpack-sentry-plugin' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'webpack-sentry-plugin' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'webpack-sentry-plugin/dist/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module 'webpack-sentry-plugin/dist/index.jsx' { 31 | declare module.exports: $Exports<'webpack-sentry-plugin/dist/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/stopHoverNew.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Stop 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/renderer/actions/actionTypes/screenshots.js: -------------------------------------------------------------------------------- 1 | export const TAKE_SCREENSHOT_REQUEST = 'TAKE_SCREENSHOT_REQUEST'; 2 | export const TAKE_SCREENSHOT_FINISHED = 'TAKE_SCREENSHOT_FINISHED'; 3 | export const UPLOAD_SCREENSHOT_FINISHED = 'UPLOAD_SCREENSHOT_FINISHED'; 4 | export const SET_NOTIFICATION_SCREENSHOT = 'SET_NOTIFICATION_SCREENSHOT'; 5 | export const NATIVE_SCREENSHOT_NOTIFICATION_CLICK = 'NATIVE_SCREENSHOT_NOTIFICATION_CLICK'; 6 | export const TEST_SCREENSHOT_WINDOW_CLOSE = 'TEST_SCREENSHOT_WINDOW_CLOSE'; 7 | export const KEEP_SCREENSHOT = 'KEEP_SCREENSHOT'; 8 | export const DISMISS_ONLY_SCREENSHOT = 'DISMISS_ONLY_SCREENSHOT'; 9 | export const DISMISS_TIME_AND_SCREENSHOT = 'DISMISS_TIME_AND_SCREENSHOT'; 10 | export const ADD_SCREENSHOT = 'ADD_SCREENSHOT'; 11 | export const SET_SCREENSHOTS = 'SET_SCREENSHOTS'; 12 | export const DELETE_SCREENSHOT_REQUEST = 'DELETE_SCREENSHOT_REQUEST'; 13 | export const DELETE_SCREENSHOT = 'DELETE_SCREENSHOT'; 14 | export const SET_SCREENSHOTS_VIEWER_STATE = 'SET_SCREENSHOTS_VIEWER_STATE'; 15 | export const SHOW_SCREENSHOTS_VIEWER_WINDOW = 'SHOW_SCREENSHOTS_VIEWER_WINDOW'; 16 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/stop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Stop 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | .eslintcache 25 | 26 | # Dependency directory 27 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 28 | node_modules 29 | app/node_modules 30 | 31 | # OSX 32 | .DS_Store 33 | 34 | # App packaged 35 | release 36 | app/main.prod.js 37 | app/main.prod.js.map 38 | app/bundle.js 39 | app/bundle.js.map 40 | app/style.css 41 | app/style.css.map 42 | app/report.html 43 | report.html 44 | dist 45 | dll 46 | main.js 47 | main.js.map 48 | 49 | .idea 50 | npm-debug.log.* 51 | worklogs/* 52 | screenshots/* 53 | 54 | package-lock\.json 55 | 56 | sentry.properties 57 | prod-env.sh 58 | -------------------------------------------------------------------------------- /app/renderer/assets/stylesheets/main.less: -------------------------------------------------------------------------------- 1 | /* open-sans-regular - greek-ext_cyrillic-ext_latin_vietnamese_greek_cyrillic_latin-ext */ 2 | @font-face { 3 | font-family: 'Open Sans'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url('../fonts/OpenSans-Light.ttf'); 7 | } 8 | 9 | @font-face { 10 | font-family: 'Open Sans'; 11 | font-style: normal; 12 | font-weight: 700; 13 | src: url('../fonts/OpenSans-Bold.ttf'); 14 | } 15 | 16 | @font-face { 17 | font-family: 'Open Sans'; 18 | font-style: normal; 19 | font-weight: 600; 20 | src: url('../fonts/OpenSans-Bold.ttf'); 21 | } 22 | 23 | @font-face { 24 | font-family: 'Circular Book'; 25 | font-style: normal; 26 | font-weight: normal; 27 | src: url('../fonts/lineto-circular-book-c.woff'); 28 | } 29 | 30 | @font-face { 31 | font-family: 'Circular Bold'; 32 | font-style: normal; 33 | font-weight: normal; 34 | src: url('../fonts/lineto-circular-bold-c.woff'); 35 | } 36 | 37 | @import "~font-awesome/css/font-awesome.css"; 38 | @import "~rc-time-picker/assets/index.css"; 39 | 40 | @import "./base.less"; 41 | @import './aui/aui.css'; 42 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/stop-new.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Stop 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/stopHover.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Stop 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/renderer/containers/Main/Main.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { 4 | ThemeProvider, 5 | } from 'styled-components'; 6 | 7 | import type { 8 | StatelessFunctionalComponent, 9 | Node, 10 | } from 'react'; 11 | 12 | import { 13 | AlertModal, 14 | SaveWorklogInetIssueModal, 15 | SettingsModal, 16 | WorklogModal, 17 | ConfirmDeleteWorklogModal, 18 | } from '../Modals'; 19 | import Header from '../Header'; 20 | import Sidebar from '../Sidebar'; 21 | import IssueView from '../IssueView'; 22 | import * as S from './styled'; 23 | 24 | 25 | const theme = { 26 | primary: '#0052CC', 27 | }; 28 | 29 | type Props = {}; 30 | 31 | const Main: StatelessFunctionalComponent = (): Node => ( 32 | 33 | 34 | 35 |
36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | ); 48 | 49 | export default Main; 50 | -------------------------------------------------------------------------------- /flow-typed/npm/@babel/plugin-external-helpers_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 7d6037ccbc87c7ebaa0318478b1ff823 2 | // flow-typed version: <>/@babel/plugin-external-helpers_v^7.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * '@babel/plugin-external-helpers' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module '@babel/plugin-external-helpers' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module '@babel/plugin-external-helpers/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module '@babel/plugin-external-helpers/lib/index.jsx' { 31 | declare module.exports: $Exports<'@babel/plugin-external-helpers/lib/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017-present Vladimir Pal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /flow-typed/npm/write-file-webpack-plugin_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 3a20b0b3068da5662ce542c4b84b908d 2 | // flow-typed version: <>/write-file-webpack-plugin_v^4.4.1/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'write-file-webpack-plugin' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'write-file-webpack-plugin' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'write-file-webpack-plugin/dist/WriteFileWebpackPlugin' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module 'write-file-webpack-plugin/dist/WriteFileWebpackPlugin.js' { 31 | declare module.exports: $Exports<'write-file-webpack-plugin/dist/WriteFileWebpackPlugin'>; 32 | } 33 | -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/RecentItemsPlaceholder/styled/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { AnimatedPlaceholder } from '../../styled'; 3 | 4 | export const TimestampPlaceholder = styled.div` 5 | height: 24px; 6 | padding: 0px 20px; 7 | background: #fff; 8 | text-align: right; 9 | color: rgba(0, 0, 0, 0.7); 10 | padding-bottom: 8px; 11 | border-bottom: 1px solid rgba(151, 151, 151, 0.35); 12 | display: flex; 13 | flex-direction: row; 14 | justify-content: space-between; 15 | align-items: center; 16 | `; 17 | 18 | export const TimestampPlaceholderInfo = styled(AnimatedPlaceholder)` 19 | background: #F4F5F7; 20 | border-radius: 15px; 21 | width: 94px; 22 | height: 24px; 23 | `; 24 | 25 | export const RecentItems = styled.div` 26 | height: 100%; 27 | flex: 1; 28 | background: white; 29 | z-index: 1; 30 | overflow-y: overlay; 31 | overflow-x: hidden; 32 | &::webkit-scrollbar { 33 | width: 2px; 34 | } 35 | `; 36 | 37 | export const RecentItemsBlock = styled.div` 38 | display: flex; 39 | flex-flow: column nowrap; 40 | &:last-child { 41 | padding-bottom: 0; 42 | } 43 | padding: 15px 0; 44 | `; 45 | -------------------------------------------------------------------------------- /flow-typed/npm/@babel/plugin-proposal-do-expressions_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 2e9fbac3f5464f46921a458ce962f3fb 2 | // flow-typed version: <>/@babel/plugin-proposal-do-expressions_v7.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * '@babel/plugin-proposal-do-expressions' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module '@babel/plugin-proposal-do-expressions' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module '@babel/plugin-proposal-do-expressions/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module '@babel/plugin-proposal-do-expressions/lib/index.jsx' { 31 | declare module.exports: $Exports<'@babel/plugin-proposal-do-expressions/lib/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /flow-typed/npm/@babel/plugin-proposal-class-properties_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 8d96417da0e8cd632f5b99c8f8087eea 2 | // flow-typed version: <>/@babel/plugin-proposal-class-properties_v^7.1.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * '@babel/plugin-proposal-class-properties' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module '@babel/plugin-proposal-class-properties' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module '@babel/plugin-proposal-class-properties/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module '@babel/plugin-proposal-class-properties/lib/index.jsx' { 31 | declare module.exports: $Exports<'@babel/plugin-proposal-class-properties/lib/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /flow-typed/npm/bufferutil_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: e5746df351718a09c9b3728c3406d885 2 | // flow-typed version: <>/bufferutil_v4.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'bufferutil' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'bufferutil' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'bufferutil/fallback' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module 'bufferutil/fallback.js' { 31 | declare module.exports: $Exports<'bufferutil/fallback'>; 32 | } 33 | declare module 'bufferutil/index' { 34 | declare module.exports: $Exports<'bufferutil'>; 35 | } 36 | declare module 'bufferutil/index.jsx' { 37 | declare module.exports: $Exports<'bufferutil'>; 38 | } 39 | -------------------------------------------------------------------------------- /app/renderer/components/TextField/TextField.jsx: -------------------------------------------------------------------------------- 1 | import React, { 2 | PureComponent, 3 | } from 'react'; 4 | import Input from '@atlaskit/input'; 5 | import { 6 | FieldBaseStateless, 7 | } from '@atlaskit/field-base'; 8 | 9 | /* eslint-disable react/prop-types */ 10 | export default class extends PureComponent { 11 | static defaultProps = { 12 | onChange: () => {}, 13 | onFocus: () => {}, 14 | onBlur: () => {}, 15 | }; 16 | 17 | state = { 18 | value: this.props.value, 19 | }; 20 | 21 | componentWillReceiveProps(nextProps) { 22 | this.setState({ 23 | value: nextProps.value, 24 | }); 25 | } 26 | 27 | handleOnChange = (e) => { 28 | this.setState({ value: e.target.value }); 29 | this.props.onChange(e); 30 | }; 31 | 32 | focus = () => { 33 | this.input.inputRef.focus(); 34 | }; 35 | 36 | render() { 37 | return ( 38 | 41 | { this.input = fieldRef; }} 44 | onChange={this.handleOnChange} 45 | value={this.state.value} 46 | /> 47 | 48 | ); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/renderer/reducers/resourcesPlugins/clearListPlugin.js: -------------------------------------------------------------------------------- 1 | import { 2 | actionTypes, 3 | } from 'actions'; 4 | 5 | 6 | const clearListPlugin = (resourceType, opts) => 7 | (state, action) => { 8 | if (action.type !== actionTypes.CLEAR_RESOURCES_LIST) { 9 | return state; 10 | } 11 | 12 | const { list } = action; 13 | const newState = { 14 | ...state, 15 | lists: { 16 | ...state.lists, 17 | [list]: 18 | ( 19 | opts.initialState && 20 | opts.initialState.lists && 21 | opts.initialState.lists[list] 22 | ) ? opts.initialState.lists[list] : [], 23 | }, 24 | }; 25 | const indexedList = `${list}Indexed`; 26 | if (indexedList) { 27 | return { 28 | ...newState, 29 | lists: { 30 | ...newState.lists, 31 | [indexedList]: 32 | ( 33 | opts.initialState && 34 | opts.initialState.lists && 35 | opts.initialState.lists[indexedList] 36 | ) ? opts.initialState.lists[indexedList] : {}, 37 | }, 38 | }; 39 | } 40 | return newState; 41 | }; 42 | 43 | 44 | export default clearListPlugin; 45 | -------------------------------------------------------------------------------- /flow-typed/npm/@babel/plugin-proposal-optional-chaining_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 5764c1d4a70a5ffaa9b53c8811fb1cbb 2 | // flow-typed version: <>/@babel/plugin-proposal-optional-chaining_v7.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * '@babel/plugin-proposal-optional-chaining' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module '@babel/plugin-proposal-optional-chaining' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module '@babel/plugin-proposal-optional-chaining/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module '@babel/plugin-proposal-optional-chaining/lib/index.jsx' { 31 | declare module.exports: $Exports<'@babel/plugin-proposal-optional-chaining/lib/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /app/renderer/types/settings.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import * as actionTypes from '../actions/actionTypes/settings'; 3 | 4 | 5 | export type SettingsAction = 6 | {| 7 | type: typeof actionTypes.FILL_LOCAL_DESKTOP_SETTINGS, 8 | payload: any, 9 | |} | 10 | {| 11 | type: typeof actionTypes.SET_LOCAL_DESKTOP_SETTING, 12 | value: any, 13 | settingName: string, 14 | |} | 15 | {| 16 | type: typeof actionTypes.SET_SETTINGS_MODAL_TAB, 17 | tabName: string, 18 | |} | 19 | {| 20 | type: typeof actionTypes.CLEAR_ELECTRON_CACHE, 21 | |}; 22 | 23 | export type SettingsState = {| 24 | dispersion: string, 25 | interval: string, 26 | screenshotsPeriod: number, 27 | screenshotsQuantity: number, 28 | screenshotsEnabled: boolean, 29 | modalTab: 'General' | 'Notifications' | 'Updates', 30 | screenshotsEnabledUsers: Array, 31 | localDesktopSettings: any, 32 | |}; 33 | 34 | export type SettingsGeneral = { 35 | autoCheckForUpdates: boolean, 36 | nativeNotifications: boolean, 37 | screenshotPreviewTime: number, 38 | showScreenshotPreview: boolean, 39 | trayShowTimer: boolean, 40 | updateChannel: string, 41 | updateAutomatically: boolean, 42 | allowEmptyComment: boolean, 43 | }; 44 | -------------------------------------------------------------------------------- /flow-typed/npm/@babel/plugin-proposal-export-default-from_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: e1917a6f64ffea125a1259aa8b6e04d1 2 | // flow-typed version: <>/@babel/plugin-proposal-export-default-from_v7.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * '@babel/plugin-proposal-export-default-from' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module '@babel/plugin-proposal-export-default-from' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module '@babel/plugin-proposal-export-default-from/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module '@babel/plugin-proposal-export-default-from/lib/index.jsx' { 31 | declare module.exports: $Exports<'@babel/plugin-proposal-export-default-from/lib/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /flow-typed/npm/file-loader_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 75f918271f91b1d08a9d602343513468 2 | // flow-typed version: <>/file-loader_v2.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'file-loader' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'file-loader' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'file-loader/dist/cjs' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'file-loader/dist/index' { 30 | declare module.exports: any; 31 | } 32 | 33 | // Filename aliases 34 | declare module 'file-loader/dist/cjs.js' { 35 | declare module.exports: $Exports<'file-loader/dist/cjs'>; 36 | } 37 | declare module 'file-loader/dist/index.jsx' { 38 | declare module.exports: $Exports<'file-loader/dist/index'>; 39 | } 40 | -------------------------------------------------------------------------------- /app/renderer/components/AttachmentPopup/AttachmentsList/styled/index.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ShowAll = styled.div` 4 | width: 100%; 5 | align-items: center; 6 | height: 21% 7 | `; 8 | 9 | export const Item = styled.ul` 10 | margin: 0; 11 | padding: 0; 12 | height: 90%; 13 | white-space:nowrap; 14 | overflow-x: scroll; 15 | overflow-y: auto; 16 | `; 17 | 18 | export const ItemInside = styled.li` 19 | padding-top:20px; 20 | padding-left:10px; 21 | display: inline-block; 22 | width:150px; 23 | height:100px; 24 | `; 25 | 26 | export const ItemImage = styled.div` 27 | width:100%; 28 | height:100%; 29 | display:flex; 30 | flex-direction:column; 31 | justify-content: space-around; 32 | align-items:center; 33 | background: rgb(70,70,70); 34 | cursor:pointer; 35 | overflow: hidden; 36 | 37 | &:hover{ 38 | background: rgb(112,112,112); 39 | } 40 | `; 41 | 42 | export const Image = styled.img` 43 | width:80px; 44 | height:60px; 45 | object-fit: cover; 46 | `; 47 | 48 | export const DescriptionImage = styled.span` 49 | text-align:center; 50 | white-space: normal; 51 | color: white; 52 | width:100%; 53 | font-size: 12px; 54 | `; 55 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/filter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ic-filter-list-48px 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /flow-typed/npm/@babel/plugin-proposal-export-namespace-from_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: c08bed53a45ed9e37ebfa6e4832bd953 2 | // flow-typed version: <>/@babel/plugin-proposal-export-namespace-from_v7.0.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * '@babel/plugin-proposal-export-namespace-from' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module '@babel/plugin-proposal-export-namespace-from' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module '@babel/plugin-proposal-export-namespace-from/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | // Filename aliases 30 | declare module '@babel/plugin-proposal-export-namespace-from/lib/index.jsx' { 31 | declare module.exports: $Exports<'@babel/plugin-proposal-export-namespace-from/lib/index'>; 32 | } 33 | -------------------------------------------------------------------------------- /flow-typed/npm/nanotimer_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 640b38af539634c128ad96a0ef958981 2 | // flow-typed version: <>/nanotimer_v0.3.15/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'nanotimer' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'nanotimer' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'nanotimer/lib/nanotimer' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'nanotimer/test/test-nanotimer' { 30 | declare module.exports: any; 31 | } 32 | 33 | // Filename aliases 34 | declare module 'nanotimer/lib/nanotimer.js' { 35 | declare module.exports: $Exports<'nanotimer/lib/nanotimer'>; 36 | } 37 | declare module 'nanotimer/test/test-nanotimer.js' { 38 | declare module.exports: $Exports<'nanotimer/test/test-nanotimer'>; 39 | } 40 | -------------------------------------------------------------------------------- /app/renderer/components/Placeholders/RecentItemsPlaceholder/RecentItemsPlaceholder.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import type { StatelessFunctionalComponent, Node } from 'react'; 4 | 5 | import IssueItemPlaceholder from '../IssueItemPlaceholder/IssueItemPlaceholder'; 6 | import Flex from '../../Flex/Flex'; 7 | 8 | import * as S from './styled'; 9 | 10 | const RecentItemsPlaceholder: StatelessFunctionalComponent<{}> = (): Node => ( 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | ); 35 | 36 | export default RecentItemsPlaceholder; 37 | -------------------------------------------------------------------------------- /app/renderer/containers/FlagsContainer/FlagHoc/FlagHoc.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { 3 | connect, 4 | } from 'react-redux'; 5 | import { 6 | getStatus as getResourceStatus, 7 | } from 'redux-resource'; 8 | 9 | import type { 10 | StatelessFunctionalComponent, 11 | Node, 12 | } from 'react'; 13 | import type { 14 | Connector, 15 | } from 'react-redux'; 16 | 17 | 18 | type Props = { 19 | pending: boolean, 20 | render: (pending: boolean) => Node, 21 | resourceType: string, 22 | request: string, 23 | }; 24 | 25 | const FlagHoc: StatelessFunctionalComponent = ({ 26 | pending, 27 | render, 28 | }: Props): Node => render(pending); 29 | 30 | function mapStateToProps(state, props) { 31 | return { 32 | pending: 33 | (props.resourceType && props.request) 34 | ? getResourceStatus( 35 | state, 36 | `${props.resourceType}.requests.${props.request}.status`, 37 | true, 38 | ).pending 39 | : false, 40 | }; 41 | } 42 | 43 | const connector: Connector<{ 44 | render: (pending: boolean) => Node, 45 | resourceType: string, 46 | request: string, 47 | }, Props> = connect( 48 | mapStateToProps, 49 | dispatch => ({ dispatch }), 50 | ); 51 | 52 | export default connector(FlagHoc); 53 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | /* Babel config for the main process */ 2 | module.exports = (api) => { 3 | api.cache(true); 4 | return ({ 5 | presets: [ 6 | [ 7 | '@babel/preset-env', 8 | { 9 | targets: { 10 | electron: '4.1.4', 11 | }, 12 | modules: 'commonjs', 13 | useBuiltIns: 'usage', 14 | // debug: true, 15 | }, 16 | ], 17 | ], 18 | plugins: [ 19 | 'babel-plugin-redux-saga', 20 | '@babel/plugin-proposal-export-namespace-from', 21 | '@babel/plugin-proposal-export-default-from', 22 | '@babel/plugin-proposal-class-properties', 23 | '@babel/plugin-proposal-optional-chaining', 24 | '@babel/plugin-proposal-do-expressions', 25 | [ 26 | // used only for babel helpers 27 | '@babel/plugin-transform-runtime', 28 | { 29 | // regenerator runtime should be used from global polyfill 30 | regenerator: false, 31 | }, 32 | ], 33 | [ 34 | // uset for 35 | 'module-resolver', 36 | { 37 | alias: { 38 | shared: './app/shared', 39 | config: './app/config', 40 | }, 41 | }, 42 | ], 43 | ], 44 | }); 45 | }; 46 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/stop-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | stop 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /flow-typed/npm/merge-images_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: f2deb39ed3dd88cabedf0d41094d9bc7 2 | // flow-typed version: <>/merge-images_v1.1.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'merge-images' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'merge-images' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'merge-images/dist/index.es2015' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'merge-images/dist/index.umd' { 30 | declare module.exports: any; 31 | } 32 | 33 | // Filename aliases 34 | declare module 'merge-images/dist/index.es2015.js' { 35 | declare module.exports: $Exports<'merge-images/dist/index.es2015'>; 36 | } 37 | declare module 'merge-images/dist/index.umd.js' { 38 | declare module.exports: $Exports<'merge-images/dist/index.umd'>; 39 | } 40 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Combined Shape 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/play--hover.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Combined Shape 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/renderer/components/AttachmentPopup/AttachmentsList/AttachmentsList.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import * as S from './styled'; 3 | 4 | import DownloadAttachment from '../DownloadAttachment/DownloadAttachment'; 5 | 6 | const AttachmentsList = ({ attachment, selectAttachment }) => ( 7 | 8 | 9 | { 10 | attachment.map((item, index) => ( 11 | 12 | selectAttachment(index)} 14 | > 15 | { 16 | item.mimeType.indexOf('application') 17 | ? ( 18 | 22 | ) 23 | : ( 24 | 27 | ) 28 | } 29 | 30 | {item.filename} 31 | 32 | 33 | 34 | )) 35 | } 36 | 37 | 38 | ); 39 | 40 | export default AttachmentsList; 41 | -------------------------------------------------------------------------------- /app/renderer/reducers/resourcesPlugins/clearAllPlugin.js: -------------------------------------------------------------------------------- 1 | import { 2 | actionTypes, 3 | } from 'actions'; 4 | 5 | 6 | function generateDefaultInitialState() { 7 | return { 8 | // These is a complete collection of all of the resources that the server has sent 9 | // back, for all requests. The keys of this Object are the resource's ID. There's 10 | // no ordering here: use `lists` for that. 11 | resources: {}, 12 | // This is metadata about _specific_ resources. For instance, if a DELETE 13 | // is in flight for a book with ID 24, then you could find that here. 14 | meta: {}, 15 | // Named requests are used to track the statuses of requests that aren't 16 | // associated with a resource ID 17 | requests: {}, 18 | // Lists are ordered collections of resources 19 | lists: {}, 20 | }; 21 | } 22 | 23 | const clearAllPlugin = (resourceType, opts) => 24 | (state, action) => { 25 | if (action.type !== actionTypes.__CLEAR_ALL_REDUCERS__) { 26 | return state; 27 | } 28 | 29 | const defaultInitialState = generateDefaultInitialState(); 30 | const initialState = opts.initialState || {}; 31 | return { 32 | ...defaultInitialState, 33 | ...initialState, 34 | }; 35 | }; 36 | 37 | export default clearAllPlugin; 38 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueReport/MainColumn/StatisticsRow/StatisticsRow.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | 4 | import type { 5 | StatelessFunctionalComponent, 6 | Node, 7 | } from 'react'; 8 | import { 9 | stj, 10 | } from 'utils/time-util'; 11 | 12 | import { 13 | Flex, 14 | } from 'components'; 15 | import { 16 | StatisticsItem, 17 | } from './styled'; 18 | import { 19 | MetaItemName, 20 | MetaItemValue, 21 | } from '../../styled'; 22 | 23 | 24 | type Props = { 25 | estimate: number, 26 | remaining: number, 27 | }; 28 | 29 | const StatisticsRow: StatelessFunctionalComponent = ({ 30 | estimate, 31 | remaining, 32 | }: Props): Node => ( 33 | 34 | 35 | 36 | Estimated 37 | {stj(estimate)} 38 | 39 | 40 | 41 | 42 | Remaining 43 | {stj(remaining)} 44 | 45 | 46 | 47 | ); 48 | 49 | export default StatisticsRow; 50 | -------------------------------------------------------------------------------- /app/renderer/types/issues.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import * as actionTypes from '../actions/actionTypes/issues'; 3 | import type { 4 | Id, 5 | IssueField, 6 | } from './'; 7 | 8 | export type IssuesAction = 9 | {| 10 | type: typeof actionTypes.FETCH_ISSUES_REQUEST, 11 | payload: {| 12 | startIndex: number, 13 | stopIndex: number, 14 | resolve: null | () => void, 15 | |}, 16 | |} | 17 | {| 18 | type: typeof actionTypes.FETCH_RECENT_ISSUES_REQUEST, 19 | |} | 20 | {| 21 | type: typeof actionTypes.REFETCH_ISSUES_REQUEST, 22 | debouncing: boolean, 23 | |} | 24 | {| 25 | type: typeof actionTypes.SELECT_ISSUE, 26 | payload: any, 27 | meta: any, 28 | |} | 29 | {| 30 | type: typeof actionTypes.TRANSITION_ISSUE_REQUEST, 31 | transitionId: Id, 32 | issueId: Id, 33 | |} | 34 | {| 35 | type: typeof actionTypes.COMMENT_REQUEST, 36 | text: string, 37 | issueId: Id, 38 | |} | 39 | {| 40 | type: typeof actionTypes.ASSIGN_ISSUE_REQUEST, 41 | issueId: number | string, 42 | |}; 43 | 44 | export type Issue = { 45 | expand?: string, 46 | id: string, 47 | self: string, 48 | key: string, 49 | fields: IssueField, 50 | renderedFields: any, 51 | }; 52 | 53 | export type IssuesResources = { 54 | [Id]: Issue, 55 | } 56 | -------------------------------------------------------------------------------- /flow-typed/npm/babel-plugin-import_vx.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 54ddac64bd4dd37af9b212511fee4ee3 2 | // flow-typed version: <>/babel-plugin-import_v1.8.0/flow_v0.83.0 3 | 4 | /** 5 | * This is an autogenerated libdef stub for: 6 | * 7 | * 'babel-plugin-import' 8 | * 9 | * Fill this stub out by replacing all the `any` types. 10 | * 11 | * Once filled out, we encourage you to share your work with the 12 | * community by sending a pull request to: 13 | * https://github.com/flowtype/flow-typed 14 | */ 15 | 16 | declare module 'babel-plugin-import' { 17 | declare module.exports: any; 18 | } 19 | 20 | /** 21 | * We include stubs for each file inside this npm package in case you need to 22 | * require those files directly. Feel free to delete any files that aren't 23 | * needed. 24 | */ 25 | declare module 'babel-plugin-import/lib/index' { 26 | declare module.exports: any; 27 | } 28 | 29 | declare module 'babel-plugin-import/lib/Plugin' { 30 | declare module.exports: any; 31 | } 32 | 33 | // Filename aliases 34 | declare module 'babel-plugin-import/lib/index.jsx' { 35 | declare module.exports: $Exports<'babel-plugin-import/lib/index'>; 36 | } 37 | declare module 'babel-plugin-import/lib/Plugin.js' { 38 | declare module.exports: $Exports<'babel-plugin-import/lib/Plugin'>; 39 | } 40 | -------------------------------------------------------------------------------- /app/renderer/containers/Sidebar/SidebarIssues/Filters/FilterOption/FilterOption.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | 4 | import type { 5 | StatelessFunctionalComponent, 6 | Node, 7 | } from 'react'; 8 | 9 | import { 10 | Checkbox, 11 | } from '@atlaskit/checkbox'; 12 | 13 | import * as S from './styled'; 14 | 15 | 16 | type Props = { 17 | option: any, 18 | onChange: (id: string, isChecked: boolean) => void, 19 | showIcons: boolean, 20 | isChecked: boolean, 21 | }; 22 | 23 | const FilterItem: StatelessFunctionalComponent = ({ 24 | option, 25 | onChange, 26 | showIcons, 27 | isChecked, 28 | }: Props): Node => { 29 | const { 30 | id, 31 | iconUrl, 32 | name, 33 | } = option; 34 | return ( 35 | 36 | 42 | {showIcons && iconUrl && iconUrl[iconUrl.length - 1] !== '/' 43 | && 44 | } 45 | {name} 46 | 47 | )} 48 | onChange={() => onChange(id, isChecked)} 49 | /> 50 | 51 | ); 52 | }; 53 | 54 | export default FilterItem; 55 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/stop-dark-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | stop-white 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/renderer/selectors/sprints.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { 3 | createSelector, 4 | } from 'reselect'; 5 | 6 | import type { 7 | Id, 8 | Sprint, 9 | SprintsResources, 10 | } from '../types'; 11 | 12 | import { 13 | getResourceMappedList, 14 | getResourceMap, 15 | } from './resources'; 16 | import { 17 | getUiState, 18 | } from './ui'; 19 | 20 | 21 | export const getSprintsOptions = createSelector( 22 | [getResourceMappedList('sprints', 'allSprints')], 23 | (sprints: Array) => 24 | [{ 25 | heading: 'Sprints', 26 | items: sprints.map(sprint => 27 | ({ 28 | value: sprint.id, 29 | content: sprint.name, 30 | meta: { 31 | sprint, 32 | }, 33 | })), 34 | }], 35 | ); 36 | 37 | export const getSelectedSprintOption = createSelector( 38 | [ 39 | getUiState('issuesSprintId'), 40 | getResourceMap('sprints'), 41 | ], 42 | ( 43 | sprintId: Id, 44 | sprintsMap: SprintsResources, 45 | ) => { 46 | if (!sprintId) { 47 | return null; 48 | } 49 | const sprint = sprintsMap[sprintId]; 50 | if (!sprint) { 51 | return null; 52 | } 53 | return { 54 | value: sprint.id, 55 | content: sprint.name, 56 | meta: { 57 | sprint, 58 | }, 59 | }; 60 | }, 61 | ); 62 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/stopwatch.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/renderer/assets/svg/account-box.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ic-account-box-48px 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/renderer/containers/AuthForm/AccountsStep/AccountsStep.jsx: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import type { 4 | Account, 5 | } from 'types'; 6 | import { 7 | authActions, 8 | } from 'actions'; 9 | 10 | import Button from '@atlaskit/button'; 11 | import Tag from '@atlaskit/tag'; 12 | 13 | import * as S from '../styled'; 14 | 15 | 16 | type Props = { 17 | isActiveStep: boolean, 18 | authError: string, 19 | dispatch: Function, 20 | onBack: Function, 21 | accounts: Array, 22 | }; 23 | 24 | const AccountsStep = ({ 25 | isActiveStep, 26 | authError, 27 | onBack, 28 | dispatch, 29 | accounts, 30 | }: Props) => ( 31 | 35 |
36 | {accounts.map(ac => ( 37 | dispatch(authActions.switchAccount(ac))} 39 | key={`${ac.name}:${ac.hostname}`} 40 | > 41 | 42 | {ac.name} 43 | 44 | ))} 45 |
46 | 47 | 53 | 54 | {authError} 55 |
56 | ); 57 | 58 | export default AccountsStep; 59 | -------------------------------------------------------------------------------- /app/renderer/containers/IssueView/IssueReport/MainColumn/ProgressBar/styled/index.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-confusing-arrow */ 2 | import styled from 'styled-components'; 3 | 4 | export const ProgressBar = styled.div` 5 | width: 92%; 6 | position: relative; 7 | `; 8 | 9 | export const ProgressBarItem = styled.div` 10 | display: flex; 11 | flex-direction: column; 12 | width: ${props => props.width || 100}%; 13 | position: absolute; 14 | height: 52px; 15 | justify-content: space-between; 16 | `; 17 | 18 | export const ProgressBarFill = styled.div` 19 | visibility: ${props => props.width === 0 ? 'hidden' : 'visible'}; 20 | width: ${props => props.width || 100}%; 21 | border-radius: 10px; 22 | background-color: ${props => props.color}; 23 | position: absolute; 24 | top: 22px; 25 | height: 12px; 26 | `; 27 | 28 | export const Time = styled.span` 29 | color: rgba(225, 225, 225, .9); 30 | font-size: 12px; 31 | line-height: 23px; 32 | ${props => props.isHighlighted && ` 33 | color: white; 34 | font-size: 14px; 35 | `} 36 | `; 37 | 38 | export const TimeLabel = styled.span` 39 | color: rgba(225, 225, 225, .7); 40 | font-size: 10px; 41 | `; 42 | 43 | export const Percentage = styled.span` 44 | color: rgba(225, 225, 225, .7); 45 | font-size: 10px; 46 | position: absolute; 47 | right: -26px; 48 | top: 20px; 49 | `; 50 | --------------------------------------------------------------------------------