Merge pull request #9297 from overleaf/ta-galileo-module

Create Galileo Module

GitOrigin-RevId: 0d9dfeebc150bd6a0d828f55be47f9d9f1a70d66
This commit is contained in:
Timothée Alby 2022-08-18 14:27:13 +02:00 committed by Copybot
parent d9a1c1e521
commit ac3bc987d9
12 changed files with 135 additions and 8 deletions

View file

@ -413,6 +413,8 @@ const AuthenticationController = {
return next() return next()
}, },
checkCredentials,
requireBasicAuth: function (userDetails) { requireBasicAuth: function (userDetails) {
const userDetailsMap = new Map(Object.entries(userDetails)) const userDetailsMap = new Map(Object.entries(userDetails))
return function (req, res, next) { return function (req, res, next) {

View file

@ -1116,6 +1116,8 @@ const ProjectController = {
!Features.hasFeature('saas') || !Features.hasFeature('saas') ||
(user.features && user.features.symbolPalette) (user.features && user.features.symbolPalette)
const galileoEnabled = shouldDisplayFeature('galileo')
const dictionaryEditorEnabled = const dictionaryEditorEnabled =
!Features.hasFeature('saas') || !Features.hasFeature('saas') ||
dictionaryEditorAssignment?.variant === 'enabled' dictionaryEditorAssignment?.variant === 'enabled'
@ -1197,6 +1199,7 @@ const ProjectController = {
debugPdfDetach, debugPdfDetach,
showNewSourceEditorOption, showNewSourceEditorOption,
showSymbolPalette, showSymbolPalette,
galileoEnabled,
showStopOnFirstError, showStopOnFirstError,
detachRole, detachRole,
metadata: { viewport: false }, metadata: { viewport: false },

View file

@ -23,13 +23,13 @@
.editor-container.full-size( .editor-container.full-size(
ng-show="ui.view == 'editor' && editor.multiSelectedCount === 0" ng-show="ui.view == 'editor' && editor.multiSelectedCount === 0"
vertical-resizable-panes="symbol-palette-resizer" vertical-resizable-panes="south-pane-resizer"
vertical-resizable-panes-hidden-externally-on="symbol-palette-toggled" vertical-resizable-panes-hidden-externally-on="south-pane-toggled"
vertical-resizable-panes-hidden-initially="true" vertical-resizable-panes-hidden-initially="true"
vertical-resizable-panes-default-size="250" vertical-resizable-panes-default-size="250"
vertical-resizable-panes-min-size="250" vertical-resizable-panes-min-size="250"
vertical-resizable-panes-max-size="336" vertical-resizable-panes-max-size="336"
vertical-resizable-panes-resize-on="layout:flat-screen:toggle,symbol-palette-toggled" vertical-resizable-panes-resize-on="layout:flat-screen:toggle,south-pane-toggled"
) )
.div(vertical-resizable-top) .div(vertical-resizable-top)
@ -58,7 +58,9 @@
if !isRestrictedTokenMember if !isRestrictedTokenMember
include ./review-panel include ./review-panel
if moduleIncludesAvailable('editor:symbol-palette') if moduleIncludesAvailable('editor:symbol-palette') || moduleIncludesAvailable('editor:galileo')
.div(vertical-resizable-bottom) .div(vertical-resizable-bottom)
!= moduleIncludes('editor:symbol-palette', locals) if moduleIncludesAvailable('editor:symbol-palette')
!= moduleIncludes('editor:symbol-palette', locals)
if moduleIncludesAvailable('editor:galileo')
!= moduleIncludes('editor:galileo', locals)

View file

@ -18,7 +18,7 @@ include ./left-menu
ng-class="{ 'ide-history-open' : (ui.view == 'history' && history.isV2) }", ng-class="{ 'ide-history-open' : (ui.view == 'history' && history.isV2) }",
layout="main", layout="main",
ng-hide="state.loading", ng-hide="state.loading",
resize-on="layout:chat:resize,history:toggle,layout:flat-screen:toggle,symbol-palette-toggled", resize-on="layout:chat:resize,history:toggle,layout:flat-screen:toggle,south-pane-toggled",
minimum-restore-size-west="130" minimum-restore-size-west="130"
custom-toggler-pane=hasFeature('custom-togglers') ? "west" : false custom-toggler-pane=hasFeature('custom-togglers') ? "west" : false
custom-toggler-msg-when-open=hasFeature('custom-togglers') ? translate("tooltip_hide_filetree") : false custom-toggler-msg-when-open=hasFeature('custom-togglers') ? translate("tooltip_hide_filetree") : false

View file

@ -22,6 +22,7 @@ meta(name="ol-pdfjsVariant" content=pdfjsVariant)
meta(name="ol-debugPdfDetach" data-type="boolean" content=debugPdfDetach) meta(name="ol-debugPdfDetach" data-type="boolean" content=debugPdfDetach)
meta(name="ol-showNewSourceEditorOption" data-type="boolean" content=showNewSourceEditorOption) meta(name="ol-showNewSourceEditorOption" data-type="boolean" content=showNewSourceEditorOption)
meta(name="ol-showSymbolPalette" data-type="boolean" content=showSymbolPalette) meta(name="ol-showSymbolPalette" data-type="boolean" content=showSymbolPalette)
meta(name="ol-galileoEnabled" data-type="boolean" content=galileoEnabled)
meta(name="ol-detachRole" data-type="string" content=detachRole) meta(name="ol-detachRole" data-type="string" content=detachRole)
meta(name="ol-showUpgradePrompt" data-type="boolean" content=showUpgradePrompt) meta(name="ol-showUpgradePrompt" data-type="boolean" content=showUpgradePrompt)
meta(name="ol-showStopOnFirstError" data-type="boolean" content=showStopOnFirstError) meta(name="ol-showStopOnFirstError" data-type="boolean" content=showStopOnFirstError)

View file

@ -50,7 +50,10 @@ export default EditorManager = (function () {
toggleSymbolPalette: () => { toggleSymbolPalette: () => {
const newValue = !this.$scope.editor.showSymbolPalette const newValue = !this.$scope.editor.showSymbolPalette
this.$scope.editor.showSymbolPalette = newValue this.$scope.editor.showSymbolPalette = newValue
ide.$scope.$emit('symbol-palette-toggled', newValue) if (newValue && this.$scope.editor.showGalileo) {
this.$scope.editor.toggleGalileo()
}
ide.$scope.$emit('south-pane-toggled', newValue)
eventTracking.sendMB( eventTracking.sendMB(
newValue ? 'symbol-palette-show' : 'symbol-palette-hide' newValue ? 'symbol-palette-show' : 'symbol-palette-hide'
) )
@ -59,6 +62,16 @@ export default EditorManager = (function () {
ide.$scope.$emit('editor:replace-selection', symbol.command) ide.$scope.$emit('editor:replace-selection', symbol.command)
eventTracking.sendMB('symbol-palette-insert') eventTracking.sendMB('symbol-palette-insert')
}, },
showGalileo: false,
toggleGalileo: () => {
const newValue = !this.$scope.editor.showGalileo
this.$scope.editor.showGalileo = newValue
if (newValue && this.$scope.editor.showSymbolPalette) {
this.$scope.editor.toggleSymbolPalette()
}
ide.$scope.$emit('south-pane-toggled', newValue)
eventTracking.sendMB(newValue ? 'galileo-show' : 'galileo-hide')
},
multiSelectedCount: 0, multiSelectedCount: 0,
} }

View file

@ -149,6 +149,12 @@ App.directive(
} }
}) })
ide.$scope.$on('galileo-toggled', (event, isToggled) => {
if (!isToggled) {
editor.focus()
}
})
scope.$watch('autoPairDelimiters', autoPairDelimiters => { scope.$watch('autoPairDelimiters', autoPairDelimiters => {
if (autoPairDelimiters) { if (autoPairDelimiters) {
return editor.setOption('behavioursEnabled', true) return editor.setOption('behavioursEnabled', true)

View file

@ -33,6 +33,9 @@ EditorContext.Provider.propTypes = {
showSymbolPalette: PropTypes.bool, showSymbolPalette: PropTypes.bool,
toggleSymbolPalette: PropTypes.func, toggleSymbolPalette: PropTypes.func,
insertSymbol: PropTypes.func, insertSymbol: PropTypes.func,
showGalileo: PropTypes.bool,
toggleGalileo: PropTypes.func,
insertGalileoAutocomplete: PropTypes.func,
isProjectOwner: PropTypes.bool, isProjectOwner: PropTypes.bool,
isRestrictedTokenMember: PropTypes.bool, isRestrictedTokenMember: PropTypes.bool,
permissionsLevel: PropTypes.oneOf(['readOnly', 'readAndWrite', 'owner']), permissionsLevel: PropTypes.oneOf(['readOnly', 'readAndWrite', 'owner']),
@ -76,6 +79,8 @@ export function EditorProvider({ children, settings }) {
const [permissionsLevel] = useScopeValue('permissionsLevel') const [permissionsLevel] = useScopeValue('permissionsLevel')
const [showSymbolPalette] = useScopeValue('editor.showSymbolPalette') const [showSymbolPalette] = useScopeValue('editor.showSymbolPalette')
const [toggleSymbolPalette] = useScopeValue('editor.toggleSymbolPalette') const [toggleSymbolPalette] = useScopeValue('editor.toggleSymbolPalette')
const [showGalileo] = useScopeValue('editor.showGalileo')
const [toggleGalileo] = useScopeValue('editor.toggleGalileo')
useEffect(() => { useEffect(() => {
if (ide?.socket) { if (ide?.socket) {
@ -137,6 +142,14 @@ export function EditorProvider({ children, settings }) {
) )
}, []) }, [])
const insertGalileoAutocomplete = useCallback(text => {
window.dispatchEvent(
new CustomEvent('editor:insert-galileo-completion', {
detail: text,
})
)
}, [])
const value = useMemo( const value = useMemo(
() => ({ () => ({
cobranding, cobranding,
@ -149,6 +162,9 @@ export function EditorProvider({ children, settings }) {
showSymbolPalette, showSymbolPalette,
toggleSymbolPalette, toggleSymbolPalette,
insertSymbol, insertSymbol,
showGalileo,
toggleGalileo,
insertGalileoAutocomplete,
}), }),
[ [
cobranding, cobranding,
@ -160,6 +176,9 @@ export function EditorProvider({ children, settings }) {
showSymbolPalette, showSymbolPalette,
toggleSymbolPalette, toggleSymbolPalette,
insertSymbol, insertSymbol,
showGalileo,
toggleGalileo,
insertGalileoAutocomplete,
] ]
) )

View file

@ -108,5 +108,6 @@
// module styles // module styles
// TODO: find a way for modules to add styles dynamically // TODO: find a way for modules to add styles dynamically
@import 'modules/symbol-palette.less'; @import 'modules/symbol-palette.less';
@import 'modules/galileo.less';
@import 'modules/admin-panel.less'; @import 'modules/admin-panel.less';

View file

@ -137,3 +137,8 @@
@symbol-palette-selected-tab-bg: #fff; @symbol-palette-selected-tab-bg: #fff;
@symbol-palette-selected-tab-color: @ol-blue; @symbol-palette-selected-tab-color: @ol-blue;
@symbol-palette-text-shadow-color: @ol-blue-gray-1; @symbol-palette-text-shadow-color: @ol-blue-gray-1;
// Galileo
@galileo-bg: #fff;
@galileo-color: @ol-blue-gray-3;
@galileo-header-background: @ol-blue-gray-1;

View file

@ -1126,3 +1126,12 @@
@symbol-palette-selected-tab-bg: @ol-blue-gray-4; @symbol-palette-selected-tab-bg: @ol-blue-gray-4;
@symbol-palette-selected-tab-color: #fff; @symbol-palette-selected-tab-color: #fff;
@symbol-palette-text-shadow-color: @ol-blue-gray-6; @symbol-palette-text-shadow-color: @ol-blue-gray-6;
// Galileo
@galileo-bg: @ol-blue-gray-4;
@galileo-color: #fff;
@galileo-header-background: @ol-blue-gray-5;
// Editor fonts
@editor-font-lucida: 'Lucida Console', 'Source Code Pro', monospace;
@editor-font-monaco: Monaco, Menlo, 'Ubuntu Mono', 'Consolas', monospace;

View file

@ -0,0 +1,66 @@
.galileo {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
min-height: 220px;
background-color: @galileo-bg;
color: @galileo-color;
.galileo-header {
display: flex;
background-color: @galileo-header-background;
:first-child {
flex: 1;
}
.galileo-close-button {
background: transparent;
color: @galileo-color;
padding-left: @padding-sm;
padding-right: @padding-sm;
margin-left: @margin-xs;
font-size: 24px;
font-weight: bold;
line-height: 1;
}
}
.galileo-font-lucida {
font-family: @editor-font-lucida;
}
.galileo-font-monaco {
font-family: @editor-font-monaco;
}
.galileo-body {
padding: 5px;
overflow-y: auto;
.galileo-items {
h2 {
font-size: 120%;
font-weight: normal;
padding: 0;
margin: 5px 0;
color: inherit;
}
.galileo-item {
display: flex;
align-items: flex-start;
gap: 5px;
margin-bottom: 5px;
.galileo-item-text {
flex: 1;
background-color: white;
color: black;
white-space: break-spaces;
}
}
}
}
}