mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
Remove history-related Angular code (#15932)
GitOrigin-RevId: e4fafddd67909a0e709439ddbe560c66e2629bdb
This commit is contained in:
parent
d40de2018c
commit
19a17060ab
22 changed files with 5 additions and 2096 deletions
|
@ -26,6 +26,7 @@ export type IdeEvents = {
|
|||
'scroll:editor:update': []
|
||||
'comment:start_adding': []
|
||||
'references:should-reindex': []
|
||||
'history:toggle': []
|
||||
|
||||
'entity:deleted': [entity: FileTreeFindResult]
|
||||
}
|
||||
|
|
|
@ -5,10 +5,6 @@ const reviewPanelStorageKey = `ui.reviewPanelOpen.${getMeta('ol-project_id')}`
|
|||
|
||||
export default function populateLayoutScope(store: ReactScopeValueStore) {
|
||||
store.set('ui.view', 'editor')
|
||||
|
||||
// TODO: Find out what this needs to do and make it do it
|
||||
store.set('toggleHistory', () => {})
|
||||
|
||||
store.set('openFile', null)
|
||||
store.persisted('ui.chatOpen', false, 'ui.chatOpen')
|
||||
store.persisted('ui.reviewPanelOpen', false, reviewPanelStorageKey)
|
||||
|
|
|
@ -22,7 +22,6 @@ import LoadingManager from './ide/LoadingManager'
|
|||
import ConnectionManager from './ide/connection/ConnectionManager'
|
||||
import EditorManager from './ide/editor/EditorManager'
|
||||
import OnlineUsersManager from './ide/online-users/OnlineUsersManager'
|
||||
import HistoryV2Manager from './ide/history/HistoryV2Manager'
|
||||
import PermissionsManager from './ide/permissions/PermissionsManager'
|
||||
import BinaryFilesManager from './ide/binary-files/BinaryFilesManager'
|
||||
import ReferencesManager from './ide/references/ReferencesManager'
|
||||
|
@ -205,7 +204,6 @@ App.controller('IdeController', [
|
|||
eventTracking
|
||||
)
|
||||
ide.onlineUsersManager = new OnlineUsersManager(ide, $scope)
|
||||
ide.historyManager = new HistoryV2Manager(ide, $scope, localStorage)
|
||||
ide.permissionsManager = new PermissionsManager(ide, $scope)
|
||||
ide.binaryFilesManager = new BinaryFilesManager(ide, $scope)
|
||||
ide.metadataManager = new MetadataManager(ide, $scope, metadata)
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,138 +0,0 @@
|
|||
/* eslint-disable
|
||||
max-len,
|
||||
no-return-assign,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
const historyEntriesListController = function ($scope, $element) {
|
||||
const ctrl = this
|
||||
ctrl.$entryListViewportEl = null
|
||||
ctrl.isDragging = false
|
||||
|
||||
const _isEntryElVisible = function ($entryEl) {
|
||||
const entryElTop = $entryEl.offset().top
|
||||
const entryElBottom = entryElTop + $entryEl.outerHeight()
|
||||
const entryListViewportElTop = ctrl.$entryListViewportEl.offset().top
|
||||
const entryListViewportElBottom =
|
||||
entryListViewportElTop + ctrl.$entryListViewportEl.height()
|
||||
|
||||
return (
|
||||
entryElTop >= entryListViewportElTop &&
|
||||
entryElBottom <= entryListViewportElBottom
|
||||
)
|
||||
}
|
||||
const _getScrollTopPosForEntry = function ($entryEl) {
|
||||
const halfViewportElHeight = ctrl.$entryListViewportEl.height() / 2
|
||||
return $entryEl.offset().top - halfViewportElHeight
|
||||
}
|
||||
ctrl.onEntryLinked = function (entry, $entryEl) {
|
||||
if (
|
||||
!ctrl.rangeSelectionEnabled &&
|
||||
entry.toV === ctrl.selectedHistoryVersion
|
||||
) {
|
||||
$scope.$applyAsync(() => {
|
||||
if (!_isEntryElVisible($entryEl)) {
|
||||
ctrl.$entryListViewportEl.scrollTop(
|
||||
_getScrollTopPosForEntry($entryEl)
|
||||
)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
ctrl.handleEntrySelect = entry => {
|
||||
if (ctrl.rangeSelectionEnabled) {
|
||||
ctrl.onRangeSelect({
|
||||
selectedToV: entry.toV,
|
||||
selectedFromV: entry.fromV,
|
||||
})
|
||||
} else {
|
||||
ctrl.onVersionSelect({ version: entry.toV })
|
||||
}
|
||||
}
|
||||
ctrl.setRangeToV = toV => {
|
||||
if (toV > ctrl.selectedHistoryRange.fromV) {
|
||||
ctrl.onRangeSelect({
|
||||
selectedToV: toV,
|
||||
selectedFromV: ctrl.selectedHistoryRange.fromV,
|
||||
})
|
||||
}
|
||||
}
|
||||
ctrl.setRangeFromV = fromV => {
|
||||
if (fromV < ctrl.selectedHistoryRange.toV) {
|
||||
ctrl.onRangeSelect({
|
||||
selectedToV: ctrl.selectedHistoryRange.toV,
|
||||
selectedFromV: fromV,
|
||||
})
|
||||
}
|
||||
}
|
||||
ctrl.initHoveredRange = () => {
|
||||
ctrl.hoveredHistoryRange = {
|
||||
toV: ctrl.selectedHistoryRange.toV,
|
||||
fromV: ctrl.selectedHistoryRange.fromV,
|
||||
}
|
||||
}
|
||||
ctrl.resetHoveredRange = () => {
|
||||
ctrl.hoveredHistoryRange = { toV: null, fromV: null }
|
||||
}
|
||||
ctrl.setHoveredRangeToV = toV => {
|
||||
if (toV > ctrl.hoveredHistoryRange.fromV) {
|
||||
$scope.$applyAsync(() => (ctrl.hoveredHistoryRange.toV = toV))
|
||||
}
|
||||
}
|
||||
ctrl.setHoveredRangeFromV = fromV => {
|
||||
if (fromV < ctrl.hoveredHistoryRange.toV) {
|
||||
$scope.$applyAsync(() => (ctrl.hoveredHistoryRange.fromV = fromV))
|
||||
}
|
||||
}
|
||||
ctrl.onDraggingStart = () => {
|
||||
$scope.$applyAsync(() => {
|
||||
ctrl.isDragging = true
|
||||
ctrl.initHoveredRange()
|
||||
})
|
||||
}
|
||||
ctrl.onDraggingStop = (isValidDrop, boundary) => {
|
||||
$scope.$applyAsync(() => {
|
||||
ctrl.isDragging = false
|
||||
if (!isValidDrop) {
|
||||
if (boundary === 'toV') {
|
||||
ctrl.setRangeToV(ctrl.hoveredHistoryRange.toV)
|
||||
} else if (boundary === 'fromV') {
|
||||
ctrl.setRangeFromV(ctrl.hoveredHistoryRange.fromV)
|
||||
}
|
||||
}
|
||||
ctrl.resetHoveredRange()
|
||||
})
|
||||
}
|
||||
ctrl.$onInit = () => {
|
||||
ctrl.$entryListViewportEl = $element.find('> .history-entries')
|
||||
ctrl.resetHoveredRange()
|
||||
}
|
||||
}
|
||||
|
||||
export default App.component('historyEntriesList', {
|
||||
bindings: {
|
||||
entries: '<',
|
||||
users: '<',
|
||||
loadEntries: '&',
|
||||
loadDisabled: '<',
|
||||
loadInitialize: '<',
|
||||
isLoading: '<',
|
||||
currentUser: '<',
|
||||
freeHistoryLimitHit: '<',
|
||||
currentUserIsOwner: '<',
|
||||
rangeSelectionEnabled: '<',
|
||||
selectedHistoryVersion: '<?',
|
||||
selectedHistoryRange: '<?',
|
||||
onVersionSelect: '&',
|
||||
onRangeSelect: '&',
|
||||
onLabelDelete: '&',
|
||||
},
|
||||
controller: ['$scope', '$element', historyEntriesListController],
|
||||
templateUrl: 'historyEntriesListTpl',
|
||||
})
|
|
@ -1,125 +0,0 @@
|
|||
import _ from 'lodash'
|
||||
/* eslint-disable
|
||||
max-len,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* DS207: Consider shorter variations of null checks
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
import ColorManager from '../../colors/ColorManager'
|
||||
import displayNameForUser from '../util/displayNameForUser'
|
||||
const historyEntryController = function ($scope, $element) {
|
||||
const ctrl = this
|
||||
// This method (and maybe the one below) will be removed soon. User details data will be
|
||||
// injected into the history API responses, so we won't need to fetch user data from other
|
||||
// local data structures.
|
||||
const _getUserById = id =>
|
||||
_.find(ctrl.users, function (user) {
|
||||
const curUserId =
|
||||
(user != null ? user._id : undefined) ||
|
||||
(user != null ? user.id : undefined)
|
||||
return curUserId === id
|
||||
})
|
||||
ctrl.displayName = displayNameForUser
|
||||
ctrl.displayNameById = id => displayNameForUser(_getUserById(id))
|
||||
ctrl.getProjectOpDoc = function (projectOp) {
|
||||
if (projectOp.rename != null) {
|
||||
return `${projectOp.rename.pathname} → ${projectOp.rename.newPathname}`
|
||||
} else if (projectOp.add != null) {
|
||||
return `${projectOp.add.pathname}`
|
||||
} else if (projectOp.remove != null) {
|
||||
return `${projectOp.remove.pathname}`
|
||||
}
|
||||
}
|
||||
ctrl.getUserCSSStyle = function (user) {
|
||||
const curUserId =
|
||||
(user != null ? user._id : undefined) ||
|
||||
(user != null ? user.id : undefined)
|
||||
const hue = ColorManager.getHueForUserId(curUserId) || 100
|
||||
if (ctrl.isEntrySelected() || ctrl.isEntryHoverSelected()) {
|
||||
return { color: '#FFF' }
|
||||
} else {
|
||||
return { color: `hsl(${hue}, 70%, 50%)` }
|
||||
}
|
||||
}
|
||||
ctrl.isEntrySelected = function () {
|
||||
if (ctrl.rangeSelectionEnabled) {
|
||||
return (
|
||||
ctrl.entry.toV <= ctrl.selectedHistoryRange.toV &&
|
||||
ctrl.entry.fromV >= ctrl.selectedHistoryRange.fromV
|
||||
)
|
||||
} else {
|
||||
return ctrl.entry.toV === ctrl.selectedHistoryVersion
|
||||
}
|
||||
}
|
||||
|
||||
ctrl.isEntryHoverSelected = function () {
|
||||
return (
|
||||
ctrl.rangeSelectionEnabled &&
|
||||
ctrl.entry.toV <= ctrl.hoveredHistoryRange.toV &&
|
||||
ctrl.entry.fromV >= ctrl.hoveredHistoryRange.fromV
|
||||
)
|
||||
}
|
||||
|
||||
ctrl.onDraggingStart = () => {
|
||||
ctrl.historyEntriesList.onDraggingStart()
|
||||
}
|
||||
ctrl.onDraggingStop = (isValidDrop, boundary) =>
|
||||
ctrl.historyEntriesList.onDraggingStop(isValidDrop, boundary)
|
||||
|
||||
ctrl.onDrop = boundary => {
|
||||
if (boundary === 'toV') {
|
||||
$scope.$applyAsync(() =>
|
||||
ctrl.historyEntriesList.setRangeToV(ctrl.entry.toV)
|
||||
)
|
||||
} else if (boundary === 'fromV') {
|
||||
$scope.$applyAsync(() =>
|
||||
ctrl.historyEntriesList.setRangeFromV(ctrl.entry.fromV)
|
||||
)
|
||||
}
|
||||
}
|
||||
ctrl.onOver = boundary => {
|
||||
if (boundary === 'toV') {
|
||||
$scope.$applyAsync(() =>
|
||||
ctrl.historyEntriesList.setHoveredRangeToV(ctrl.entry.toV)
|
||||
)
|
||||
} else if (boundary === 'fromV') {
|
||||
$scope.$applyAsync(() =>
|
||||
ctrl.historyEntriesList.setHoveredRangeFromV(ctrl.entry.fromV)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
ctrl.$onInit = () => {
|
||||
ctrl.$entryEl = $element.find('> .history-entry')
|
||||
ctrl.$entryDetailsEl = $element.find('.history-entry-details')
|
||||
ctrl.$toVHandleEl = $element.find('.history-entry-toV-handle')
|
||||
ctrl.$fromVHandleEl = $element.find('.history-entry-fromV-handle')
|
||||
ctrl.historyEntriesList.onEntryLinked(ctrl.entry, ctrl.$entryEl)
|
||||
}
|
||||
}
|
||||
|
||||
export default App.component('historyEntry', {
|
||||
bindings: {
|
||||
entry: '<',
|
||||
currentUser: '<',
|
||||
users: '<',
|
||||
rangeSelectionEnabled: '<',
|
||||
isDragging: '<',
|
||||
selectedHistoryVersion: '<?',
|
||||
selectedHistoryRange: '<?',
|
||||
hoveredHistoryRange: '<?',
|
||||
onSelect: '&',
|
||||
onLabelDelete: '&',
|
||||
},
|
||||
require: {
|
||||
historyEntriesList: '^historyEntriesList',
|
||||
},
|
||||
controller: ['$scope', '$element', historyEntryController],
|
||||
templateUrl: 'historyEntryTpl',
|
||||
})
|
|
@ -1,104 +0,0 @@
|
|||
/* eslint-disable
|
||||
max-len,
|
||||
no-return-assign,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
import iconTypeFromName from '../../file-tree/util/iconTypeFromName'
|
||||
import fileOperationI18nNames from '../../file-tree/util/fileOperationI18nNames'
|
||||
const historyFileEntityController = function ($scope) {
|
||||
const ctrl = this
|
||||
ctrl.hasOperation = false
|
||||
ctrl.getRenameTooltip = i18nRenamedStr => {
|
||||
const [simplifiedOldPathname, simplifiedPathname] = _getSimplifiedPaths(
|
||||
ctrl.fileEntity.oldPathname,
|
||||
ctrl.fileEntity.pathname
|
||||
)
|
||||
return `${fileOperationI18nNames.renamed} <strong>${simplifiedOldPathname}</strong> → <strong>${simplifiedPathname}</strong>`
|
||||
}
|
||||
ctrl.getFileOperationName = () => {
|
||||
if (ctrl.fileEntity.operation === 'edited') {
|
||||
return fileOperationI18nNames.edited
|
||||
} else if (ctrl.fileEntity.operation === 'renamed') {
|
||||
return fileOperationI18nNames.renamed
|
||||
} else if (ctrl.fileEntity.operation === 'added') {
|
||||
return fileOperationI18nNames.created
|
||||
} else if (ctrl.fileEntity.operation === 'removed') {
|
||||
return fileOperationI18nNames.deleted
|
||||
} else {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
const _getSimplifiedPaths = (path1, path2) => {
|
||||
const path1Parts = path1.split('/')
|
||||
const path2Parts = path2.split('/')
|
||||
const maxIterations = Math.min(path1Parts.length, path2Parts.length) - 1
|
||||
let commonPartIndex
|
||||
for (
|
||||
commonPartIndex = 0;
|
||||
commonPartIndex < maxIterations;
|
||||
commonPartIndex++
|
||||
) {
|
||||
if (path1Parts[commonPartIndex] !== path2Parts[commonPartIndex]) {
|
||||
break
|
||||
}
|
||||
}
|
||||
path1Parts.splice(0, commonPartIndex)
|
||||
path2Parts.splice(0, commonPartIndex)
|
||||
return [path1Parts.join('/'), path2Parts.join('/')]
|
||||
}
|
||||
|
||||
const _handleFolderClick = function () {
|
||||
ctrl.isOpen = !ctrl.isOpen
|
||||
ctrl.entityTypeIconClass = _getFolderIcon()
|
||||
}
|
||||
|
||||
const _handleFileClick = () =>
|
||||
ctrl.historyFileTreeController.handleEntityClick(ctrl.fileEntity)
|
||||
function _getFolderIcon() {
|
||||
if (ctrl.isOpen) {
|
||||
return 'fa-folder-open'
|
||||
} else {
|
||||
return 'fa-folder'
|
||||
}
|
||||
}
|
||||
ctrl.$onInit = function () {
|
||||
if (ctrl.fileEntity.type === 'folder') {
|
||||
ctrl.isOpen = true
|
||||
ctrl.entityTypeIconClass = _getFolderIcon()
|
||||
ctrl.handleClick = _handleFolderClick
|
||||
} else {
|
||||
if (ctrl.fileEntity.operation) {
|
||||
ctrl.hasOperation = true
|
||||
}
|
||||
ctrl.entityTypeIconClass = `fa-${iconTypeFromName(ctrl.fileEntity.name)}`
|
||||
ctrl.entityOpTextClass = ctrl.fileEntity.operation
|
||||
? `history-file-entity-name-${ctrl.fileEntity.operation}`
|
||||
: null
|
||||
ctrl.handleClick = _handleFileClick
|
||||
$scope.$watch(
|
||||
() => ctrl.historyFileTreeController.selectedPathname,
|
||||
selectedPathname =>
|
||||
(ctrl.isSelected = ctrl.fileEntity.pathname === selectedPathname)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default App.component('historyFileEntity', {
|
||||
require: {
|
||||
historyFileTreeController: '^historyFileTree',
|
||||
},
|
||||
bindings: {
|
||||
fileEntity: '<',
|
||||
},
|
||||
controller: ['$scope', historyFileEntityController],
|
||||
templateUrl: 'historyFileEntityTpl',
|
||||
})
|
|
@ -1,63 +0,0 @@
|
|||
import _ from 'lodash'
|
||||
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
const historyFileTreeController = function ($scope) {
|
||||
const ctrl = this
|
||||
ctrl.handleEntityClick = file => ctrl.onSelectedFileChange({ file })
|
||||
ctrl._fileTree = []
|
||||
|
||||
$scope.$watch('$ctrl.files', function (files) {
|
||||
if (files != null && files.length > 0) {
|
||||
ctrl._fileTree = _.reduce(files, _reducePathsToTree, [])
|
||||
}
|
||||
})
|
||||
|
||||
function _reducePathsToTree(currentFileTree, fileObject) {
|
||||
const filePathParts = fileObject.pathname.split('/')
|
||||
let currentFileTreeLocation = currentFileTree
|
||||
for (let index = 0; index < filePathParts.length; index++) {
|
||||
let fileTreeEntity
|
||||
const pathPart = filePathParts[index]
|
||||
const isFile = index === filePathParts.length - 1
|
||||
if (isFile) {
|
||||
fileTreeEntity = _.clone(fileObject)
|
||||
fileTreeEntity.name = pathPart
|
||||
fileTreeEntity.type = 'file'
|
||||
currentFileTreeLocation.push(fileTreeEntity)
|
||||
} else {
|
||||
fileTreeEntity = _.find(
|
||||
currentFileTreeLocation,
|
||||
entity => entity.name === pathPart
|
||||
)
|
||||
if (fileTreeEntity == null) {
|
||||
fileTreeEntity = {
|
||||
name: pathPart,
|
||||
type: 'folder',
|
||||
children: [],
|
||||
}
|
||||
currentFileTreeLocation.push(fileTreeEntity)
|
||||
}
|
||||
currentFileTreeLocation = fileTreeEntity.children
|
||||
}
|
||||
}
|
||||
return currentFileTree
|
||||
}
|
||||
}
|
||||
|
||||
export default App.component('historyFileTree', {
|
||||
bindings: {
|
||||
files: '<',
|
||||
selectedPathname: '<',
|
||||
onSelectedFileChange: '&',
|
||||
isLoading: '<',
|
||||
},
|
||||
controller: ['$scope', historyFileTreeController],
|
||||
templateUrl: 'historyFileTreeTpl',
|
||||
})
|
|
@ -1,37 +0,0 @@
|
|||
/* eslint-disable
|
||||
max-len,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* DS207: Consider shorter variations of null checks
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
const historyLabelController = function () {
|
||||
const ctrl = this
|
||||
ctrl.$onInit = () => {
|
||||
if (ctrl.showTooltip == null) {
|
||||
ctrl.showTooltip = true
|
||||
}
|
||||
if (ctrl.isPseudoCurrentStateLabel == null) {
|
||||
ctrl.isPseudoCurrentStateLabel = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default App.component('historyLabel', {
|
||||
bindings: {
|
||||
labelText: '<',
|
||||
labelOwnerName: '<?',
|
||||
labelCreationDateTime: '<?',
|
||||
isOwnedByCurrentUser: '<',
|
||||
isPseudoCurrentStateLabel: '<',
|
||||
onLabelDelete: '&',
|
||||
showTooltip: '<?',
|
||||
},
|
||||
controller: historyLabelController,
|
||||
templateUrl: 'historyLabelTpl',
|
||||
})
|
|
@ -1,175 +0,0 @@
|
|||
import _ from 'lodash'
|
||||
/* eslint-disable
|
||||
max-len,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* DS207: Consider shorter variations of null checks
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
import ColorManager from '../../colors/ColorManager'
|
||||
import displayNameForUser from '../util/displayNameForUser'
|
||||
const historyLabelsListController = function ($scope) {
|
||||
const ctrl = this
|
||||
ctrl.isDragging = false
|
||||
ctrl.versionsWithLabels = []
|
||||
$scope.$watchCollection('$ctrl.labels', function (labels) {
|
||||
if (labels) {
|
||||
const groupedLabelsHash = _.groupBy(labels, 'version')
|
||||
ctrl.versionsWithLabels = _.map(groupedLabelsHash, (labels, version) => {
|
||||
return {
|
||||
version: parseInt(version, 10),
|
||||
labels,
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
ctrl.initHoveredRange = () => {
|
||||
ctrl.hoveredHistoryRange = {
|
||||
toV: ctrl.selectedHistoryRange.toV,
|
||||
fromV: ctrl.selectedHistoryRange.fromV,
|
||||
}
|
||||
}
|
||||
ctrl.resetHoveredRange = () => {
|
||||
ctrl.hoveredHistoryRange = { toV: null, fromV: null }
|
||||
}
|
||||
ctrl.setHoveredRangeToV = toV => {
|
||||
if (toV >= ctrl.hoveredHistoryRange.fromV) {
|
||||
ctrl.hoveredHistoryRange.toV = toV
|
||||
}
|
||||
}
|
||||
ctrl.setHoveredRangeFromV = fromV => {
|
||||
if (fromV <= ctrl.hoveredHistoryRange.toV) {
|
||||
ctrl.hoveredHistoryRange.fromV = fromV
|
||||
}
|
||||
}
|
||||
|
||||
ctrl.isVersionSelected = function (version) {
|
||||
if (ctrl.rangeSelectionEnabled) {
|
||||
return (
|
||||
version <= ctrl.selectedHistoryRange.toV &&
|
||||
version >= ctrl.selectedHistoryRange.fromV
|
||||
)
|
||||
} else {
|
||||
return version === ctrl.selectedHistoryVersion
|
||||
}
|
||||
}
|
||||
ctrl.isVersionHoverSelected = function (version) {
|
||||
return (
|
||||
ctrl.rangeSelectionEnabled &&
|
||||
version <= ctrl.hoveredHistoryRange.toV &&
|
||||
version >= ctrl.hoveredHistoryRange.fromV
|
||||
)
|
||||
}
|
||||
ctrl.onDraggingStart = () => {
|
||||
$scope.$applyAsync(() => {
|
||||
ctrl.isDragging = true
|
||||
ctrl.initHoveredRange()
|
||||
})
|
||||
}
|
||||
ctrl.onDraggingStop = (isValidDrop, boundary) => {
|
||||
$scope.$applyAsync(() => {
|
||||
if (!isValidDrop) {
|
||||
if (boundary === 'toV') {
|
||||
ctrl.setRangeToV(ctrl.hoveredHistoryRange.toV)
|
||||
} else if (boundary === 'fromV') {
|
||||
ctrl.setRangeFromV(ctrl.hoveredHistoryRange.fromV)
|
||||
}
|
||||
}
|
||||
ctrl.isDragging = false
|
||||
ctrl.resetHoveredRange()
|
||||
})
|
||||
}
|
||||
ctrl.onDrop = (boundary, versionWithLabel) => {
|
||||
if (boundary === 'toV') {
|
||||
$scope.$applyAsync(() => ctrl.setRangeToV(versionWithLabel.version))
|
||||
} else if (boundary === 'fromV') {
|
||||
$scope.$applyAsync(() => ctrl.setRangeFromV(versionWithLabel.version))
|
||||
}
|
||||
}
|
||||
ctrl.onOver = (boundary, versionWithLabel) => {
|
||||
if (boundary === 'toV') {
|
||||
$scope.$applyAsync(() =>
|
||||
ctrl.setHoveredRangeToV(versionWithLabel.version)
|
||||
)
|
||||
} else if (boundary === 'fromV') {
|
||||
$scope.$applyAsync(() =>
|
||||
ctrl.setHoveredRangeFromV(versionWithLabel.version)
|
||||
)
|
||||
}
|
||||
}
|
||||
ctrl.handleVersionSelect = versionWithLabel => {
|
||||
if (ctrl.rangeSelectionEnabled) {
|
||||
// TODO
|
||||
ctrl.onRangeSelect({
|
||||
selectedToV: versionWithLabel.version,
|
||||
selectedFromV: versionWithLabel.version,
|
||||
})
|
||||
} else {
|
||||
ctrl.onVersionSelect({ version: versionWithLabel.version })
|
||||
}
|
||||
}
|
||||
ctrl.setRangeToV = version => {
|
||||
if (version >= ctrl.selectedHistoryRange.fromV) {
|
||||
ctrl.onRangeSelect({
|
||||
selectedToV: version,
|
||||
selectedFromV: ctrl.selectedHistoryRange.fromV,
|
||||
})
|
||||
}
|
||||
}
|
||||
ctrl.setRangeFromV = version => {
|
||||
if (version <= ctrl.selectedHistoryRange.toV) {
|
||||
ctrl.onRangeSelect({
|
||||
selectedToV: ctrl.selectedHistoryRange.toV,
|
||||
selectedFromV: version,
|
||||
})
|
||||
}
|
||||
}
|
||||
ctrl.buildUserView = label => {
|
||||
const user = {
|
||||
_id: label.user_id,
|
||||
displayName: label.user_display_name,
|
||||
}
|
||||
return user
|
||||
}
|
||||
ctrl.displayName = displayNameForUser
|
||||
ctrl.getUserCSSStyle = function (user, versionWithLabel) {
|
||||
const curUserId =
|
||||
(user != null ? user._id : undefined) ||
|
||||
(user != null ? user.id : undefined)
|
||||
const hue = ColorManager.getHueForUserId(curUserId) || 100
|
||||
if (
|
||||
ctrl.isVersionSelected(versionWithLabel.version) ||
|
||||
ctrl.isVersionHoverSelected(versionWithLabel.version)
|
||||
) {
|
||||
return { color: '#FFF' }
|
||||
} else {
|
||||
return { color: `hsl(${hue}, 70%, 50%)` }
|
||||
}
|
||||
}
|
||||
|
||||
ctrl.$onInit = () => {
|
||||
ctrl.resetHoveredRange()
|
||||
}
|
||||
}
|
||||
|
||||
export default App.component('historyLabelsList', {
|
||||
bindings: {
|
||||
labels: '<',
|
||||
rangeSelectionEnabled: '<',
|
||||
users: '<',
|
||||
currentUser: '<',
|
||||
isLoading: '<',
|
||||
selectedHistoryVersion: '<?',
|
||||
selectedHistoryRange: '<?',
|
||||
onVersionSelect: '&',
|
||||
onRangeSelect: '&',
|
||||
onLabelDelete: '&',
|
||||
},
|
||||
controller: ['$scope', historyLabelsListController],
|
||||
templateUrl: 'historyLabelsListTpl',
|
||||
})
|
|
@ -1,50 +0,0 @@
|
|||
/* eslint-disable
|
||||
max-len,
|
||||
no-return-assign,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
|
||||
export default App.controller('HistoryV2AddLabelModalController', [
|
||||
'$scope',
|
||||
'$modalInstance',
|
||||
'ide',
|
||||
'update',
|
||||
function ($scope, $modalInstance, ide, update) {
|
||||
$scope.update = update
|
||||
$scope.inputs = { labelName: null }
|
||||
$scope.state = {
|
||||
inflight: false,
|
||||
error: false,
|
||||
}
|
||||
|
||||
$modalInstance.opened.then(() =>
|
||||
$scope.$applyAsync(() => $scope.$broadcast('open'))
|
||||
)
|
||||
|
||||
return ($scope.addLabelModalFormSubmit = function () {
|
||||
$scope.state.inflight = true
|
||||
return ide.historyManager
|
||||
.labelCurrentVersion($scope.inputs.labelName)
|
||||
.then(function (response) {
|
||||
$scope.state.inflight = false
|
||||
return $modalInstance.close()
|
||||
})
|
||||
.catch(function (response) {
|
||||
const { data, status } = response
|
||||
$scope.state.inflight = false
|
||||
if (status === 400) {
|
||||
return ($scope.state.error = { message: data })
|
||||
} else {
|
||||
return ($scope.state.error = true)
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
])
|
|
@ -1,45 +0,0 @@
|
|||
/* eslint-disable
|
||||
max-len,
|
||||
no-return-assign,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
|
||||
export default App.controller('HistoryV2DeleteLabelModalController', [
|
||||
'$scope',
|
||||
'$modalInstance',
|
||||
'ide',
|
||||
'labelDetails',
|
||||
function ($scope, $modalInstance, ide, labelDetails) {
|
||||
$scope.labelDetails = labelDetails
|
||||
$scope.state = {
|
||||
inflight: false,
|
||||
error: false,
|
||||
}
|
||||
|
||||
return ($scope.deleteLabel = function () {
|
||||
$scope.state.inflight = true
|
||||
return ide.historyManager
|
||||
.deleteLabel(labelDetails)
|
||||
.then(function (response) {
|
||||
$scope.state.inflight = false
|
||||
return $modalInstance.close()
|
||||
})
|
||||
.catch(function (response) {
|
||||
const { data, status } = response
|
||||
$scope.state.inflight = false
|
||||
if (status === 400) {
|
||||
return ($scope.state.error = { message: data })
|
||||
} else {
|
||||
return ($scope.state.error = true)
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
])
|
|
@ -1,23 +0,0 @@
|
|||
/* eslint-disable
|
||||
max-len,
|
||||
no-return-assign,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* DS207: Consider shorter variations of null checks
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
|
||||
export default App.controller('HistoryV2FileTreeController', [
|
||||
'$scope',
|
||||
'ide',
|
||||
function ($scope, ide) {
|
||||
$scope.handleFileSelection = file => {
|
||||
ide.historyManager.selectFile(file)
|
||||
}
|
||||
},
|
||||
])
|
|
@ -1,56 +0,0 @@
|
|||
/* eslint-disable
|
||||
max-len,
|
||||
no-return-assign,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* DS207: Consider shorter variations of null checks
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
|
||||
export default App.controller('HistoryV2ListController', [
|
||||
'$scope',
|
||||
'$modal',
|
||||
'ide',
|
||||
function ($scope, $modal, ide) {
|
||||
$scope.hoveringOverListSelectors = false
|
||||
$scope.listConfig = { showOnlyLabelled: false }
|
||||
|
||||
$scope.projectUsers = []
|
||||
|
||||
$scope.$watch('project.members', function (newVal) {
|
||||
if (newVal != null) {
|
||||
return ($scope.projectUsers = newVal.concat($scope.project.owner))
|
||||
}
|
||||
})
|
||||
|
||||
$scope.loadMore = () => {
|
||||
return ide.historyManager.fetchNextBatchOfUpdates()
|
||||
}
|
||||
|
||||
$scope.handleVersionSelect = version =>
|
||||
$scope.$applyAsync(() =>
|
||||
ide.historyManager.selectVersionForPointInTime(version)
|
||||
)
|
||||
|
||||
$scope.handleRangeSelect = (selectedToV, selectedFromV) =>
|
||||
$scope.$applyAsync(() =>
|
||||
ide.historyManager.selectVersionsForCompare(selectedToV, selectedFromV)
|
||||
)
|
||||
|
||||
return ($scope.handleLabelDelete = labelDetails =>
|
||||
$modal.open({
|
||||
templateUrl: 'historyV2DeleteLabelModalTemplate',
|
||||
controller: 'HistoryV2DeleteLabelModalController',
|
||||
resolve: {
|
||||
labelDetails() {
|
||||
return labelDetails
|
||||
},
|
||||
},
|
||||
}))
|
||||
},
|
||||
])
|
|
@ -1,128 +0,0 @@
|
|||
/* eslint-disable
|
||||
max-len,
|
||||
no-return-assign,
|
||||
camelcase,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
import { debugConsole } from '@/utils/debugging'
|
||||
|
||||
export default App.controller('HistoryV2ToolbarController', [
|
||||
'$scope',
|
||||
'$modal',
|
||||
'ide',
|
||||
'eventTracking',
|
||||
'waitFor',
|
||||
function ($scope, $modal, ide, eventTracking, waitFor) {
|
||||
$scope.currentUpdate = null
|
||||
$scope.currentLabel = null
|
||||
|
||||
$scope.restoreState = {
|
||||
inflight: false,
|
||||
error: false,
|
||||
}
|
||||
|
||||
$scope.toolbarUIConfig = {
|
||||
showOnlyLabels: false,
|
||||
}
|
||||
|
||||
const _deregistershowOnlyLabelsWatcher = $scope.$watch(
|
||||
'history.showOnlyLabels',
|
||||
showOnlyLabels => {
|
||||
if (showOnlyLabels != null) {
|
||||
$scope.toolbarUIConfig.showOnlyLabels = showOnlyLabels
|
||||
_deregistershowOnlyLabelsWatcher()
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
$scope.$watch('toolbarUIConfig.showOnlyLabels', (newVal, oldVal) => {
|
||||
if (newVal != null && newVal !== oldVal) {
|
||||
if (newVal) {
|
||||
ide.historyManager.showOnlyLabels()
|
||||
} else {
|
||||
ide.historyManager.showAllUpdates()
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
$scope.$watch('history.viewMode', (newVal, oldVal) => {
|
||||
if (newVal != null && newVal !== oldVal) {
|
||||
$scope.currentUpdate = ide.historyManager.getUpdateForVersion(newVal)
|
||||
}
|
||||
})
|
||||
|
||||
$scope.$watch('history.selection.range.toV', (newVal, oldVal) => {
|
||||
if (
|
||||
newVal != null &&
|
||||
newVal !== oldVal &&
|
||||
$scope.history.viewMode === $scope.HistoryViewModes.POINT_IN_TIME
|
||||
) {
|
||||
$scope.currentUpdate = ide.historyManager.getUpdateForVersion(newVal)
|
||||
}
|
||||
})
|
||||
|
||||
$scope.toggleHistoryViewMode = () => {
|
||||
ide.historyManager.toggleHistoryViewMode()
|
||||
}
|
||||
|
||||
$scope.restoreDeletedFile = function () {
|
||||
const { pathname, deletedAtV } = $scope.history.selection.file
|
||||
if (pathname == null || deletedAtV == null) {
|
||||
return
|
||||
}
|
||||
|
||||
eventTracking.sendMB('history-v2-restore-deleted')
|
||||
$scope.restoreState.inflight = true
|
||||
return ide.historyManager
|
||||
.restoreFile(deletedAtV, pathname)
|
||||
.then(function (response) {
|
||||
const { data } = response
|
||||
return openEntity(data)
|
||||
})
|
||||
.catch(() =>
|
||||
ide.showGenericMessageModal(
|
||||
'Sorry, something went wrong with the restore'
|
||||
)
|
||||
)
|
||||
.finally(() => ($scope.restoreState.inflight = false))
|
||||
}
|
||||
|
||||
$scope.showAddLabelDialog = () => {
|
||||
$modal.open({
|
||||
templateUrl: 'historyV2AddLabelModalTemplate',
|
||||
controller: 'HistoryV2AddLabelModalController',
|
||||
resolve: {
|
||||
update() {
|
||||
return $scope.history.selection.update
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
function openEntity(data) {
|
||||
const { id, type } = data
|
||||
return waitFor(() => ide.fileTreeManager.findEntityById(id), 3000)
|
||||
.then(function (entity) {
|
||||
if (type === 'doc') {
|
||||
ide.editorManager.openDoc(entity)
|
||||
ide.$timeout(() => {
|
||||
$scope.$broadcast('history:toggle')
|
||||
}, 0)
|
||||
} else if (type === 'file') {
|
||||
ide.binaryFilesManager.openFile(entity)
|
||||
ide.$timeout(() => {
|
||||
$scope.$broadcast('history:toggle')
|
||||
}, 0)
|
||||
}
|
||||
})
|
||||
.catch(debugConsole.error)
|
||||
}
|
||||
},
|
||||
])
|
|
@ -1,35 +0,0 @@
|
|||
import App from '../../../base'
|
||||
|
||||
export default App.directive('historyDraggableBoundary', function () {
|
||||
return {
|
||||
scope: {
|
||||
historyDraggableBoundary: '@',
|
||||
historyDraggableBoundaryOnDragStart: '&',
|
||||
historyDraggableBoundaryOnDragStop: '&',
|
||||
},
|
||||
restrict: 'A',
|
||||
link(scope, element, attrs) {
|
||||
element.data('selectionBoundary', {
|
||||
boundary: scope.historyDraggableBoundary,
|
||||
})
|
||||
element.draggable({
|
||||
axis: 'y',
|
||||
opacity: false,
|
||||
helper: 'clone',
|
||||
revert: true,
|
||||
scroll: true,
|
||||
cursor: 'row-resize',
|
||||
start(e, ui) {
|
||||
ui.helper.data('wasProperlyDropped', false)
|
||||
scope.historyDraggableBoundaryOnDragStart()
|
||||
},
|
||||
stop(e, ui) {
|
||||
scope.historyDraggableBoundaryOnDragStop({
|
||||
isValidDrop: ui.helper.data('wasProperlyDropped'),
|
||||
boundary: scope.historyDraggableBoundary,
|
||||
})
|
||||
},
|
||||
})
|
||||
},
|
||||
}
|
||||
})
|
|
@ -1,28 +0,0 @@
|
|||
import App from '../../../base'
|
||||
|
||||
export default App.directive('historyDroppableArea', function () {
|
||||
return {
|
||||
scope: {
|
||||
historyDroppableAreaOnDrop: '&',
|
||||
historyDroppableAreaOnOver: '&',
|
||||
historyDroppableAreaOnOut: '&',
|
||||
},
|
||||
restrict: 'A',
|
||||
link(scope, element, attrs) {
|
||||
element.droppable({
|
||||
accept: e => '.history-entry-toV-handle, .history-entry-fromV-handle',
|
||||
drop: (e, ui) => {
|
||||
const draggedBoundary =
|
||||
ui.draggable.data('selectionBoundary').boundary
|
||||
ui.helper.data('wasProperlyDropped', true)
|
||||
scope.historyDroppableAreaOnDrop({ boundary: draggedBoundary })
|
||||
},
|
||||
over: (e, ui) => {
|
||||
const draggedBoundary =
|
||||
ui.draggable.data('selectionBoundary').boundary
|
||||
scope.historyDroppableAreaOnOver({ boundary: draggedBoundary })
|
||||
},
|
||||
})
|
||||
},
|
||||
}
|
||||
})
|
|
@ -1,55 +0,0 @@
|
|||
/* eslint-disable
|
||||
max-len,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* DS207: Consider shorter variations of null checks
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
import App from '../../../base'
|
||||
|
||||
export default App.directive('infiniteScroll', function () {
|
||||
return {
|
||||
link(scope, element, attrs, ctrl) {
|
||||
const innerElement = element.find('.infinite-scroll-inner')
|
||||
element.css({ 'overflow-y': 'auto' })
|
||||
|
||||
const atEndOfListView = function () {
|
||||
if (attrs.infiniteScrollUpwards != null) {
|
||||
return atTopOfListView()
|
||||
} else {
|
||||
return atBottomOfListView()
|
||||
}
|
||||
}
|
||||
|
||||
const atTopOfListView = () => element.scrollTop() < 30
|
||||
|
||||
const atBottomOfListView = () =>
|
||||
element.scrollTop() + element.height() >= innerElement.height() - 30
|
||||
|
||||
const listShorterThanContainer = () =>
|
||||
element.height() > innerElement.height()
|
||||
|
||||
function loadUntilFull() {
|
||||
if (
|
||||
(listShorterThanContainer() || atEndOfListView()) &&
|
||||
!scope.$eval(attrs.infiniteScrollDisabled)
|
||||
) {
|
||||
const promise = scope.$eval(attrs.infiniteScroll)
|
||||
return promise.then(() => setTimeout(() => loadUntilFull(), 0))
|
||||
}
|
||||
}
|
||||
|
||||
element.on('scroll', event => loadUntilFull())
|
||||
|
||||
return scope.$watch(attrs.infiniteScrollInitialize, function (value) {
|
||||
if (value) {
|
||||
return loadUntilFull()
|
||||
}
|
||||
})
|
||||
},
|
||||
}
|
||||
})
|
|
@ -1,17 +0,0 @@
|
|||
/* eslint-disable
|
||||
no-return-assign,
|
||||
no-unused-vars,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
let HistoryViewModes
|
||||
|
||||
export default HistoryViewModes = {
|
||||
POINT_IN_TIME: 'point_in_time',
|
||||
COMPARE: 'compare',
|
||||
}
|
|
@ -14,6 +14,7 @@ import localStorage from '../../infrastructure/local-storage'
|
|||
import getMeta from '../../utils/meta'
|
||||
import { debugConsole } from '@/utils/debugging'
|
||||
import { BinaryFile } from '@/features/file-view/types/binary-file'
|
||||
import useScopeEventEmitter from '@/shared/hooks/use-scope-event-emitter'
|
||||
|
||||
export type IdeLayout = 'sideBySide' | 'flat'
|
||||
export type IdeView = 'editor' | 'file' | 'pdf' | 'history'
|
||||
|
@ -60,15 +61,15 @@ function setLayoutInLocalStorage(pdfLayout: IdeLayout) {
|
|||
export const LayoutProvider: FC = ({ children }) => {
|
||||
// what to show in the "flat" view (editor or pdf)
|
||||
const [view, _setView] = useScopeValue<IdeView>('ui.view')
|
||||
const [toggleHistory] = useScopeValue<() => void>('toggleHistory')
|
||||
const [openFile] = useScopeValue<BinaryFile | null>('openFile')
|
||||
const historyToggleEmitter = useScopeEventEmitter('history:toggle', true)
|
||||
|
||||
const setView = useCallback(
|
||||
(value: IdeView) => {
|
||||
_setView(oldValue => {
|
||||
// ensure that the "history:toggle" event is broadcast when switching in or out of history view
|
||||
if (value === 'history' || oldValue === 'history') {
|
||||
toggleHistory()
|
||||
historyToggleEmitter()
|
||||
}
|
||||
|
||||
if (value === 'editor' && openFile) {
|
||||
|
@ -82,7 +83,7 @@ export const LayoutProvider: FC = ({ children }) => {
|
|||
return value
|
||||
})
|
||||
},
|
||||
[_setView, openFile, toggleHistory]
|
||||
[_setView, openFile, historyToggleEmitter]
|
||||
)
|
||||
|
||||
// whether the chat pane is open
|
||||
|
|
|
@ -89,7 +89,6 @@ const initialize = () => {
|
|||
pdfViewer: 'js',
|
||||
syntaxValidation: true,
|
||||
},
|
||||
toggleHistory: () => {},
|
||||
editor: {
|
||||
richText: false,
|
||||
sharejs_doc: {
|
||||
|
|
|
@ -116,7 +116,6 @@ export function EditorProviders({
|
|||
},
|
||||
$on: sinon.stub(),
|
||||
$applyAsync: sinon.stub(),
|
||||
toggleHistory: sinon.stub(),
|
||||
permissionsLevel,
|
||||
},
|
||||
scope
|
||||
|
|
Loading…
Reference in a new issue