├── .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 | }) =>
;
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/app/renderer/assets/svg/stopHover.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/app/renderer/assets/svg/play--hover.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
43 |
--------------------------------------------------------------------------------
/app/renderer/assets/svg/account-box.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------