Remove Angular (#17534)

GitOrigin-RevId: 7a0d45e17d9905fa75569e2d19ca59caa4a41565
This commit is contained in:
Alf Eaton 2024-06-05 09:33:11 +01:00 committed by Copybot
parent b3d33fe813
commit c24ace801b
149 changed files with 665 additions and 21004 deletions

224
package-lock.json generated
View file

@ -12243,12 +12243,6 @@
"@types/node": "*"
}
},
"node_modules/@types/angular": {
"version": "1.8.4",
"resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.8.4.tgz",
"integrity": "sha512-wPS/ncJWhyxJsndsW1B6Ta8D4mi97x1yItSu+rkLDytU3oRIh2CFAjMuJceYwFAh9+DIohndWM0QBA9OU2Hv0g==",
"dev": true
},
"node_modules/@types/aria-query": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
@ -12691,15 +12685,6 @@
"integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==",
"dev": true
},
"node_modules/@types/lodash.frompairs": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@types/lodash.frompairs/-/lodash.frompairs-4.0.6.tgz",
"integrity": "sha512-rwCUf4NMKhXpiVjL/RXP8YOk+rd02/J4tACADEgaMXRVnzDbSSlBMKFZoX/ARmHVLg3Qc98Um4PErGv8FbxU7w==",
"dev": true,
"dependencies": {
"@types/lodash": "*"
}
},
"node_modules/@types/long": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
@ -14733,25 +14718,6 @@
"integrity": "sha512-VJK1SRmXBpjwsB4YOHYSturx48rLKMzHgCqDH2ZDa6ZbMS/N5huoNqyQdK5Fj/xayu3fqbXckn5SeCS1EbMDZg==",
"dev": true
},
"node_modules/angular": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz",
"integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==",
"deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward.",
"dev": true
},
"node_modules/angular-mocks": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.8.2.tgz",
"integrity": "sha512-I5L3P0l21HPdVsP4A4qWmENt4ePjjbkDFdAzOaM7QiibFySbt14DptPbt2IjeG4vFBr4vSLbhIz8Fk03DISl8Q==",
"dev": true
},
"node_modules/angular-sanitize": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.8.2.tgz",
"integrity": "sha512-OB6Goa+QN3byf5asQ7XRl7DKZejm/F/ZOqa9z1skqYVOWA2hoBxoCmt9E7+i7T/TbxZP5zYzKxNZVVJNu860Hg==",
"dev": true
},
"node_modules/ansi-color": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz",
@ -15617,17 +15583,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/babel-plugin-angularjs-annotate": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz",
"integrity": "sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.0.0",
"@babel/types": "^7.2.0",
"simple-is": "~0.2.0"
}
},
"node_modules/babel-plugin-macros": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
@ -27997,12 +27952,6 @@
"lodash.keys": "~2.4.1"
}
},
"node_modules/lodash.frompairs": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.frompairs/-/lodash.frompairs-4.0.1.tgz",
"integrity": "sha1-vE5SB/onV8E25XNhTpZkUGsrG9I=",
"dev": true
},
"node_modules/lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
@ -30011,18 +29960,6 @@
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"node_modules/ngcomponent": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ngcomponent/-/ngcomponent-4.1.0.tgz",
"integrity": "sha512-cGL3iVoqMWTpCfaIwgRKhdaGqiy2Z+CCG0cVfjlBvdqE8saj8xap9B4OTf+qwObxLVZmDTJPDgx3bN6Q/lZ7BQ==",
"dev": true,
"dependencies": {
"@types/angular": "^1.6.39",
"@types/lodash": "^4.14.85",
"angular": ">=1.5.0",
"lodash": "^4.17.4"
}
},
"node_modules/nise": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz",
@ -34807,52 +34744,6 @@
"react-dom": ">=15.0.0"
}
},
"node_modules/react2angular": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/react2angular/-/react2angular-4.0.6.tgz",
"integrity": "sha512-MDl2WRoTyu7Gyh4+FAIlmsM2mxIa/DjSz6G/d90L1tK8ZRubqVEayKF6IPyAruC5DMhGDVJ7tlAIcu/gMNDjXg==",
"dev": true,
"dependencies": {
"@types/lodash.frompairs": "^4.0.5",
"angular": ">=1.5",
"lodash.frompairs": "^4.0.1",
"ngcomponent": "^4.1.0"
},
"peerDependencies": {
"@types/angular": ">=1.5",
"@types/prop-types": ">=15",
"@types/react": ">=16",
"@types/react-dom": ">=16",
"prop-types": ">=15",
"react": ">=15",
"react-dom": ">=15"
}
},
"node_modules/react2angular-shared-context": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/react2angular-shared-context/-/react2angular-shared-context-1.1.2.tgz",
"integrity": "sha512-0zrxBjmBs+et5zYNknx/jvrJCzGz6KbF8BHfzXHTl9ms6iMsbmmXkZiQQksVT1Og5wnkmVq9nlLVfWYJLSXF0w==",
"dev": true,
"dependencies": {
"uuid": "^8.3.2"
},
"engines": {
"node": ">=10"
},
"peerDependencies": {
"react": "^16.0.0 || ^17",
"react-dom": "^16.0.0 || ^17"
}
},
"node_modules/react2angular-shared-context/node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true,
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/reactcss": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
@ -36673,12 +36564,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/simple-is": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz",
"integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=",
"dev": true
},
"node_modules/simple-oauth2": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/simple-oauth2/-/simple-oauth2-5.0.0.tgz",
@ -44616,12 +44501,8 @@
"acorn": "^7.1.1",
"acorn-walk": "^7.1.1",
"algoliasearch": "^3.35.1",
"angular": "~1.8.0",
"angular-mocks": "~1.8.0",
"angular-sanitize": "~1.8.0",
"autoprefixer": "^10.4.16",
"babel-loader": "^9.1.2",
"babel-plugin-angularjs-annotate": "^0.10.0",
"babel-plugin-macros": "^3.1.0",
"babel-plugin-module-resolver": "^5.0.0",
"backbone": "^1.3.3",
@ -44698,8 +44579,6 @@
"react-linkify": "^1.0.0-alpha",
"react-refresh": "^0.14.0",
"react-resizable-panels": "^1.0.3",
"react2angular": "^4.0.6",
"react2angular-shared-context": "^1.1.0",
"requirejs": "^2.3.6",
"resolve-url-loader": "^5.0.0",
"samlp": "^7.0.2",
@ -53003,14 +52882,10 @@
"acorn": "^7.1.1",
"acorn-walk": "^7.1.1",
"algoliasearch": "^3.35.1",
"angular": "~1.8.0",
"angular-mocks": "~1.8.0",
"angular-sanitize": "~1.8.0",
"archiver": "^5.3.0",
"async": "3.2.2",
"autoprefixer": "^10.4.16",
"babel-loader": "^9.1.2",
"babel-plugin-angularjs-annotate": "^0.10.0",
"babel-plugin-macros": "^3.1.0",
"babel-plugin-module-resolver": "^5.0.0",
"backbone": "^1.3.3",
@ -53152,8 +53027,6 @@
"react-linkify": "^1.0.0-alpha",
"react-refresh": "^0.14.0",
"react-resizable-panels": "^1.0.3",
"react2angular": "^4.0.6",
"react2angular-shared-context": "^1.1.0",
"recurly": "^4.0.0",
"referer-parser": "github:overleaf/nodejs-referer-parser#8b8b103762d05b7be4cfa2f810e1d408be67d7bb",
"request": "^2.88.2",
@ -57040,12 +56913,6 @@
"@types/node": "*"
}
},
"@types/angular": {
"version": "1.8.4",
"resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.8.4.tgz",
"integrity": "sha512-wPS/ncJWhyxJsndsW1B6Ta8D4mi97x1yItSu+rkLDytU3oRIh2CFAjMuJceYwFAh9+DIohndWM0QBA9OU2Hv0g==",
"dev": true
},
"@types/aria-query": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
@ -57487,15 +57354,6 @@
"integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==",
"dev": true
},
"@types/lodash.frompairs": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@types/lodash.frompairs/-/lodash.frompairs-4.0.6.tgz",
"integrity": "sha512-rwCUf4NMKhXpiVjL/RXP8YOk+rd02/J4tACADEgaMXRVnzDbSSlBMKFZoX/ARmHVLg3Qc98Um4PErGv8FbxU7w==",
"dev": true,
"requires": {
"@types/lodash": "*"
}
},
"@types/long": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
@ -59081,24 +58939,6 @@
}
}
},
"angular": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz",
"integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==",
"dev": true
},
"angular-mocks": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.8.2.tgz",
"integrity": "sha512-I5L3P0l21HPdVsP4A4qWmENt4ePjjbkDFdAzOaM7QiibFySbt14DptPbt2IjeG4vFBr4vSLbhIz8Fk03DISl8Q==",
"dev": true
},
"angular-sanitize": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.8.2.tgz",
"integrity": "sha512-OB6Goa+QN3byf5asQ7XRl7DKZejm/F/ZOqa9z1skqYVOWA2hoBxoCmt9E7+i7T/TbxZP5zYzKxNZVVJNu860Hg==",
"dev": true
},
"ansi-color": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz",
@ -59740,17 +59580,6 @@
}
}
},
"babel-plugin-angularjs-annotate": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz",
"integrity": "sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"@babel/types": "^7.2.0",
"simple-is": "~0.2.0"
}
},
"babel-plugin-macros": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
@ -70105,12 +69934,6 @@
"lodash.keys": "~2.4.1"
}
},
"lodash.frompairs": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.frompairs/-/lodash.frompairs-4.0.1.tgz",
"integrity": "sha1-vE5SB/onV8E25XNhTpZkUGsrG9I=",
"dev": true
},
"lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
@ -71596,18 +71419,6 @@
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"ngcomponent": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ngcomponent/-/ngcomponent-4.1.0.tgz",
"integrity": "sha512-cGL3iVoqMWTpCfaIwgRKhdaGqiy2Z+CCG0cVfjlBvdqE8saj8xap9B4OTf+qwObxLVZmDTJPDgx3bN6Q/lZ7BQ==",
"dev": true,
"requires": {
"@types/angular": "^1.6.39",
"@types/lodash": "^4.14.85",
"angular": ">=1.5.0",
"lodash": "^4.17.4"
}
},
"nise": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz",
@ -75149,35 +74960,6 @@
"react-lifecycles-compat": "^3.0.4"
}
},
"react2angular": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/react2angular/-/react2angular-4.0.6.tgz",
"integrity": "sha512-MDl2WRoTyu7Gyh4+FAIlmsM2mxIa/DjSz6G/d90L1tK8ZRubqVEayKF6IPyAruC5DMhGDVJ7tlAIcu/gMNDjXg==",
"dev": true,
"requires": {
"@types/lodash.frompairs": "^4.0.5",
"angular": ">=1.5",
"lodash.frompairs": "^4.0.1",
"ngcomponent": "^4.1.0"
}
},
"react2angular-shared-context": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/react2angular-shared-context/-/react2angular-shared-context-1.1.2.tgz",
"integrity": "sha512-0zrxBjmBs+et5zYNknx/jvrJCzGz6KbF8BHfzXHTl9ms6iMsbmmXkZiQQksVT1Og5wnkmVq9nlLVfWYJLSXF0w==",
"dev": true,
"requires": {
"uuid": "^8.3.2"
},
"dependencies": {
"uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true
}
}
},
"reactcss": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
@ -76578,12 +76360,6 @@
}
}
},
"simple-is": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz",
"integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=",
"dev": true
},
"simple-oauth2": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/simple-oauth2/-/simple-oauth2-5.0.0.tgz",

View file

@ -1,9 +0,0 @@
diff --git a/node_modules/ngcomponent/index.ts b/node_modules/ngcomponent/index.ts
index 5fe33c5..8e1c6fc 100644
--- a/node_modules/ngcomponent/index.ts
+++ b/node_modules/ngcomponent/index.ts
@@ -1,3 +1,4 @@
+// @ts-nocheck
import { IChangesObject } from 'angular'
import assign = require('lodash/assign')
import mapValues = require('lodash/mapValues')

View file

@ -1,9 +0,0 @@
diff --git a/node_modules/react2angular/index.tsx b/node_modules/react2angular/index.tsx
index 5cee831..a07e040 100644
--- a/node_modules/react2angular/index.tsx
+++ b/node_modules/react2angular/index.tsx
@@ -1,3 +1,4 @@
+// @ts-nocheck
import { IAugmentedJQuery, IComponentOptions } from 'angular'
import fromPairs = require('lodash.frompairs')
import NgComponent from 'ngcomponent'

View file

@ -603,15 +603,10 @@ const _ProjectController = {
!showPersonalAccessToken &&
splitTestAssignments['personal-access-token'].variant === 'enabled' // `?personal-access-token=enabled`
const idePageReact = splitTestAssignments['ide-page'].variant === 'react'
const template =
detachRole === 'detached'
? // TODO: Create React version of detached page
'project/editor_detached'
: idePageReact
? 'project/ide-react'
: 'project/editor'
? 'project/ide-react-detached'
: 'project/ide-react'
res.render(template, {
title: project.name,
@ -681,7 +676,6 @@ const _ProjectController = {
showUpgradePrompt,
fixedSizeDocument: true,
useOpenTelemetry: Settings.useOpenTelemetryClient,
idePageReact,
showPersonalAccessToken,
optionalPersonalAccessToken,
hasTrackChangesFeature: Features.hasFeature('track-changes'),

View file

@ -12,7 +12,6 @@ const {
handleAdminDomainRedirect,
} = require('../Authorization/AuthorizationMiddleware')
const ProjectAuditLogHandler = require('../Project/ProjectAuditLogHandler')
const SplitTestHandler = require('../SplitTests/SplitTestHandler')
const orderedPrivilegeLevels = [
PrivilegeLevels.NONE,
@ -98,18 +97,7 @@ async function tokenAccessPage(req, res, next) {
}
}
const { variant } = await SplitTestHandler.promises.getAssignment(
req,
res,
'token-access-page'
)
const view =
variant === 'react'
? 'project/token/access-react'
: 'project/token/access'
res.render(view, {
res.render('project/token/access-react', {
postUrl: makePostUrl(token),
})
} catch (err) {

View file

@ -72,7 +72,7 @@ html(
block head-scripts
body(ng-csp=(cspEnabled ? "no-unsafe-eval" : false) class=(showThinFooter ? 'thin-footer' : undefined))
body(class=(showThinFooter ? 'thin-footer' : undefined))
if(settings.recaptcha && settings.recaptcha.siteKeyV3)
script(type="text/javascript", nonce=scriptNonce, src="https://www.recaptcha.net/recaptcha/api.js?render="+settings.recaptcha.siteKeyV3, defer=deferScripts)

View file

@ -1,21 +0,0 @@
extends ./layout-base
block entrypointVar
- entrypoint = 'main'
block body
if (typeof(suppressNavbar) == "undefined")
include layout/navbar
block content
if (typeof(suppressFooter) == "undefined")
if showThinFooter
include layout/footer
else
include layout/fat-footer
if (typeof(suppressCookieBanner) == 'undefined')
include _cookie_banner
!= moduleIncludes("contactModal", locals)

View file

@ -1,42 +0,0 @@
footer.site-footer
- var showLanguagePicker = Object.keys(settings.i18n.subdomainLang).length > 1
- var hasCustomLeftNav = nav.left_footer && nav.left_footer.length > 0
.site-footer-content.hidden-print
.row
ul.col-md-9
if hasFeature('saas')
li © #{new Date().getFullYear()} Overleaf
else if !settings.nav.hide_powered_by
li
//- year of Server Pro release, static
| © 2024
|
a(href='https://www.overleaf.com/for/enterprises') Powered by Overleaf
if showLanguagePicker || hasCustomLeftNav
li
strong.text-muted |
if showLanguagePicker
include language-picker
if showLanguagePicker && hasCustomLeftNav
li
strong.text-muted |
each item in nav.left_footer
li
if item.url
a(href=item.url, class=item.class) !{translate(item.text)}
else
| !{item.text}
ul.col-md-3.text-right
each item in nav.right_footer
li
if item.url
a(href=item.url, class=item.class, aria-label=item.label) !{item.text}
else
| !{item.text}

View file

@ -1,147 +0,0 @@
nav.navbar.navbar-default.navbar-main
.container-fluid
.navbar-header
if (typeof(suppressNavbarRight) == "undefined")
button.navbar-toggle(ng-init="navCollapsed = true", ng-click="navCollapsed = !navCollapsed", ng-class="{active: !navCollapsed}", aria-label="Toggle " + translate('navigation'))
i.fa.fa-bars(aria-hidden="true")
if settings.nav.custom_logo
a(href='/', aria-label=settings.appName, style='background-image:url("'+settings.nav.custom_logo+'")').navbar-brand
else if (nav.title)
a(href='/', aria-label=settings.appName, ng-non-bindable).navbar-title #{nav.title}
else
a(href='/', aria-label=settings.appName).navbar-brand
- var canDisplayAdminMenu = hasAdminAccess()
- var canDisplayAdminRedirect = canRedirectToAdminDomain()
- var canDisplaySplitTestMenu = hasFeature('saas') && (canDisplayAdminMenu || (getSessionUser() && getSessionUser().staffAccess && (getSessionUser().staffAccess.splitTestMetrics || getSessionUser().staffAccess.splitTestManagement)))
- var canDisplaySurveyMenu = hasFeature('saas') && canDisplayAdminMenu
if (typeof(suppressNavbarRight) == "undefined")
.navbar-collapse.collapse(collapse="navCollapsed")
ul.nav.navbar-nav.navbar-right
if (canDisplayAdminMenu || canDisplayAdminRedirect || canDisplaySplitTestMenu)
li.dropdown(class="subdued", dropdown)
a.dropdown-toggle(href, dropdown-toggle)
| Admin
b.caret
ul.dropdown-menu
if canDisplayAdminMenu
li
a(href="/admin") Manage Site
li
a(href="/admin/user") Manage Users
li
a(href="/admin/project") Project URL Lookup
li
a(href="/admin/saml/logs") SAML logs
if canDisplayAdminRedirect
li
a(href=settings.adminUrl) Switch to Admin
if canDisplaySplitTestMenu
li
a(href="/admin/split-test") Manage Feature Flags
if canDisplaySurveyMenu
li
a(href="/admin/survey") Manage Surveys
// loop over header_extras
each item in nav.header_extras
-
if ((item.only_when_logged_in && getSessionUser())
|| (item.only_when_logged_out && (!getSessionUser()))
|| (!item.only_when_logged_out && !item.only_when_logged_in && !item.only_content_pages)
|| (item.only_content_pages && (typeof(suppressNavContentLinks) == "undefined" || !suppressNavContentLinks))
){
var showNavItem = true
} else {
var showNavItem = false
}
if showNavItem
if item.dropdown
li.dropdown(class=item.class, dropdown)
a.dropdown-toggle(href, dropdown-toggle)
| !{translate(item.text)}
b.caret
ul.dropdown-menu
each child in item.dropdown
if child.divider
li.divider
else if child.isContactUs
li
a(ng-controller="ContactModal" ng-click="contactUsModal()" href)
span(event-tracking="menu-clicked-contact" event-tracking-mb="true" event-tracking-trigger="click")
| #{translate("contact_us")}
else
li
if child.url
a(
href=child.url,
class=child.class,
event-tracking=child.event
event-tracking-mb="true"
event-tracking-trigger="click"
event-segmentation=child.eventSegmentation
) !{translate(child.text)}
else
| !{translate(child.text)}
else
li(class=item.class)
if item.url
a(
href=item.url,
class=item.class,
event-tracking=item.event
event-tracking-mb="true"
event-tracking-trigger="click"
) !{translate(item.text)}
else
| !{translate(item.text)}
// logged out
if !getSessionUser()
// register link
if hasFeature('registration-page')
li
a(
href="/register"
event-tracking="menu-clicked-register"
event-tracking-action="clicked"
event-tracking-trigger="click"
event-tracking-mb="true"
event-segmentation={ page: currentUrl }
) #{translate('register')}
// login link
li
a(
href="/login"
event-tracking="menu-clicked-login"
event-tracking-action="clicked"
event-tracking-trigger="click"
event-tracking-mb="true"
event-segmentation={ page: currentUrl }
).text-capitalize #{translate('log_in')}
// projects link and account menu
if getSessionUser()
li
a(href="/project") #{translate('Projects')}
li.dropdown(dropdown)
a.dropdown-toggle(href, dropdown-toggle)
| #{translate('Account')}
b.caret
ul.dropdown-menu
li
div.subdued {{ usersEmail }}
li.divider.hidden-xs.hidden-sm
li
a(href="/user/settings") #{translate('Account Settings')}
if nav.showSubscriptionLink
li
a(href="/user/subscription") #{translate('subscription')}
li.divider.hidden-xs.hidden-sm
li
form(method="POST" action="/logout")
input(name='_csrf', type='hidden', value=csrfToken)
button.btn-link.text-left.dropdown-menu-button #{translate('log_out')}

View file

@ -1,124 +0,0 @@
extends ../layout
block vars
- var suppressNavbar = true
- var suppressFooter = true
- var suppressSkipToContent = true
- var suppressCookieBanner = true
- metadata.robotsNoindexNofollow = true
block entrypointVar
- entrypoint = 'ide'
block content
.editor(ng-controller="IdeController").full-size
//- required by react2angular-shared-context, must be rendered as a top level component
shared-context-react()
.loading-screen(ng-if="state.loading")
.loading-screen-brand-container
.loading-screen-brand(
style="height: 20%;"
ng-style="{ 'height': state.load_progress + '%' }"
)
h3.loading-screen-label(ng-if="!state.error") #{translate("loading")}
span.loading-screen-ellip .
span.loading-screen-ellip .
span.loading-screen-ellip .
p.loading-screen-error(ng-if="state.error").ng-cloak
span(ng-bind-html="state.error")
.global-alerts(ng-cloak ng-hide="editor.error_state")
.alert.alert-danger.small(ng-if="connection.forced_disconnect")
strong #{translate("disconnected")}
.alert.alert-warning.small(ng-if="connection.reconnection_countdown")
strong #{translate("lost_connection")}.
| #{translate("reconnecting_in_x_secs", {seconds:"{{ connection.reconnection_countdown }}"})}.
a#try-reconnect-now-button.alert-link-as-btn.pull-right(href, ng-click="tryReconnectNow()") #{translate("try_now")}
.alert.alert-warning.small(ng-if="connection.reconnecting && connection.stillReconnecting")
strong #{translate("reconnecting")}…
.alert.alert-warning.small(ng-if="sync_tex_error")
strong #{translate("synctex_failed")}.
a#synctex-more-info-button.alert-link-as-btn.pull-right(
href="/learn/how-to/SyncTeX_Errors"
target="_blank"
) #{translate("more_info")}
.alert.alert-warning.small(ng-if="connection.inactive_disconnect")
strong #{translate("editor_disconected_click_to_reconnect")}
.alert.alert-warning.small(ng-if="connection.debug") {{ connection.state }}
.div(ng-controller="SavingNotificationController")
.alert.alert-warning.small(ng-repeat="(doc_id, state) in docSavingStatus" ng-if="state.unsavedSeconds > 8") #{translate("saving_notification_with_seconds", {docname:"{{ state.doc.name }}", seconds:"{{ state.unsavedSeconds }}"})}
.div(ng-controller="SystemMessagesController")
.alert.alert-warning.system-message(
ng-repeat="message in messages"
ng-controller="SystemMessageController"
ng-hide="hidden"
)
button(ng-hide="protected" ng-click="hide()").close.pull-right
span(aria-hidden="true") ×
span.sr-only #{translate("close")}
.system-message-content
| {{htmlContent}}
if hasFeature('saas')
legacy-editor-warning(delay=10000)
include ./editor/main
script(type="text/ng-template" id="genericMessageModalTemplate")
.modal-header
button.close(
type="button"
data-dismiss="modal"
ng-click="done()"
aria-label="Close"
)
span(aria-hidden="true") ×
h3 {{ title }}
.modal-body(ng-bind-html="message")
.modal-footer
button.btn.btn-info(ng-click="done()") #{translate("ok")}
script(type="text/ng-template" id="outOfSyncModalTemplate")
.modal-header
button.close(
type="button"
data-dismiss="modal"
ng-click="done()"
aria-label="Close"
)
span(aria-hidden="true") ×
h3 {{ title }}
.modal-body(ng-bind-html="message")
.modal-body
button.btn.btn-info(
ng-init="showFileContents = false"
ng-click="showFileContents = !showFileContents"
)
| {{showFileContents ? "Hide" : "Show"}} Local File Contents
.text-preview(ng-show="showFileContents")
textarea.scroll-container(readonly="readonly" rows="{{editorContentRows}}")
| {{editorContent}}
.modal-footer
button.btn.btn-info(ng-click="done()") #{translate("reload_editor")}
script(type="text/ng-template" id="lockEditorModalTemplate")
.modal-header
h3 {{ title }}
.modal-body(ng-bind-html="message")
block append meta
include ./editor/meta
block prepend foot-scripts
each file in (useOpenTelemetry ? entrypointScripts("tracing") : [])
script(type="text/javascript", nonce=scriptNonce, src=file)
script(type="text/javascript", nonce=scriptNonce, src=(wsUrl || '/socket.io') + '/socket.io.js')

View file

@ -1,52 +0,0 @@
.ui-layout-center(
ng-controller="ReviewPanelController",
ng-class="{\
'rp-state-current-file': (reviewPanel.subView === SubViews.CUR_FILE),\
'rp-state-current-file-expanded': (reviewPanel.subView === SubViews.CUR_FILE && ui.reviewPanelOpen),\
'rp-state-current-file-mini': (reviewPanel.subView === SubViews.CUR_FILE && !ui.reviewPanelOpen),\
'rp-state-overview': (reviewPanel.subView === SubViews.OVERVIEW),\
'rp-size-mini': ui.miniReviewPanelVisible,\
'rp-size-expanded': ui.reviewPanelOpen,\
'rp-layout-left': reviewPanel.layoutToLeft,\
'rp-loading-threads': loadingThreads,\
}"
)
.multi-selection-ongoing(
ng-show="editor.multiSelectedCount > 0"
)
.multi-selection-message
h4 {{ editor.multiSelectedCount }} #{translate('files_selected')}
include ./file-view
.editor-container.full-size(
ng-show="ui.view == 'editor' && editor.multiSelectedCount === 0"
vertical-resizable-panes="south-pane-resizer"
vertical-resizable-panes-hidden-externally-on="south-pane-toggled"
vertical-resizable-panes-hidden-initially="true"
vertical-resizable-panes-default-size="250"
vertical-resizable-panes-min-size="250"
vertical-resizable-panes-max-size="336"
vertical-resizable-panes-resize-on="layout:flat-screen:toggle,south-pane-toggled"
)
.div(vertical-resizable-top)
.loading-panel(
ng-show="(!editor.sharejs_doc || editor.opening) && !editor.error_state",
)
span(ng-show="editor.open_doc_id")
i.fa.fa-spin.fa-refresh
|   #{translate("loading")}…
span(ng-show="!editor.open_doc_id")
i.fa.fa-arrow-left
|   #{translate("open_a_file_on_the_left")}
div(ng-controller="EditorLoaderController")
include ../../source-editor/source-editor
if moduleIncludesAvailable('editor:symbol-palette')
.div(vertical-resizable-bottom)
if moduleIncludesAvailable('editor:symbol-palette')
!= moduleIncludes('editor:symbol-palette', locals)

View file

@ -1,53 +0,0 @@
div.full-size(
ng-show="ui.view == 'editor' || ui.view === 'file'"
layout="pdf"
open-east="ui.pdfOpen"
mask-iframes-on-resize="true"
resize-on="layout:main:resize"
resize-proportionally="true"
initial-size-east="'50%'"
minimum-restore-size-east="300"
allow-overflow-on="'center'"
custom-toggler-pane="east"
custom-toggler-msg-when-open=translate("tooltip_hide_pdf")
custom-toggler-msg-when-closed=translate("tooltip_show_pdf")
)
include ./editor-pane
.ui-layout-east
div(ng-if="ui.pdfLayout == 'sideBySide'")
pdf-preview()
.ui-layout-resizer-controls.synctex-controls(
ng-show="settings.pdfViewer !== 'native'"
)
pdf-synctex-controls()
div.full-size(
ng-if="ui.pdfLayout == 'flat'"
ng-show="ui.view == 'pdf'"
)
pdf-preview()
// fallback, shown when no file/view is selected
div.full-size.no-file-selection(
ng-if="!ui.view"
)
.no-file-selection-message(
ng-if="rootFolder.children && rootFolder.children.length > 0"
)
h3
| #{translate('no_selection_select_file')}
.no-file-selection-message(
ng-if="rootFolder.children && rootFolder.children.length === 0"
)
h3
| #{translate('no_selection_create_new_file')}
div(
ng-controller="FileTreeController"
)
button.btn.btn-primary(
ng-click="openNewDocModal()"
)
| #{translate('new_file')}

View file

@ -1,3 +0,0 @@
aside.editor-sidebar.full-size.history-file-tree#history-file-tree(
ng-show="ui.view == 'history'"
)

View file

@ -1,27 +0,0 @@
aside.editor-sidebar.full-size(
ng-show="ui.view != 'history'"
vertical-resizable-panes="outline-resizer"
vertical-resizable-panes-toggled-externally-on="outline-toggled"
vertical-resizable-panes-default-size="350"
vertical-resizable-panes-min-size="32"
vertical-resizable-panes-max-size="'75%'"
vertical-resizable-panes-resize-on="left-pane-resize-all"
)
div(
ng-controller="ReactFileTreeController"
vertical-resizable-top
)
file-tree-root(
on-select="onSelect"
on-init="onInit"
is-connected="isConnected"
ref-providers="refProviders"
reindex-references="reindexReferences"
set-ref-provider-enabled="setRefProviderEnabled"
set-started-free-trial="setStartedFreeTrial"
)
outline-container(
vertical-resizable-bottom
)

View file

@ -1,9 +0,0 @@
div(
ng-controller="FileViewController"
ng-show="ui.view == 'file'"
ng-if="openFile && editor.multiSelectedCount === 0"
)
file-view(
file='file'
store-references-keys='storeReferencesKeys'
)

View file

@ -1,12 +0,0 @@
div(ng-controller="ReactShareProjectModalController")
share-project-modal(
handle-hide="handleHide"
show="show"
)
div(ng-controller="EditorNavigationToolbarController")
editor-navigation-toolbar-root(
open-doc="openDoc"
online-users-array="onlineUsersArray"
open-share-project-modal="openShareProjectModal"
)

View file

@ -1 +0,0 @@
editor-left-menu()

View file

@ -1,39 +0,0 @@
include ./left-menu-react
#chat-wrapper.full-size(
layout="chat",
spacing-open="{{ui.chatResizerSizeOpen}}",
spacing-closed="{{ui.chatResizerSizeClosed}}",
ng-hide="state.loading",
ng-cloak
)
.ui-layout-center
include ./header-react
main#ide-body(
ng-cloak,
role="main",
layout="main",
ng-hide="state.loading",
resize-on="layout:chat:resize,history:toggle,layout:flat-screen:toggle,south-pane-toggled",
minimum-restore-size-west="130"
custom-toggler-pane="west"
custom-toggler-msg-when-open=translate("tooltip_hide_filetree")
custom-toggler-msg-when-closed=translate("tooltip_show_filetree")
tabindex="0"
initial-size-east="250"
init-closed-east="true"
open-east="ui.chatOpen"
)
.ui-layout-west
include ./file-tree-react
include ./file-tree-history-react
.ui-layout-center
include ./editor
history-root()
if !isRestrictedTokenMember
.ui-layout-east
aside.chat
chat()

View file

@ -35,7 +35,6 @@ meta(name="ol-optionalPersonalAccessToken", data-type="boolean" content=optional
meta(name="ol-hasTrackChangesFeature", data-type="boolean" content=hasTrackChangesFeature)
meta(name="ol-inactiveTutorials", data-type="json" content=user.inactiveTutorials)
meta(name="ol-projectTags" data-type="json" content=projectTags)
meta(name="ol-idePageReact", data-type="boolean" content=idePageReact)
meta(name="ol-loadingText", data-type="string" content=translate("loading"))
meta(name="ol-translationLoadErrorMessage", data-type="string" content=translate("could_not_load_translations"))

View file

@ -1,4 +1,4 @@
extends ../layout
extends ../layout-marketing
block entrypointVar
- entrypoint = 'ide-detached'

View file

@ -1,4 +1,4 @@
extends ../layout
extends ../layout-marketing
block vars
- var suppressNavbar = true

View file

@ -1,127 +0,0 @@
extends ../../layout
block vars
- var suppressFooter = true
- var suppressCookieBanner = true
- var suppressSkipToContent = true
block content
script(type="template", id="overleaf-token-access-data")!= StringHelper.stringifyJsonForScript({ postUrl: postUrl, csrfToken: csrfToken})
div(
ng-controller="TokenAccessPageController",
ng-init="post()"
)
.editor.full-size
div
|  
a(href="/project", style="font-size: 2rem; margin-left: 1rem; color: #ddd;")
i.fa.fa-arrow-left
.loading-screen(
ng-show="mode == 'accessAttempt'"
)
.loading-screen-brand-container
.loading-screen-brand()
h3.loading-screen-label.text-center
| #{translate('join_project')}
span(ng-show="accessInFlight == true")
span.loading-screen-ellip .
span.loading-screen-ellip .
span.loading-screen-ellip .
.global-alerts.text-center(ng-cloak)
div(ng-show="accessError", ng-cloak)
br
div(ng-switch="accessError", ng-cloak)
div(ng-switch-when="not_found")
h4(aria-live="assertive")
| Project not found
div(ng-switch-default)
.alert.alert-danger(aria-live="assertive") #{translate('token_access_failure')}
p
a(href="/") #{translate('home')}
.loading-screen(
ng-show="mode == 'v1Import'"
)
.container
.row
.col-sm-8.col-sm-offset-2
h1.text-center
span(ng-if="v1ImportData.status != 'mustLogin'") Overleaf v1 Project
span(ng-if="v1ImportData.status == 'mustLogin'") Please Log In
img.v2-import__img(
src="/img/v1-import/v2-editor.png"
alt="The new V2 editor."
)
div(ng-if="v1ImportData.status == 'cannotImport'")
h2.text-center
| Cannot Access Overleaf v1 Project
p.text-center.row-spaced-small
| Please contact the project owner or
|
a(href="/contact") contact support
|
| for assistance.
div(ng-if="v1ImportData.status == 'mustLogin'")
p.text-center.row-spaced-small
| You will need to log in to access this project.
.row-spaced.text-center
a.btn.btn-primary(
href="/login?redir={{ currentPath() }}"
) Log In To Access Project
div(ng-if="v1ImportData.status == 'canDownloadZip'")
p.text-center.row-spaced.small
| #[strong() {{ getProjectName() }}] has not yet been moved into
| the new version of Overleaf. This project was created
| anonymously and therefore cannot be automatically imported.
| Please download a zip file of the project and upload that to
| continue editing it. If you would like to delete this project
| after you have made a copy, please contact support.
.row-spaced.text-center
a.btn.btn-primary(ng-href="{{ buildZipDownloadPath(v1ImportData.projectId) }}")
| Download project zip file
.loading-screen(
ng-show="mode == 'requireAccept'"
)
.container
.row
.col-md-8.col-md-offset-2
.card
.page-header.text-centered
h1 #{translate("invited_to_join")}
br
em {{ getProjectName() }}
.row.text-center
.col-md-12
p
if user
| #{translate("accepting_invite_as")}
|
em #{user.email}
.row.text-center
.col-md-12
button.btn.btn-lg.btn-primary(
type='submit'
ng-click="postConfirmedByUser()"
) #{translate("join_project")}
block append foot-scripts
script(type="text/javascript", nonce=scriptNonce).
$(document).ready(function () {
setTimeout(function() {
$('.loading-screen-brand').css('height', '20%')
}, 500);
});

View file

@ -1,3 +0,0 @@
source-editor.review-panel-react#editor(
ng-show="!!editor.sharejs_doc && !editor.opening && multiSelectedCount === 0 && !editor.error_state"
)

View file

@ -1,10 +1,11 @@
extends ../layout
extends ../layout-marketing
include ./plans/_mixins
include ../_mixins/bootstrap_js
block entrypointVar
- entrypoint = 'pages/user/subscription/plans-v2/plans-v2-main'
block vars
- entrypoint = 'pages/user/subscription/plans-v2/plans-v2-main'
- var suppressFooter = true
- var suppressNavbarRight = true
- var suppressCookieBanner = true
@ -66,6 +67,3 @@ block content
| #{translate("continue_with_free_plan")}
!= moduleIncludes("contactModalGeneral-marketing", locals)
block prepend foot-scripts
+bootstrap-js(bootstrapVersion)

View file

@ -1,6 +1,6 @@
extends ../layout-marketing
block vars
block entrypointVar
- entrypoint = 'pages/user/subscription/plans-v2/plans-v2-main'
block append meta

View file

@ -1,4 +1,4 @@
extends ../../layout
extends ../../layout-marketing
block content
main.content.content-alt.team-invite#main-content

View file

@ -1,47 +0,0 @@
script(type="text/ng-template", id="BonusLinkToUsModal")
.modal-header
button.close(
type="button"
data-dismiss="modal"
ng-click="cancel()"
aria-label="Close"
)
span(aria-hidden="true") ×
h3 Dropbox link
.modal-body.modal-body-share
div(ng-show="dbState.gotLinkStatus")
div(ng-hide="dbState.userIsLinkedToDropbox || !dbState.hasDropboxFeature")
span(ng-hide="dbState.startedLinkProcess") Your account is not linked to dropbox
|    
a(ng-click="linkToDropbox()").btn.btn-info Update Dropbox Settings
p.small.text-center(ng-show="dbState.startedLinkProcess")
| Please refresh this page after starting your free trial.
div(ng-show="dbState.hasDropboxFeature && dbState.userIsLinkedToDropbox")
progressbar.progress-striped.active(value='dbState.percentageLeftTillNextPoll', type="info")
span
strong {{dbState.minsTillNextPoll}} minutes
span until dropbox is next checked for changes.
div.text-center(ng-hide="dbState.hasDropboxFeature")
p You need to upgrade your account to link to dropbox.
p
a.btn(ng-click="startFreeTrial('dropbox')", ng-class="buttonClass") Start Free Trial
p.small(ng-show="startedFreeTrial")
| Please refresh this page after starting your free trial.
div(ng-hide="dbState.gotLinkStatus")
span.small   checking dropbox status  
i.fa.fa-refresh.fa-spin(aria-hidden="true")
.modal-footer()
button.btn.btn-default(
ng-click="cancel()",
)
span Dismiss

View file

@ -27,7 +27,7 @@
["@babel/react", { "runtime": "automatic" }],
"@babel/typescript"
],
"plugins": ["angularjs-annotate", "macros"],
"plugins": ["macros"],
"overrides": [
// treat .cjs files (e.g. libraries symlinked into node_modules) as commonjs
{

View file

@ -1,33 +1,6 @@
const fs = require('fs')
const Path = require('path')
const { merge } = require('@overleaf/settings/merge')
// Automatically detect module imports that are included in this version of the application (SaaS, Server-CE, Server Pro).
// E.g. during a Server-CE build, we will not find imports for proprietary modules.
//
// Restart webpack after adding/removing modules.
const MODULES_PATH = Path.join(__dirname, '../modules')
const entryPointsIde = []
const entryPointsMain = []
fs.readdirSync(MODULES_PATH).forEach(module => {
const entryPathIde = Path.join(
MODULES_PATH,
module,
'/frontend/js/ide/index.js'
)
if (fs.existsSync(entryPathIde)) {
entryPointsIde.push(entryPathIde)
}
const entryPathMain = Path.join(
MODULES_PATH,
module,
'/frontend/js/main/index.js'
)
if (fs.existsSync(entryPathMain)) {
entryPointsMain.push(entryPathMain)
}
})
let defaultFeatures, siteUrl
// Make time interval config easier.
@ -918,9 +891,6 @@ module.exports = {
managedGroupSubscriptionEnrollmentNotification: [],
managedGroupEnrollmentInvite: [],
ssoCertificateInfo: [],
// See comment at the definition of these variables.
entryPointsIde,
entryPointsMain,
},
moduleImportSequence: [
@ -935,7 +905,7 @@ module.exports = {
reportOnly: process.env.CSP_REPORT_ONLY === 'true',
reportPercentage: parseFloat(process.env.CSP_REPORT_PERCENTAGE) || 0,
reportUri: process.env.CSP_REPORT_URI,
exclude: ['app/views/project/editor'],
exclude: [],
},
unsupportedBrowsers: {

View file

@ -11,6 +11,7 @@ import { interceptFileUpload } from './upload'
import { interceptProjectListing } from './project-list'
import { interceptLinkedFile } from './linked-file'
import { interceptMathJax } from './mathjax'
import { interceptMetadata } from './metadata'
// eslint-disable-next-line no-unused-vars,@typescript-eslint/no-namespace
declare global {
@ -21,6 +22,7 @@ declare global {
interceptAsync: typeof interceptAsync
interceptCompile: typeof interceptCompile
interceptEvents: typeof interceptEvents
interceptMetadata: typeof interceptMetadata
interceptSpelling: typeof interceptSpelling
waitForCompile: typeof waitForCompile
interceptDeferredCompile: typeof interceptDeferredCompile
@ -35,6 +37,7 @@ declare global {
Cypress.Commands.add('interceptAsync', interceptAsync)
Cypress.Commands.add('interceptCompile', interceptCompile)
Cypress.Commands.add('interceptEvents', interceptEvents)
Cypress.Commands.add('interceptMetadata', interceptMetadata)
Cypress.Commands.add('interceptSpelling', interceptSpelling)
Cypress.Commands.add('waitForCompile', waitForCompile)
Cypress.Commands.add('interceptDeferredCompile', interceptDeferredCompile)

View file

@ -0,0 +1,3 @@
export const interceptMetadata = () => {
cy.intercept('POST', '/project/*/doc/*/metadata', {})
}

View file

@ -1,61 +0,0 @@
/* eslint-disable
camelcase,
max-len,
no-useless-escape,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* DS103: Rewrite code to no longer use __guard__
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
import './utils/webpack-public-path'
import './libraries'
import './infrastructure/error-reporter'
import './modules/recursionHelper'
import './modules/errorCatcher'
import './modules/localStorage'
import './modules/sessionStorage'
import getMeta from './utils/meta'
const App = angular
.module('OverleafApp', [
'ui.bootstrap',
'RecursionHelper',
'ngSanitize',
'ErrorCatcher',
'localStorage',
'sessionStorage',
'ui.select',
])
.config([
'$qProvider',
'uiSelectConfig',
function ($qProvider, uiSelectConfig) {
$qProvider.errorOnUnhandledRejections(false)
uiSelectConfig.spinnerClass = 'fa fa-refresh ui-select-spin'
},
])
App.run([
'$rootScope',
'$templateCache',
function ($rootScope, $templateCache) {
$rootScope.usersEmail = getMeta('ol-usersEmail')
// UI Select templates are hard-coded and use Glyphicon icons (which we don't import).
// The line below simply overrides the hard-coded template with our own, which is
// basically the same but using Font Awesome icons.
$templateCache.put(
'bootstrap/match.tpl.html',
'<div class="ui-select-match" ng-hide="$select.open && $select.searchEnabled" ng-disabled="$select.disabled" ng-class="{\'btn-default-focus\':$select.focus}"><span tabindex="-1" class="btn btn-default form-control ui-select-toggle" aria-label="{{ $select.baseTitle }} activate" ng-disabled="$select.disabled" ng-click="$select.activate()" style="outline: 0;"><span ng-show="$select.isEmpty()" class="ui-select-placeholder text-muted">{{$select.placeholder}}</span> <span ng-hide="$select.isEmpty()" class="ui-select-match-text pull-left" ng-class="{\'ui-select-allow-clear\': $select.allowClear && !$select.isEmpty()}" ng-transclude=""></span> <i class="caret pull-right" ng-click="$select.toggle($event)"></i> <a ng-show="$select.allowClear && !$select.isEmpty() && ($select.disabled !== true)" aria-label="{{ $select.baseTitle }} clear" style="margin-right: 10px" ng-click="$select.clear($event)" class="btn btn-xs btn-link pull-right"><i class="fa fa-times" aria-hidden="true"></i></a></span></div>'