Merge remote-tracking branch 'origin/code-maintenance/esbuild' into dev

This commit is contained in:
Oliver Günther
2025-07-21 11:10:38 +02:00
123 changed files with 23745 additions and 892 deletions
+2 -2
View File
@@ -49,8 +49,8 @@ module FrontendAssetHelper
# or referencing the running CLI proxy that hosts the assets in memory.
def include_frontend_assets
capture do
%w(vendor.js polyfills.js runtime.js main.js).each do |file|
concat nonced_javascript_include_tag variable_asset_path(file), skip_pipeline: true
%w(polyfills.js main.js).each do |file|
concat nonced_javascript_include_tag variable_asset_path(file), skip_pipeline: true, type: "module"
end
concat frontend_stylesheet_link_tag("styles.css")
+22 -20
View File
@@ -176,33 +176,35 @@ See COPYRIGHT and LICENSE files for more details.
</div>
<%# Properly decides main menu expanded state and width before its drawn. Fixes flickering side menu
where menu is first expanded, then being collapsed in angular. %>
<%= nonced_javascript_tag do %>
<%= nonced_javascript_tag defer: true do %>
// execute these lines to prevent flickering when page loads:
(function($) {
var wrapper = $('#wrapper');
var savedMainMenuWidth = window.OpenProject.guardedLocalStorage("openProject-mainMenuWidth");
var mainMenuCollapsed = window.OpenProject.guardedLocalStorage("openProject-mainMenuCollapsed");
window.addEventListener('turbo:load', () => {
(function($) {
var wrapper = $('#wrapper');
var savedMainMenuWidth = window.OpenProject.guardedLocalStorage("openProject-mainMenuWidth");
var mainMenuCollapsed = window.OpenProject.guardedLocalStorage("openProject-mainMenuCollapsed");
if (window.innerWidth < 1012) {
// force hide on load for small desktops
$('.can-hide-navigation').addClass('hidden-navigation');
}
if (window.innerWidth < 1012) {
// force hide on load for small desktops
$('.can-hide-navigation').addClass('hidden-navigation');
}
if (mainMenuCollapsed === 'true') {
savedMainMenuWidth = 0;
}
if (mainMenuCollapsed === 'true') {
savedMainMenuWidth = 0;
}
if (savedMainMenuWidth || savedMainMenuWidth === 0) {
document.documentElement.style.setProperty("--main-menu-width", savedMainMenuWidth + 'px');
}
if (savedMainMenuWidth || savedMainMenuWidth === 0) {
document.documentElement.style.setProperty("--main-menu-width", savedMainMenuWidth + 'px');
}
wrapper.show();
wrapper.show();
// Wrapper for page-specific JS from deprecated inline functions
// no longer available with CSP.
<%= content_for :additional_js_dom_ready %>
}(jQuery));
// Wrapper for page-specific JS from deprecated inline functions
// no longer available with CSP.
<%= content_for :additional_js_dom_ready %>
}(jQuery));
});
<% end %>
<div class="op-wide-autocomplete-wrapper"></div>
<%= call_hook :view_layouts_base_body_bottom %>
+8 -6
View File
@@ -45,12 +45,14 @@ See COPYRIGHT and LICENSE files for more details.
{ label: WikiPage.human_attribute_name(:parent_title), include_blank: false, container_class: "-wide" } %>
</div>
<%= nonced_javascript_tag do -%>
jQuery(function() {
var parent_select = jQuery('#wiki_page_parent_id');
parent_select.attr('size', parent_select.children().length);
}
));
<%= nonced_javascript_tag defer: true do -%>
window.addEventListener('turbo:load', () => {
jQuery(function() {
var parent_select = jQuery('#wiki_page_parent_id');
parent_select.attr('size', parent_select.children().length);
}
));
});
<% end -%>
<%= submit_tag t(:button_save), class: "button -primary" %>
<% end %>
+1 -1
View File
@@ -77,7 +77,7 @@ services:
frontend:
build:
<<: *frontend-build
command: "node --max_old_space_size=8096 ./node_modules/@angular/cli/bin/ng serve --host 0.0.0.0 --public-host ${OPENPROJECT_DEV_URL}"
command: "node --max_old_space_size=8096 ./node_modules/@angular/cli/bin/ng serve --host 0.0.0.0"
volumes:
- ".:/home/dev/openproject"
- "${CKEDITOR_BUILD_DIR:-./frontend/src/vendor/ckeditor/}:/home/dev/openproject/frontend/src/vendor/ckeditor/"
+2 -2
View File
@@ -7,7 +7,7 @@ module.exports = {
},
parser: "@typescript-eslint/parser",
parserOptions: {
project: "./src/tsconfig.app.json",
project: "./tsconfig.app.json",
tsconfigRootDir: __dirname,
sourceType: "module",
createDefaultProgram: true,
@@ -22,7 +22,7 @@ module.exports = {
files: ["*.ts"],
parser: "@typescript-eslint/parser",
parserOptions: {
project: "./src/tsconfig.app.json",
project: "./tsconfig.app.json",
tsconfigRootDir: __dirname,
sourceType: "module",
createDefaultProgram: true,
+41 -39
View File
@@ -4,25 +4,19 @@
"newProjectRoot": "projects",
"projects": {
"OpenProject": {
"projectType": "application",
"schematics": {
"@schematics/angular:component": {
"style": "sass"
}
},
"root": "",
"sourceRoot": "src",
"projectType": "application",
"architect": {
"build": {
"builder": "@angular-builders/custom-webpack:browser",
"builder": "@angular-builders/custom-esbuild:application",
"options": {
"customWebpackConfig": {
"verbose": {
"properties": ["entry"]
},
"path": "./extra-webpack.config.js",
"mergeStrategies": {
"externals": "replace"
}
},
"allowedCommonJsDependencies": [
"core-app/init-vendors",
"core-app/init-globals",
"dom-plane",
"pako",
"moment-timezone",
@@ -38,12 +32,15 @@
"chartjs-plugin-datalabels"
],
"preserveSymlinks": true,
"deployUrl": "/assets/frontend/",
"outputPath": "../public/assets/frontend/",
"outputPath": {
"base": "../public/assets/frontend",
"browser": ""
},
"index": "src/index2.html",
"main": "src/main.ts",
"tsConfig": "src/tsconfig.app.json",
"polyfills": "src/polyfills.ts",
"browser": "src/main.ts",
"polyfills": ["src/polyfills.ts"],
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "sass",
"assets": [
"src/assets"
],
@@ -59,31 +56,24 @@
"src/styles.scss",
"node_modules/@blocknote/mantine/dist/style.css",
"node_modules/codemirror/lib/codemirror.css",
"node_modules/jquery-ui/themes/base/core.css",
"node_modules/jquery-ui/themes/base/datepicker.css",
"node_modules/jquery-ui/themes/base/dialog.css",
"src/vendor/jquery-ui-1.14.1/jquery-ui.css",
"src/vendor/jquery-ui-1.14.1/jquery-ui.structure.css",
"src/vendor/jquery-ui-1.14.1/jquery-ui.theme.css",
"node_modules/flatpickr/dist/flatpickr.min.css"
],
"stylePreprocessorOptions": {
"includePaths": [
"src/assets/sass/"
"src/assets/sass"
]
},
"scripts": [],
"vendorChunk": true,
"extractLicenses": false,
"buildOptimizer": false,
"sourceMap": true,
"optimization": false,
"namedChunks": true
"scripts": []
},
"configurations": {
"production": {
"index": "",
"budgets": [
{
"type": "anyComponentStyle",
"maximumWarning": "6kb"
"maximumWarning": "6kB"
}
],
"preserveSymlinks": true,
@@ -103,19 +93,32 @@
}
]
},
}
"development": {
"optimization": false,
"extractLicenses": false,
"sourceMap": true
}
},
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"builder": "@angular-builders/custom-esbuild:dev-server",
"options": {
"proxyConfig": "cli_to_rails_proxy.js",
"buildTarget": "OpenProject:build"
"servePath": "/assets/frontend"
},
"configurations": {
"production": {
"buildTarget": "OpenProject:build:production"
},
"development": {
"buildTarget": "OpenProject:build:development",
"proxyConfig": "src/proxy.conf.mjs",
"headers": {
"Access-Control-Allow-Origin": "*"
}
}
}
},
"defaultConfiguration": "development"
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
@@ -129,7 +132,7 @@
"preserveSymlinks": true,
"main": "src/test.ts",
"karmaConfig": "./karma.conf.js",
"tsConfig": "src/tsconfig.spec.json",
"tsConfig": "tsconfig.spec.json",
"scripts": [],
"styles": [],
"stylePreprocessorOptions": {
@@ -146,8 +149,7 @@
"lintFilePatterns": [
"src/**/*.ts",
"src/**/*.html"
],
"preserveSymlinks": true
]
}
}
}
-15
View File
@@ -1,15 +0,0 @@
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
mangle: process.env.OPENPROJECT_ANGULAR_BUILD !== 'fast',
keep_classnames: true,
keep_fnames: true,
}
})
]
}
};
+1423 -332
View File
File diff suppressed because it is too large Load Diff
+7 -8
View File
@@ -5,7 +5,8 @@
"version": "0.1.0",
"private": true,
"devDependencies": {
"@angular-devkit/build-angular": "^17.3.4",
"@angular-builders/custom-esbuild": "^17.1.2",
"@angular-devkit/build-angular": "^17.3.17",
"@angular-eslint/builder": "^17.4.1",
"@angular-eslint/eslint-plugin": "^17.4.1",
"@angular-eslint/eslint-plugin-template": "^17.4.1",
@@ -17,7 +18,7 @@
"@jsdevtools/coverage-istanbul-loader": "3.0.5",
"@types/codemirror": "5.60.5",
"@types/dom-navigation": "^1.0.3",
"@types/dragula": "^3.7.0",
"@types/dragula": "^3.7.5",
"@types/hammerjs": "^2.0.36",
"@types/jasmine": "~3.6.0",
"@types/jquery": "^3.5.32",
@@ -61,7 +62,6 @@
"webpack-bundle-analyzer": "^4.4.2"
},
"dependencies": {
"@angular-builders/custom-webpack": "^17.0.2",
"@angular/animations": "^17.3.4",
"@angular/cdk": "^17.3.4",
"@angular/cli": "^17.3.4",
@@ -136,7 +136,6 @@
"i18n-js": "^4.3.0",
"idiomorph": "^0.3.0",
"jquery": "^3.7.1",
"jquery-ui": "1.14.1",
"jquery-ujs": "^1.2.3",
"jquery.caret": "^0.3.1",
"json5": "^2.2.2",
@@ -176,18 +175,18 @@
},
"scripts": {
"analyze": "ng build --configuration production --stats-json && webpack-bundle-analyzer -h 0.0.0.0 -p 9999 ../public/assets/frontend/stats.json",
"build:fast": "OPENPROJECT_ANGULAR_BUILD=fast node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --configuration production",
"build:fast": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --configuration production",
"build": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --configuration production --named-chunks --source-map",
"build:watch": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --watch --named-chunks",
"ci:plugins:register_frontend": "node ci-plugins-generator.js",
"tokens:generate": "theo src/app/spot/styles/tokens/tokens.yml --transform web --format sass,json --dest src/app/spot/styles/tokens/dist",
"serve": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve --host ${FE_HOST:-localhost} --port ${FE_PORT:-4200} --public-host http://${PROXY_HOSTNAME:-${FE_HOST:-localhost}}:${FE_PORT:-4200}",
"serve:test": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve --host ${FE_HOST:-localhost} --port ${FE_PORT:-4200} --disable-host-check --public-host http://frontend-test:${FE_PORT:-4200}",
"serve": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve --host ${FE_HOST:-localhost} --port ${FE_PORT:-4200}",
"serve:test": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve --host ${FE_HOST:-localhost} --port ${FE_PORT:-4200} --disable-host-check",
"test": "ng test --watch=false",
"test:watch": "ng test --watch=true",
"lint": "esprint check",
"lint:fix": "esprint check --fix",
"lint:eslint": "eslint",
"generate-typings": "tsc -d -p src/tsconfig.app.json"
"generate-typings": "tsc -d -p tsconfig.app.json"
}
}
@@ -30,7 +30,7 @@ import { QueryResource } from 'core-app/features/hal/resources/query-resource';
import { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';
import { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';
import { Observable } from 'rxjs';
import * as URI from 'urijs';
import URI from 'urijs';
import { map, tap } from 'rxjs/operators';
import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';
import { QueryFiltersService } from 'core-app/features/work-packages/components/wp-query/query-filters.service';
@@ -27,7 +27,7 @@
//++
import { Injectable } from '@angular/core';
import * as moment from 'moment';
import moment from 'moment';
import { ConfigurationResource } from 'core-app/features/hal/resources/configuration-resource';
import { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';
@@ -29,8 +29,7 @@
import { Injectable } from '@angular/core';
import { ConfigurationService } from 'core-app/core/config/configuration.service';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import * as moment from 'moment-timezone';
import { Moment } from 'moment';
import moment, { Moment } from 'moment-timezone';
import { outputChronicDuration } from '../../shared/helpers/chronic_duration';
@Injectable({ providedIn: 'root' })
@@ -30,7 +30,7 @@ import {
Injectable,
Injector,
} from '@angular/core';
import * as moment from 'moment';
import moment, { Moment } from 'moment';
import {
take,
tap,
@@ -42,7 +42,6 @@ import {
Observable,
of,
} from 'rxjs';
import { Moment } from 'moment';
@Injectable({ providedIn: 'root' })
export class WeekdayService {
@@ -91,7 +91,9 @@ export function initializeGlobalListeners():void {
// This is very likely an invalid selector such as a Google Analytics tag.
// We can safely ignore this and just not scroll in this case.
// Still log the error so one can confirm the reason there is no scrolling.
console.log(`Could not scroll to given location hash: ${hash} ( ${e.message})`);
if (e instanceof Error) {
console.log(`Could not scroll to given location hash: ${hash} ( ${e.message})`);
}
}
}
@@ -17,7 +17,7 @@ import {
import { ganttOnboardingTourSteps } from 'core-app/core/setup/globals/onboarding/tours/gantt_tour';
import { ConfigurationService } from 'core-app/core/config/configuration.service';
require('core-vendor/enjoyhint');
import 'core-vendor/enjoyhint';
declare global {
interface Window {
@@ -0,0 +1,37 @@
//-- copyright
// OpenProject is an open source project management software.
// Copyright (C) the OpenProject GmbH
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 3.
//
// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
// Copyright (C) 2006-2013 Jean-Philippe Lang
// Copyright (C) 2010-2013 the ChiliProject Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// See COPYRIGHT and LICENSE files for more details.
//++
import jQuery from 'jquery';
declare global {
interface Window {
jQuery:typeof jQuery;
}
}
window.jQuery = jQuery;
+10 -8
View File
@@ -26,8 +26,8 @@
// See COPYRIGHT and LICENSE files for more details.
//++
import * as moment from 'moment';
import * as i18njs from 'i18n-js';
import moment from 'moment';
import { I18n } from 'i18n-js';
export function initializeLocale() {
const meta = document.querySelector<HTMLMetaElement>('meta[name=openproject_initializer]');
@@ -37,9 +37,11 @@ export function initializeLocale() {
const firstDayOfWeek = parseInt(meta?.dataset.firstdayofweek || '', 10); // properties of meta.dataset are exposed in lowercase
const firstWeekOfYear = parseInt(meta?.dataset.firstweekofyear || '', 10); // properties of meta.dataset are exposed in lowercase
window.I18n = new i18njs.I18n();
I18n.locale = userLocale;
I18n.defaultLocale = defaultLocale;
const i18n = new I18n();
i18n.locale = userLocale;
i18n.defaultLocale = defaultLocale;
window.I18n = i18n;
moment.locale(userLocale);
@@ -61,9 +63,9 @@ export function initializeLocale() {
// Override the default pluralization function to allow
// "other" to be used as a fallback for "one" in languages where one is not set
// (japanese, for example)
I18n.pluralization.register(
i18n.pluralization.register(
'default',
(_i18n:i18njs.I18n, count:number) => {
(_i18n:I18n, count:number) => {
switch (count) {
case 0:
return ['zero', 'other'];
@@ -81,7 +83,7 @@ export function initializeLocale() {
.map(
(locale) => import(/* webpackChunkName: "locale" */ `../../../locales/${locale}.json`)
.then((imported:{ default:object }) => {
I18n.store(imported.default);
i18n.store(imported.default);
}),
)
.value();
@@ -0,0 +1,88 @@
//-- copyright
// OpenProject is an open source project management software.
// Copyright (C) the OpenProject GmbH
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 3.
//
// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
// Copyright (C) 2006-2013 Jean-Philippe Lang
// Copyright (C) 2010-2013 the ChiliProject Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.import 'moment/locale/See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MAimport 'moment/locale/02110-1301, USA.
//
// See COPYRIGHT and LICENSE files for more details.
//++
// N.B. Moment.js does not currently support:
// - ckb-IR (Kurdish)
// - rw (Rwandan)
//
import 'moment/locale/af';
import 'moment/locale/ar';
import 'moment/locale/az';
import 'moment/locale/be';
import 'moment/locale/bg';
import 'moment/locale/ca';
import 'moment/locale/cs';
import 'moment/locale/da';
import 'moment/locale/de';
import 'moment/locale/el';
import 'moment/locale/en-gb';
import 'moment/locale/eo';
import 'moment/locale/es';
import 'moment/locale/et';
import 'moment/locale/eu';
import 'moment/locale/fa';
import 'moment/locale/fi';
import 'moment/locale/fil';
import 'moment/locale/fr';
import 'moment/locale/he';
import 'moment/locale/hi';
import 'moment/locale/hr';
import 'moment/locale/hu';
import 'moment/locale/id';
import 'moment/locale/it';
import 'moment/locale/ja';
import 'moment/locale/ka';
import 'moment/locale/kk';
import 'moment/locale/ko';
import 'moment/locale/lt';
import 'moment/locale/lv';
import 'moment/locale/mn';
import 'moment/locale/ms';
import 'moment/locale/nb'; // "nb" (Bokmål)
import 'moment/locale/ne';
import 'moment/locale/nl';
import 'moment/locale/nn'; // "nn" (Nynorsk)
import 'moment/locale/pl';
import 'moment/locale/pt-br';
import 'moment/locale/pt';
import 'moment/locale/ro';
import 'moment/locale/ru';
import 'moment/locale/si';
import 'moment/locale/sk';
import 'moment/locale/sl';
import 'moment/locale/sr';
import 'moment/locale/sv';
import 'moment/locale/th';
import 'moment/locale/tr';
import 'moment/locale/uk';
import 'moment/locale/uz';
import 'moment/locale/vi';
import 'moment/locale/zh-cn';
import 'moment/locale/zh-tw';
+27 -21
View File
@@ -31,36 +31,42 @@
// dependencies required by classic (Rails) and Angular application.
// Lodash
require('expose-loader?_!lodash');
import lodash from 'lodash';
// jQuery
require('expose-loader?jQuery!jquery');
require('jquery-ujs');
require('expose-loader?mousetrap!mousetrap/mousetrap.js');
import 'jquery-ujs';
// Angular dependencies
require('expose-loader?dragula!dragula/dist/dragula.min.js');
require('@uirouter/angular');
import '@uirouter/angular';
// Jquery UI
require('jquery-ui/ui/position');
require('jquery-ui/ui/disable-selection');
require('jquery-ui/ui/widgets/sortable');
require('jquery-ui/ui/widgets/dialog');
require('jquery-ui/ui/widgets/tooltip');
// import 'jquery-ui/ui/position';
// import 'jquery-ui/ui/disable-selection';
// import 'jquery-ui/ui/widgets/sortable';
// import 'jquery-ui/ui/widgets/dialog';
// import 'jquery-ui/ui/widgets/tooltip';
import 'core-vendor/jquery-ui-1.14.1/jquery-ui';
require('expose-loader?moment!moment');
require('moment/locale/de');
require('moment/locale/en-gb');
import moment from 'moment';
import './init-moment-locales';
require('jquery.caret');
import 'jquery.caret';
// Text highlight for autocompleter
require('mark.js/dist/jquery.mark.min');
import 'mark.js/dist/jquery.mark.min';
require('moment-timezone/builds/moment-timezone-with-data.min');
import 'moment-timezone/builds/moment-timezone-with-data.min';
// eslint-disable-next-line import/extensions,import/no-extraneous-dependencies
require('@openproject/primer-view-components/app/assets/javascripts/primer_view_components.js');
import '@openproject/primer-view-components/app/assets/javascripts/primer_view_components.js';
require('expose-loader?URI!urijs');
require('urijs/src/URITemplate');
import URI from 'urijs';
import 'urijs/src/URITemplate';
declare global {
interface Window {
_:typeof lodash;
}
}
window._ = lodash;
window.moment = moment;
window.URI = URI;
@@ -43,7 +43,7 @@ import {
} from 'core-app/core/current-user/current-user.store';
import { CurrentUserService } from 'core-app/core/current-user/current-user.service';
import { ICapability } from 'core-app/core/state/capabilities/capability.model';
import * as URI from 'urijs';
import URI from 'urijs';
import { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';
import { CurrentUserQuery } from 'core-app/core/current-user/current-user.query';
@@ -9,7 +9,7 @@ import {
ResourceStore,
ResourceStoreService,
} from 'core-app/core/state/resource-store.service';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
@Injectable()
export class DayResourceService extends ResourceStoreService<IDay> {
@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
import { renderStreamMessage } from '@hotwired/turbo';
import { ToastService } from 'core-app/shared/components/toaster/toast.service';
import { debugLog } from 'core-app/shared/helpers/debug_output';
import { TurboHelpers } from 'turbo/helpers';
import { TurboHelpers } from 'core-turbo/helpers';
@Injectable({ providedIn: 'root' })
export class TurboRequestsService {
@@ -1,6 +1,6 @@
import { TypedJSON } from 'typedjson';
import { BcfTopicResource } from 'core-app/features/bim/bcf/api/topics/bcf-topic.resource';
import * as moment from 'moment';
import moment from 'moment';
export const topic_object = {
guid: '00efc0da-b4d5-4933-bcb6-e01513ee2bcc',
@@ -27,8 +27,7 @@
//++
import { jsonArrayMember, jsonMember, jsonObject } from 'typedjson';
import * as moment from 'moment';
import { Moment } from 'moment';
import moment, { Moment } from 'moment';
@jsonObject
export class BcfTopicAuthorizationMap {
@@ -14,6 +14,7 @@ import {
Observable,
switchMap,
} from 'rxjs';
import { HttpErrorResponse } from '@angular/common/http';
@Injectable({ providedIn: 'root' })
export class BoardListsService {
@@ -94,8 +95,10 @@ export class BoardListsService {
const resource = this.halResourceService.createHalResourceOfClass(GridWidgetResource, source);
board.addQuery(resource);
} catch (e) {
this.toastService.addError(e);
console.error(e);
if (e instanceof HttpErrorResponse) {
this.toastService.addError(e);
console.error(e);
}
}
return board;
}
@@ -7,7 +7,7 @@ import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destr
import { WeekdayService } from 'core-app/core/days/weekday.service';
import { DayResourceService } from 'core-app/core/state/days/day.service';
import { IDay } from 'core-app/core/state/days/day.model';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
import { ConfigurationService } from 'core-app/core/config/configuration.service';
import { DayHeaderContentArg } from '@fullcalendar/core';
@@ -44,7 +44,7 @@ import {
HalResourceEditingService,
} from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';
import { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';
import * as moment from 'moment';
import moment from 'moment';
import {
WorkPackageViewSelectionService,
} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';
@@ -14,8 +14,7 @@ import {
} from '@angular/core';
import { FullCalendarComponent } from '@fullcalendar/angular';
import { States } from 'core-app/core/states/states.service';
import * as moment from 'moment';
import { Moment } from 'moment';
import moment, { Moment } from 'moment';
import { StateService } from '@uirouter/core';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { DomSanitizer } from '@angular/platform-browser';
@@ -45,7 +45,7 @@ import {
} from '@fullcalendar/core';
import { FullCalendarComponent } from '@fullcalendar/angular';
import dayGridPlugin from '@fullcalendar/daygrid';
import * as moment from 'moment';
import moment from 'moment';
import { Subject } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
@@ -1,4 +1,4 @@
import * as ObservableArray from 'observable-array';
import ObservableArray from 'observable-array';
import { HalResource } from 'core-app/features/hal/resources/hal-resource';
import { HalLink } from 'core-app/features/hal/hal-link/hal-link';
import { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';
@@ -9,8 +9,7 @@ import {
import { TimezoneService } from 'core-app/core/datetime/timezone.service';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { IInAppNotificationDetailsAttribute, INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';
import * as moment from 'moment';
import { Moment } from 'moment';
import moment, { Moment } from 'moment';
@Component({
selector: 'op-in-app-notification-date-alert',
@@ -4,14 +4,14 @@ import {
} from '@angular/core';
import { ThirdPartyDraggable } from '@fullcalendar/interaction';
import { DragMetaInput } from '@fullcalendar/common';
import { Drake } from 'dragula';
import dragula, { Drake } from 'dragula';
import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';
import { BehaviorSubject } from 'rxjs';
import { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';
import { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { OpWorkPackagesCalendarService } from 'core-app/features/calendar/op-work-packages-calendar.service';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
@Injectable()
export class CalendarDragDropService {
@@ -1,5 +1,5 @@
import { Calendar } from '@fullcalendar/core';
import * as moment from 'moment/moment';
import moment from 'moment/moment';
export const backgroundEvents = {
events: [],
@@ -1,4 +1,4 @@
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
export const skeletonResources = [
{
@@ -113,7 +113,7 @@ import {
addBackgroundEvents,
removeBackgroundEvents,
} from 'core-app/features/team-planner/team-planner/planner/background-events';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
import allLocales from '@fullcalendar/core/locales-all';
export type TeamPlannerViewOptionKey = 'resourceTimelineWorkWeek'|'resourceTimelineWeek'|'resourceTimelineTwoWeeks'|'resourceTimelineFourWeeks'|'resourceTimelineEightWeeks';
@@ -22,7 +22,7 @@ import {
FormGroupDirective,
} from '@angular/forms';
import { ConfigurationService } from 'core-app/core/config/configuration.service';
import * as moment from 'moment';
import moment from 'moment';
@Component({
selector: 'op-reminder-settings-daily-time',
@@ -8,7 +8,7 @@ import {
UntypedFormControl,
FormGroupDirective,
} from '@angular/forms';
import * as moment from 'moment';
import moment from 'moment';
import { I18nService } from 'core-app/core/i18n/i18n.service';
@Component({
@@ -38,7 +38,7 @@ import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destr
import { componentDestroyed } from '@w11k/ngx-componentdestroyed';
import { TimezoneService } from 'core-app/core/datetime/timezone.service';
import { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
@Component({
selector: 'op-filter-date-value',
@@ -34,7 +34,7 @@ import {
} from '@angular/core';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';
import * as moment from 'moment';
import moment from 'moment';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';
import { componentDestroyed } from '@w11k/ngx-componentdestroyed';
import { TimezoneService } from 'core-app/core/datetime/timezone.service';
@@ -1,7 +1,7 @@
import { IWorkPackageTimestamp } from 'core-app/features/hal/resources/work-package-timestamp-resource';
import { ISchemaProxy } from 'core-app/features/hal/schemas/schema-proxy';
import { DEFAULT_TIMESTAMP } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';
import { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';
@@ -46,10 +46,9 @@ import {
offsetToUtcString,
} from 'core-app/features/work-packages/components/wp-baseline/baseline-helpers';
import { TimezoneService } from 'core-app/core/datetime/timezone.service';
import * as moment from 'moment-timezone';
import moment, { Moment } from 'moment-timezone';
import { ConfigurationService } from 'core-app/core/config/configuration.service';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';
import { Moment } from 'moment';
import { filter } from 'rxjs/operators';
@Component({
@@ -56,7 +56,7 @@ import {
getPartsFromTimestamp,
offsetToUtcString,
} from 'core-app/features/work-packages/components/wp-baseline/baseline-helpers';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
import { BannersService } from 'core-app/core/enterprise/banners.service';
import { enterpriseDocsUrl } from 'core-app/core/setup/globals/constants.const';
import { DayElement } from 'flatpickr/dist/types/instance';
@@ -48,7 +48,7 @@ import { WorkPackageChangeset } from 'core-app/features/work-packages/components
import { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';
import { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';
import { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';
import * as URI from 'urijs';
import URI from 'urijs';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';
import { splitViewRoute } from 'core-app/features/work-packages/routing/split-view-routes.helper';
import { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';
@@ -1,4 +1,4 @@
import * as moment from 'moment';
import moment, { Moment } from 'moment';
import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';
import { DisplayFieldRenderer } from 'core-app/shared/components/fields/display/display-field-renderer';
import { Injector } from '@angular/core';
@@ -20,14 +20,13 @@ import {
timelineElementCssClass,
timelineMarkerSelectionStartClass,
} from '../wp-timeline';
import Moment = moment.Moment;
export interface CellDateMovement {
// Target values to move work package to
startDate?:moment.Moment;
dueDate?:moment.Moment;
startDate?:Moment;
dueDate?:Moment;
// Target value to move milestone to
date?:moment.Moment;
date?:Moment;
}
export type LabelPosition = 'left'|'right'|'farRight';
@@ -117,8 +116,8 @@ export class TimelineCellRenderer {
labels:WorkPackageCellLabels,
dates:CellDateMovement,
):void {
this.assignDate(change, 'startDate', dates.startDate as moment.Moment);
this.assignDate(change, 'dueDate', dates.dueDate as moment.Moment);
this.assignDate(change, 'startDate', dates.startDate as Moment);
this.assignDate(change, 'dueDate', dates.dueDate as Moment);
this.updateLabels(true, labels, change);
}
@@ -441,13 +440,13 @@ export class TimelineCellRenderer {
}
}
protected assignDate(change:WorkPackageChangeset, attributeName:string, value:moment.Moment) {
protected assignDate(change:WorkPackageChangeset, attributeName:string, value:Moment) {
if (value) {
change.projectedResource[attributeName] = value.format('YYYY-MM-DD');
}
}
setElementPositionAndSize(element:HTMLElement, renderInfo:RenderInfo, start:moment.Moment, due:moment.Moment) {
setElementPositionAndSize(element:HTMLElement, renderInfo:RenderInfo, start:Moment, due:Moment) {
const { viewParams } = renderInfo;
// offset left
const offsetStart = start.diff(viewParams.dateDisplayStart, 'days');
@@ -1,4 +1,4 @@
import * as moment from 'moment';
import moment, { Moment } from 'moment';
import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';
import { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';
import {
@@ -23,7 +23,6 @@ import {
MouseDirection,
} from './timeline-cell-renderer';
import { WorkPackageCellLabels } from './wp-timeline-cell-labels';
import Moment = moment.Moment;
export class TimelineMilestoneCellRenderer extends TimelineCellRenderer {
public get type():string {
@@ -27,7 +27,7 @@
//++
import { Injector } from '@angular/core';
import * as moment from 'moment';
import moment, { Moment } from 'moment';
import { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';
import { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';
@@ -45,7 +45,6 @@ import {
} from './timeline-cell-renderer';
import { RenderInfo } from '../wp-timeline';
import { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';
import Moment = moment.Moment;
export function registerWorkPackageMouseHandler(this:void,
injector:Injector,
@@ -38,8 +38,7 @@ import {
ToastService,
} from 'core-app/shared/components/toaster/toast.service';
import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';
import * as moment from 'moment';
import { Moment } from 'moment';
import moment, { Moment } from 'moment';
import {
filter,
takeUntil,
@@ -87,7 +86,7 @@ import {
zoomLevelOrder,
} from '../wp-timeline';
import { WeekdayService } from 'core-app/core/days/weekday.service';
import * as Mousetrap from 'mousetrap';
import Mousetrap from 'mousetrap';
import { DayResourceService } from 'core-app/core/state/days/day.service';
import { IDay } from 'core-app/core/state/days/day.model';
@@ -26,7 +26,7 @@
// See COPYRIGHT and LICENSE files for more details.
//++
import * as moment from 'moment';
import moment from 'moment';
import { calculatePositionValueForDayCount, TimelineViewParameters } from '../wp-timeline';
import { TimelineStaticElement } from './timeline-static-element';
@@ -30,7 +30,7 @@ import {
Component,
ElementRef,
} from '@angular/core';
import * as moment from 'moment';
import moment, { Moment } from 'moment';
import { TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';
import { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';
import {
@@ -41,7 +41,6 @@ import {
TimelineViewParameters,
} from '../wp-timeline';
import { WeekdayService } from 'core-app/core/days/weekday.service';
import Moment = moment.Moment;
@Component({
selector: 'wp-timeline-grid',
@@ -28,7 +28,7 @@
import { Component, ElementRef, OnInit } from '@angular/core';
import { WorkPackageTimelineTableController } from 'core-app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive';
import * as moment from 'moment';
import moment, { Moment } from 'moment';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';
import { TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';
@@ -39,7 +39,6 @@ import {
timelineHeaderSelector,
TimelineViewParameters,
} from '../wp-timeline';
import Moment = moment.Moment;
@Component({
selector: timelineHeaderSelector,
@@ -25,12 +25,11 @@
//
// See COPYRIGHT and LICENSE files for more details.
//++
import * as moment from 'moment';
import moment, { Moment } from 'moment';
import { InputState, MultiInputState } from '@openproject/reactivestates';
import { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';
import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';
import { TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';
import Moment = moment.Moment;
export const timelineElementCssClass = 'timeline-element';
export const timelineBackgroundElementClass = 'timeline-element--bg';
@@ -1,4 +1,4 @@
import * as moment from 'moment/moment';
import moment from 'moment/moment';
function paddedNumber(input:number):string {
return input.toString().padStart(2, '0');
@@ -53,7 +53,7 @@ import {
} from 'rxjs';
import { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';
import { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';
import * as moment from 'moment';
import moment from 'moment';
import { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';
import { TimezoneService } from 'core-app/core/datetime/timezone.service';
import { TimeEntryTimerService } from 'core-app/shared/components/time_entries/services/time-entry-timer.service';
@@ -39,8 +39,7 @@ import { TimezoneService } from 'core-app/core/datetime/timezone.service';
import { WeekdayService } from 'core-app/core/days/weekday.service';
import { DayResourceService } from 'core-app/core/state/days/day.service';
import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';
import * as moment from 'moment-timezone';
import { Moment } from 'moment';
import moment, { Moment } from 'moment-timezone';
import { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';
export const DEFAULT_TIMESTAMP = 'PT0S';
@@ -6,7 +6,7 @@ import { OPContextMenuService } from 'core-app/shared/components/op-context-menu
import { WorkPackageViewBaseService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';
import { QueryResource } from 'core-app/features/hal/resources/query-resource';
import { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';
import * as Mousetrap from 'mousetrap';
import Mousetrap from 'mousetrap';
export interface WorkPackageViewSelectionState {
// Map of selected rows
@@ -25,7 +25,7 @@
//
// See COPYRIGHT and LICENSE files for more details.
//++
import * as moment from 'moment';
import moment from 'moment';
import flatpickr from 'flatpickr';
import { Instance } from 'flatpickr/dist/types/instance';
import { ConfigurationService } from 'core-app/core/config/configuration.service';
@@ -29,7 +29,7 @@
import { DatePicker } from 'core-app/shared/components/datepicker/datepicker';
import { DateOption } from 'flatpickr/dist/types/options';
import { DayElement } from 'flatpickr/dist/types/instance';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
/**
* Map the date to the internal format,
@@ -49,7 +49,7 @@ import { PathHelperService } from 'core-app/core/path-helper/path-helper.service
import { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';
import { fromEvent } from 'rxjs';
import { filter } from 'rxjs/operators';
import * as _ from 'lodash';
import _ from 'lodash';
export type DateMode = 'single'|'range';
@@ -142,7 +142,7 @@ export class CKEditorSetupService {
// untyped module cannot be dynamically imported
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
await import(/* webpackPrefetch: true; webpackChunkName: "ckeditor" */ 'core-vendor/ckeditor/ckeditor');
await import(/* webpackChunkName: "ckeditor" */ 'core-vendor/ckeditor/ckeditor');
if (I18n.locale !== 'en') {
await this.loadLocale();
@@ -172,16 +172,17 @@ export class OpCkeditorComponent extends UntilDestroyedMixin implements OnInit,
return this.getRawData();
} catch (e) {
console.error(`Failed to save CKEditor content: ${e}.`);
if (e instanceof Error) {
console.error(`Failed to save CKEditor content: ${e.message}.`);
const error = this.I18n.t(
'js.editor.error_saving_failed',
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call
{ error: e.toString() || this.I18n.t('js.error.internal') },
);
const error = this.I18n.t(
'js.editor.error_saving_failed',
{ error: e.message },
);
if (notificationOnError) {
this.Notifications.addError(error);
if (notificationOnError) {
this.Notifications.addError(error);
}
}
return this._content;
@@ -202,14 +203,14 @@ export class OpCkeditorComponent extends UntilDestroyedMixin implements OnInit,
ngOnInit() {
try {
this.initializeEditor();
} catch (error:unknown) {
} catch (e) {
// We will run into this error if, among others, the browser does not fully support
// CKEditor's requirements on ES6.
const message = (error as Error).toString();
console.error('Failed to setup CKEditor instance: %O', error);
this.error = message;
this.initializationFailed.emit(message);
console.error('Failed to setup CKEditor instance: %O', e);
if (e instanceof Error) {
this.error = e.message;
this.initializationFailed.emit(e.message);
}
}
}
@@ -336,7 +337,7 @@ export class OpCkeditorComponent extends UntilDestroyedMixin implements OnInit,
void Promise
.all([
import('codemirror'),
import(/* webpackChunkName: "codemirror-mode" */ `codemirror/mode/${cmMode}/${cmMode}.js`),
import(/* webpackChunkName: "codemirror-mode" */ `../../../../../../../node_modules/codemirror/mode/${cmMode}/${cmMode}.js`),
])
.then((imported:any[]) => {
const CodeMirror = imported[0].default;
@@ -27,7 +27,7 @@
//++
import { Injectable } from '@angular/core';
import * as URI from 'urijs';
import URI from 'urijs';
import { PathHelperService } from 'core-app/core/path-helper/path-helper.service';
import { HalResource } from 'core-app/features/hal/resources/hal-resource';
@@ -29,11 +29,11 @@
import { PathHelperService } from 'core-app/core/path-helper/path-helper.service';
import { ProjectResource } from 'core-app/features/hal/resources/project-resource';
import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';
import * as URI from 'urijs';
import URI from 'urijs';
import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';
import { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';
import { WorkDisplayField } from 'core-app/shared/components/fields/display/field-types/work-display-field.module';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
import { TurboRequestsService } from 'core-app/core/turbo/turbo-requests.service';
export class WorkPackageSpentTimeDisplayField extends WorkDisplayField {
@@ -27,7 +27,7 @@
//++
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import * as moment from 'moment';
import moment from 'moment';
import { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';
import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';
import { TimezoneService } from 'core-app/core/datetime/timezone.service';
@@ -31,7 +31,7 @@ import {
OnInit,
} from '@angular/core';
import { DatePickerEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/date-picker-edit-field.component';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
@Component({
templateUrl: './days-duration-edit-field.component.html',
@@ -26,7 +26,7 @@
// See COPYRIGHT and LICENSE files for more details.
//++
import * as moment from 'moment';
import moment, { Moment, Duration } from 'moment';
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';
import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';
@@ -53,7 +53,7 @@ export class HoursDurationEditFieldComponent extends EditFieldComponent {
inputValue:null|string;
public parser(value:null|string, input:HTMLInputElement):moment.Duration {
public parser(value:null|string, input:HTMLInputElement):Duration {
// Managing decimal separators in a multi-language app is a complex topic:
// https://www.ctrl.blog/entry/html5-input-number-localization.html
// Depending on the locale of the OS, the browser or the app itself,
@@ -84,7 +84,7 @@ export class HoursDurationEditFieldComponent extends EditFieldComponent {
return Number(moment.duration(value).asHours().toFixed(2));
}
protected parseValue(val:moment.Moment | null) {
protected parseValue(val:Moment | null) {
if (val === null || this.inputValue === '') {
return null;
}
@@ -1,6 +1,6 @@
import { Injectable } from '@angular/core';
import { DisplayedDays } from 'core-app/features/calendar/te-calendar/te-calendar.component';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
@Injectable()
export class TimeEntriesCurrentUserConfigurationModalService {
@@ -122,7 +122,7 @@ export class CodeBlockMacroModalComponent extends OpModalComponent implements Af
return this.updateCodeMirrorMode('');
}
import(/* webpackChunkName: "codemirror-mode" */ `codemirror/mode/${language}/${language}.js`)
import(/* webpackChunkName: "codemirror-mode" */ `../../../../../../../node_modules/codemirror/mode/${language}/${language}.js`)
.then(() => {
this.updateCodeMirrorMode(language);
})
@@ -2,7 +2,7 @@ import { AfterViewInit, Directive, ElementRef } from '@angular/core';
import { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';
import { OpContextMenuHandler } from 'core-app/shared/components/op-context-menu/op-context-menu-handler';
import { OpContextMenuItem } from 'core-app/shared/components/op-context-menu/op-context-menu.types';
import * as Mousetrap from 'mousetrap';
import Mousetrap from 'mousetrap';
@Directive({
selector: '[opContextMenuTrigger]',
@@ -27,7 +27,7 @@ import { opIconElement } from 'core-app/shared/helpers/op-icon-builder';
import { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';
import { ConfirmDialogOptions } from '../modals/confirm-dialog/confirm-dialog.modal';
import { ToastService } from 'core-app/shared/components/toaster/toast.service';
import * as moment from 'moment-timezone';
import moment from 'moment-timezone';
import allLocales from '@fullcalendar/core/locales-all';
@@ -11,7 +11,7 @@ import { ResourceChangeset } from 'core-app/shared/components/fields/changeset/r
import { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';
import { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';
import { TimeEntryEditModalComponent } from './edit.modal';
import * as moment from 'moment';
import moment from 'moment';
import { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';
import { TimezoneService } from 'core-app/core/datetime/timezone.service';
import { TimeEntryTimerService } from 'core-app/shared/components/time_entries/services/time-entry-timer.service';
@@ -30,8 +30,8 @@ import { Injectable } from '@angular/core';
import { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';
import { PathHelperService } from 'core-app/core/path-helper/path-helper.service';
import { CurrentProjectService } from 'core-app/core/current-project/current-project.service';
import * as Mousetrap from 'mousetrap';
import { ConfigurationService } from 'core-app/core/config/configuration.service';
import Mousetrap from 'mousetrap';
const accessKeys = {
preview: 1,
@@ -4,6 +4,7 @@ import {
import { DOCUMENT } from '@angular/common';
import { DomAutoscrollService } from 'core-app/shared/helpers/drag-and-drop/dom-autoscroll.service';
import { findIndex, reinsert } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.helpers';
import dragula, { Drake } from 'dragula';
export interface DragMember {
dragContainer:HTMLElement;
@@ -32,7 +33,7 @@ export interface DragMember {
@Injectable()
export class DragAndDropService implements OnDestroy {
public drake:dragula.Drake|null = null;
public drake:Drake|null = null;
public members:DragMember[] = [];
@@ -11,5 +11,5 @@
* @param image Path to the image starting from frontend/src/assets/images
*/
export function imagePath(image:string) {
return `${__webpack_public_path__}assets/images/${image}`;
return `${globalThis.__webpack_public_path__}assets/images/${image}`;
}
@@ -11,5 +11,5 @@
* @param video Path to the video starting from frontend/src/assets/videos
*/
export function videoPath(video:string):string {
return `${__webpack_public_path__}assets/videos/${video}`;
return `${globalThis.__webpack_public_path__}assets/videos/${video}`;
}
@@ -48,7 +48,7 @@ html > body #ajax-indicator
#ajax-indicator span, .ajax-indicator
background-position: 0% 40%
background-repeat: no-repeat
background-image: url('~assets/images/loading.gif')
background-image: url('../../assets/images/loading.gif')
.ajax_appended_information.loading .ajax-indicator
padding-left: 22px
@@ -71,11 +71,11 @@ div.tabular > div {
#meeting_agenda_preview fieldset {
margin-top: 1em;
background: url('~assets/images/draft.png');
background: url('../../../assets/images/draft.png');
}
#meeting_minutes_preview fieldset {
margin-top: 1em;
background: url('~assets/images/draft.png');
background: url('../../../assets/images/draft.png');
}
@@ -26,7 +26,7 @@
// See COPYRIGHT and LICENSE files for more details.
//++
@import "app/spot/styles/tokens/dist/tokens"
@import "../../../../app/spot/styles/tokens/dist/tokens"
@import "helpers"
@mixin details-pane--form-field
@@ -28,13 +28,13 @@
@font-face {
font-family: "openproject-icon-font";
src: url("~assets/fonts/openproject_icon/openproject-icon-font.woff2") format("woff2"),
url("~assets/fonts/openproject_icon/openproject-icon-font.woff") format("woff");
src: url("../../assets/fonts/openproject_icon/openproject-icon-font.woff2") format("woff2"),
url("../../assets/fonts/openproject_icon/openproject-icon-font.woff") format("woff");
}
@font-face {
font-family: "openproject-spot-icon-font";
src: url("~assets/fonts/openproject_spot_icon/openproject-spot-icon-font.woff2") format("woff2"),
url("~assets/fonts/openproject_spot_icon/openproject-spot-icon-font.woff") format("woff");
src: url("../../assets/fonts/openproject_spot_icon/openproject-spot-icon-font.woff2") format("woff2"),
url("../../assets/fonts/openproject_spot_icon/openproject-spot-icon-font.woff") format("woff");
}
@@ -26,7 +26,7 @@
// See COPYRIGHT and LICENSE files for more details.
//++
@import "app/spot/styles/sass/common/icon"
@import "../../app/spot/styles/sass/common/icon"
$arrow-left-width: 36px
+9 -8
View File
@@ -1,6 +1,8 @@
import { OpenProjectModule } from 'core-app/app.module';
import { enableProdMode } from '@angular/core';
import * as jQuery from 'jquery';
import 'core-app/core/setup/init-jquery';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { initializeLocale } from 'core-app/core/setup/init-locale';
import { environment } from './environments/environment';
@@ -8,7 +10,10 @@ import { configureErrorReporter } from 'core-app/core/errors/configure-reporter'
import { initializeGlobalListeners } from 'core-app/core/setup/globals/global-listeners';
import { getMetaElement } from 'core-app/core/setup/globals/global-helpers';
(window as any).global = window;
import 'core-app/core/setup/init-vendors';
import 'core-app/core/setup/init-globals';
import './stimulus/setup';
import './turbo/setup';
// Ensure we set the correct dynamic frontend path
// based on the RAILS_RELATIVE_URL_ROOT setting
@@ -24,15 +29,11 @@ const ASSET_HOST = initializer?.dataset.assetHost ? `//${initializer.dataset.ass
// Ensure to set the asset base for dynamic code loading
// https://webpack.js.org/guides/public-path/
__webpack_public_path__ = ASSET_HOST + window.appBasePath + ASSET_BASE_PATH;
// eslint-disable-next-line no-underscore-dangle
globalThis.__webpack_public_path__ = ASSET_HOST + window.appBasePath + ASSET_BASE_PATH;
window.ErrorReporter = configureErrorReporter();
require('core-app/core/setup/init-vendors');
require('core-app/core/setup/init-globals');
require('stimulus/setup');
require('turbo/setup');
if (environment.production) {
enableProdMode();
}
@@ -1,15 +1,14 @@
const PROXY_HOSTNAME = process.env.PROXY_HOSTNAME || process.env.HOST || 'localhost';
const PORT = process.env.PORT || '3000';
const PROXY_CONFIG = [
export default [
{
"context": ['/**'],
"context": [
'/api',
'/assets/frontend/media'
],
"target": `http://${PROXY_HOSTNAME}:${PORT}`,
"secure": false,
"timeout": 360000,
// "bypass": function (req, res, proxyOptions) {
// }
}
];
module.exports = PROXY_CONFIG;
@@ -30,7 +30,7 @@
import { ApplicationController } from 'stimulus-use';
import { renderStreamMessage } from '@hotwired/turbo';
import { TurboHelpers } from '../../turbo/helpers';
import { TurboHelpers } from 'core-turbo/helpers';
export default class AsyncDialogController extends ApplicationController {
connect() {
@@ -29,6 +29,7 @@
*/
import { Controller } from '@hotwired/stimulus';
import dragula from 'dragula';
export default class CustomFieldsController extends Controller {
static targets = [
@@ -205,7 +206,6 @@ export default class CustomFieldsController extends Controller {
private setupDragAndDrop() {
// Make custom fields draggable
// eslint-disable-next-line no-undef
const drake = dragula([this.dragContainerTarget], {
isContainer: () => false,
moves: (el, source, handle:HTMLElement) => handle.classList.contains('dragula-handle'),
@@ -31,7 +31,7 @@
import { Controller } from '@hotwired/stimulus';
import React from 'react';
import { createRoot } from 'react-dom/client';
import OpBlockNoteContainer from 'react/OpBlockNoteContainer';
import OpBlockNoteContainer from '../../../react/OpBlockNoteContainer';
export default class extends Controller {
static targets = [
@@ -30,7 +30,7 @@
import * as Turbo from '@hotwired/turbo';
import { Controller } from '@hotwired/stimulus';
import { Drake } from 'dragula';
import dragula, { Drake } from 'dragula';
import { debugLog } from 'core-app/shared/helpers/debug_output';
import { useMeta } from 'stimulus-use';
@@ -29,7 +29,8 @@
*/
import { Controller } from '@hotwired/stimulus';
import * as jQuery from 'jquery';
import dragula from 'dragula';
import jQuery from 'jquery';
import 'tablesorter';
declare global {
@@ -192,7 +193,6 @@ export default class PageController extends Controller {
// This prevents the tablesorter plugin to check for metadata which is done
// using eval which conflicts with our csp.
// Works because of a check in tablesorter:
// @ts-expect-error Prevent metadata from accessing metadata
jQuery.metadata = undefined;
// Override the default texts to enable translations
@@ -566,10 +566,9 @@ export default class PageController extends Controller {
}
private recreateSortables() {
const containers = jQuery('.group-by--selected-elements').toArray();
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-explicit-any
(dragula as any)(containers, {
mirrorContainer: document.getElementById('group-by--area'),
const containers = Array.from(document.querySelectorAll('.group-by--selected-elements'));
dragula(containers, {
mirrorContainer: document.getElementById('group-by--area')!,
});
}
@@ -29,7 +29,7 @@
*/
import { Controller } from '@hotwired/stimulus';
import * as URI from 'urijs';
import URI from 'urijs';
export default class RepositorySettingsController extends Controller {
static targets = [
@@ -68,7 +68,9 @@ export default class TwoFactorAuthenticationController extends Controller {
return true;
} catch (error) {
this.displayError(error);
if (error instanceof DOMException) {
this.displayError(error);
}
return false;
}
}
@@ -102,7 +104,9 @@ export default class TwoFactorAuthenticationController extends Controller {
return true;
} catch (error) {
this.displayError(error);
if (error instanceof DOMException) {
this.displayError(error);
}
return false;
}
}
@@ -63,7 +63,7 @@ export class OpApplicationController extends ApplicationController {
// Default: Try to load the controller from dynamic/ subfolder.
const path = this.derivePath(controller);
return await import(/* webpackChunkName: "[request]" */ `./dynamic/${path}.controller`) as Promise<{
return await import(`./dynamic/${path}.controller.ts`) as Promise<{
default:ControllerConstructor
}>;
}
+1 -1
View File
@@ -1,5 +1,5 @@
// You can add global styles to this file, and also import other style files
@import "~@ng-select/ng-select/themes/default.theme.css";
@import "@ng-select/ng-select/themes/default.theme.css";
// Variables
@import "global_styles/openproject/_variable_defaults.scss";
+1 -1
View File
@@ -11,7 +11,7 @@ import {
platformBrowserDynamicTesting,
} from '@angular/platform-browser-dynamic/testing';
import { I18n } from 'i18n-js';
import { registerDialogStreamAction } from 'turbo/dialog-stream-action';
import { registerDialogStreamAction } from 'core-turbo/dialog-stream-action';
registerDialogStreamAction();
-25
View File
@@ -1,25 +0,0 @@
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"baseUrl": "./",
"types": []
},
"files": [
"main.ts",
"polyfills.ts",
"app/core/setup/init-globals.ts",
"app/core/setup/init-vendors.ts",
"stimulus/setup.ts",
"turbo/setup.ts"
],
"include": [
"src/**/*.ts",
"stimulus/**/*.ts",
"**/*.d.ts"
],
"exclude": [
"**/*.stories.*"
]
}
-18
View File
@@ -1,18 +0,0 @@
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
"outDir": "../out-tsc/spec",
"baseUrl": "./",
"types": [
"jasmine",
"node"
]
},
"files": [
"test.ts",
"polyfills.ts"
],
"include": [
"**/*.ts"
]
}
-1
View File
@@ -1,4 +1,3 @@
import '../typings/shims.d.ts';
import * as Turbo from '@hotwired/turbo';
import TurboPower from 'turbo_power';
import { registerDialogStreamAction } from './dialog-stream-action';
-3
View File
@@ -11,14 +11,12 @@
/// <reference path="../../node_modules/@types/moment-timezone/index.d.ts" />
/// <reference path="../../node_modules/@types/urijs/index.d.ts" />
/// <reference path="../../node_modules/@types/webpack-env/index.d.ts" />
/// <reference path="../../node_modules/@types/dragula/index.d.ts" />
/// <reference path="../../node_modules/@types/resize-observer-browser/index.d.ts" />
import { Injector } from '@angular/core';
import { OpenProject } from 'core-app/core/setup/globals/openproject';
import * as TLodash from 'lodash';
import { Dragula } from 'dragula';
import { Screenfull } from 'screenfull';
import { ErrorReporterBase } from 'core-app/core/errors/error-reporter-base';
import { I18n } from 'i18n-js';
@@ -57,7 +55,6 @@ declare module '@hotwired/turbo' {
declare global {
const _:typeof TLodash;
const I18n:I18n;
const dragula:Dragula;
}
declare global {
+384
View File
@@ -0,0 +1,384 @@
Authors ordered by first contribution
A list of current team members is available at https://jqueryui.com/about
Paul Bakaus <paul.bakaus@gmail.com>
Richard Worth <rdworth@gmail.com>
Yehuda Katz <wycats@gmail.com>
Sean Catchpole <sean@sunsean.com>
John Resig <jeresig@gmail.com>
Tane Piper <piper.tane@gmail.com>
Dmitri Gaskin <dmitrig01@gmail.com>
Klaus Hartl <klaus.hartl@gmail.com>
Stefan Petre <stefan.petre@gmail.com>
Gilles van den Hoven <gilles@webunity.nl>
Micheil Bryan Smith <micheil@brandedcode.com>
Jörn Zaefferer <joern.zaefferer@gmail.com>
Marc Grabanski <m@marcgrabanski.com>
Keith Wood <kbwood@iinet.com.au>
Brandon Aaron <brandon.aaron@gmail.com>
Scott González <scott.gonzalez@gmail.com>
Eduardo Lundgren <eduardolundgren@gmail.com>
Aaron Eisenberger <aaronchi@gmail.com>
Joan Piedra <theneojp@gmail.com>
Bruno Basto <b.basto@gmail.com>
Remy Sharp <remy@leftlogic.com>
Bohdan Ganicky <bohdan.ganicky@gmail.com>
David Bolter <david.bolter@gmail.com>
Chi Cheng <cloudream@gmail.com>
Ca-Phun Ung <pazu2k@gmail.com>
Ariel Flesler <aflesler@gmail.com>
Maggie Wachs <maggie@filamentgroup.com>
Scott Jehl <scottjehl@gmail.com>
Todd Parker <todd@filamentgroup.com>
Andrew Powell <andrew@shellscape.org>
Brant Burnett <btburnett3@gmail.com>
Douglas Neiner <doug@dougneiner.com>
Paul Irish <paul.irish@gmail.com>
Ralph Whitbeck <ralph.whitbeck@gmail.com>
Thibault Duplessis <thibault.duplessis@gmail.com>
Dominique Vincent <dominique.vincent@toitl.com>
Jack Hsu <jack.hsu@gmail.com>
Adam Sontag <ajpiano@ajpiano.com>
Carl Fürstenberg <carl@excito.com>
Kevin Dalman <development@allpro.net>
Alberto Fernández Capel <afcapel@gmail.com>
Jacek Jędrzejewski (https://jacek.jedrzejewski.name)
Ting Kuei <ting@kuei.com>
Samuel Cormier-Iijima <sam@chide.it>
Jon Palmer <jonspalmer@gmail.com>
Ben Hollis <bhollis@amazon.com>
Justin MacCarthy <Justin@Rubystars.biz>
Eyal Kobrigo <kobrigo@hotmail.com>
Tiago Freire <tiago.freire@gmail.com>
Diego Tres <diegotres@gmail.com>
Holger Rüprich <holger@rueprich.de>
Ziling Zhao <zilingzhao@gmail.com>
Mike Alsup <malsup@gmail.com>
Robson Braga Araujo <robsonbraga@gmail.com>
Pierre-Henri Ausseil <ph.ausseil@gmail.com>
Christopher McCulloh <cmcculloh@gmail.com>
Andrew Newcomb <ext.github@preceptsoftware.co.uk>
Lim Chee Aun <cheeaun@gmail.com>
Jorge Barreiro <yortx.barry@gmail.com>
Daniel Steigerwald <daniel@steigerwald.cz>
John Firebaugh <john_firebaugh@bigfix.com>
John Enters <github@darkdark.net>
Andrey Kapitcyn <ru.m157y@gmail.com>
Dmitry Petrov <dpetroff@gmail.com>
Eric Hynds <eric@hynds.net>
Chairat Sunthornwiphat <pipo@sixhead.com>
Josh Varner <josh.varner@gmail.com>
Stéphane Raimbault <stephane.raimbault@gmail.com>
Jay Merrifield <fracmak@gmail.com>
J. Ryan Stinnett <jryans@gmail.com>
Peter Heiberg <peter@heiberg.se>
Alex Dovenmuehle <adovenmuehle@gmail.com>
Jamie Gegerson <git@jamiegegerson.com>
Raymond Schwartz <skeetergraphics@gmail.com>
Phillip Barnes <philbar@gmail.com>
Kyle Wilkinson <kai@wikyd.org>
Khaled AlHourani <me@khaledalhourani.com>
Marian Rudzynski <mr@impaled.org>
Jean-Francois Remy <jeff@melix.org>
Doug Blood <dougblood@gmail.com>
Filippo Cavallarin <filippo.cavallarin@codseq.it>
Heiko Henning <heiko@thehennings.ch>
Aliaksandr Rahalevich <saksmlz@gmail.com>
Mario Visic <mario@mariovisic.com>
Xavi Ramirez <xavi.rmz@gmail.com>
Max Schnur <max.schnur@gmail.com>
Saji Nediyanchath <saji89@gmail.com>
Corey Frang <gnarf37@gmail.com>
Aaron Peterson <aaronp123@yahoo.com>
Ivan Peters <ivan@ivanpeters.com>
Mohamed Cherif Bouchelaghem <cherifbouchelaghem@yahoo.fr>
Marcos Sousa <falecomigo@marcossousa.com>
Michael DellaNoce <mdellanoce@mailtrust.com>
George Marshall <echosx@gmail.com>
Tobias Brunner <tobias@strongswan.org>
Martin Solli <msolli@gmail.com>
David Petersen <public@petersendidit.com>
Dan Heberden <danheberden@gmail.com>
William Kevin Manire <williamkmanire@gmail.com>
Gilmore Davidson <gilmoreorless@gmail.com>
Michael Wu <michaelmwu@gmail.com>
Adam Parod <mystic414@gmail.com>
Guillaume Gautreau <guillaume+github@ghusse.com>
Marcel Toele <EleotleCram@gmail.com>
Dan Streetman <ddstreet@ieee.org>
Matt Hoskins <matt@nipltd.com>
Giovanni Giacobbi <giovanni@giacobbi.net>
Kyle Florence <kyle.florence@gmail.com>
Pavol Hluchý <lopo@losys.sk>
Hans Hillen <hans.hillen@gmail.com>
Mark Johnson <virgofx@live.com>
Trey Hunner <treyhunner@gmail.com>
Shane Whittet <whittet@gmail.com>
Edward A Faulkner <ef@alum.mit.edu>
Adam Baratz <adam@adambaratz.com>
Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
Eike Send <eike.send@gmail.com>
Kris Borchers <kris.borchers@gmail.com>
Eddie Monge <eddie@eddiemonge.com>
Israel Tsadok <itsadok@gmail.com>
Carson McDonald <carson@ioncannon.net>
Jason Davies <jason@jasondavies.com>
Garrison Locke <gplocke@gmail.com>
David Murdoch <david@davidmurdoch.com>
Benjamin Scott Boyle <benjamins.boyle@gmail.com>
Jesse Baird <jebaird@gmail.com>
Jonathan Vingiano <jvingiano@gmail.com>
Dylan Just <dev@ephox.com>
Hiroshi Tomita <tomykaira@gmail.com>
Glenn Goodrich <glenn.goodrich@gmail.com>
Tarafder Ashek-E-Elahi <mail.ashek@gmail.com>
Ryan Neufeld <ryan@neufeldmail.com>
Marc Neuwirth <marc.neuwirth@gmail.com>
Philip Graham <philip.robert.graham@gmail.com>
Benjamin Sterling <benjamin.sterling@kenzomedia.com>
Wesley Walser <waw325@gmail.com>
Kouhei Sutou <kou@clear-code.com>
Karl Kirch <karlkrch@gmail.com>
Chris Kelly <ckdake@ckdake.com>
Jason Oster <jay@kodewerx.org>
Felix Nagel <info@felixnagel.com>
Alexander Polomoshnov <alex.polomoshnov@gmail.com>
David Leal <dgleal@gmail.com>
Igor Milla <igor.fsp.milla@gmail.com>
Dave Methvin <dave.methvin@gmail.com>
Florian Gutmann <f.gutmann@chronimo.com>
Marwan Al Jubeh <marwan.aljubeh@gmail.com>
Milan Broum <midlis@googlemail.com>
Sebastian Sauer <info@dynpages.de>
Gaëtan Muller <m.gaetan89@gmail.com>
Michel Weimerskirch <michel@weimerskirch.net>
William Griffiths <william@ycymro.com>
Stojce Slavkovski <stojce@gmail.com>
David Soms <david.soms@gmail.com>
David De Sloovere <david.desloovere@outlook.com>
Michael P. Jung <michael.jung@terreon.de>
Shannon Pekary <spekary@gmail.com>
Dan Wellman <danwellman@hotmail.com>
Matthew Edward Hutton <meh@corefiling.co.uk>
James Khoury <james@jameskhoury.com>
Rob Loach <robloach@gmail.com>
Alberto Monteiro <betimbrasil@gmail.com>
Alex Rhea <alex.rhea@gmail.com>
Krzysztof Rosiński <rozwell69@gmail.com>
Ryan Olton <oltonr@gmail.com>
Genie <386@mail.com>
Rick Waldron <waldron.rick@gmail.com>
Ian Simpson <spoonlikesham@gmail.com>
Lev Kitsis <spam4lev@gmail.com>
TJ VanToll <tj.vantoll@gmail.com>
Justin Domnitz <jdomnitz@gmail.com>
Douglas Cerna <douglascerna@yahoo.com>
Bert ter Heide <bertjh@hotmail.com>
Jasvir Nagra <jasvir@gmail.com>
Yuriy Khabarov <13real008@gmail.com>
Harri Kilpiö <harri.kilpio@gmail.com>
Lado Lomidze <lado.lomidze@gmail.com>
Amir E. Aharoni <amir.aharoni@mail.huji.ac.il>
Simon Sattes <simon.sattes@gmail.com>
Jo Liss <joliss42@gmail.com>
Guntupalli Karunakar <karunakarg@yahoo.com>
Shahyar Ghobadpour <shahyar@gmail.com>
Lukasz Lipinski <uzza17@gmail.com>
Timo Tijhof <krinklemail@gmail.com>
Jason Moon <jmoon@socialcast.com>
Martin Frost <martinf55@hotmail.com>
Eneko Illarramendi <eneko@illarra.com>
EungJun Yi <semtlenori@gmail.com>
Courtland Allen <courtlandallen@gmail.com>
Viktar Varvanovich <non4eg@gmail.com>
Danny Trunk <dtrunk90@gmail.com>
Pavel Stetina <pavel.stetina@nangu.tv>
Michael Stay <metaweta@gmail.com>
Steven Roussey <sroussey@gmail.com>
Michael Hollis <hollis21@gmail.com>
Lee Rowlands <lee.rowlands@previousnext.com.au>
Timmy Willison <timmywillisn@gmail.com>
Karl Swedberg <kswedberg@gmail.com>
Baoju Yuan <the_guy_1987@hotmail.com>
Maciej Mroziński <maciej.k.mrozinski@gmail.com>
Luis Dalmolin <luis.nh@gmail.com>
Mark Aaron Shirley <maspwr@gmail.com>
Martin Hoch <martin@fidion.de>
Jiayi Yang <tr870829@gmail.com>
Philipp Benjamin Köppchen <xgxtpbk@gws.ms>
Sindre Sorhus <sindresorhus@gmail.com>
Bernhard Sirlinger <bernhard.sirlinger@tele2.de>
Jared A. Scheel <jared@jaredscheel.com>
Rafael Xavier de Souza <rxaviers@gmail.com>
John Chen <zhang.z.chen@intel.com>
Robert Beuligmann <robertbeuligmann@gmail.com>
Dale Kocian <dale.kocian@gmail.com>
Mike Sherov <mike.sherov@gmail.com>
Andrew Couch <andy@couchand.com>
Marc-Andre Lafortune <github@marc-andre.ca>
Nate Eagle <nate.eagle@teamaol.com>
David Souther <davidsouther@gmail.com>
Mathias Stenbom <mathias@stenbom.com>
Sergey Kartashov <ebishkek@yandex.ru>
Avinash R <nashpapa@gmail.com>
Ethan Romba <ethanromba@gmail.com>
Cory Gackenheimer <cory.gack@gmail.com>
Juan Pablo Kaniefsky <jpkaniefsky@gmail.com>
Roman Salnikov <bardt.dz@gmail.com>
Anika Henke <anika@selfthinker.org>
Samuel Bovée <samycookie2000@yahoo.fr>
Fabrício Matté <ult_combo@hotmail.com>
Viktor Kojouharov <vkojouharov@gmail.com>
Pawel Maruszczyk (http://hrabstwo.net)
Pavel Selitskas <p.selitskas@gmail.com>
Bjørn Johansen <post@bjornjohansen.no>
Matthieu Penant <thieum22@hotmail.com>
Dominic Barnes <dominic@dbarnes.info>
David Sullivan <david.sullivan@gmail.com>
Thomas Jaggi <thomas@responsive.ch>
Vahid Sohrabloo <vahid4134@gmail.com>
Travis Carden <travis.carden@gmail.com>
Bruno M. Custódio <bruno@brunomcustodio.com>
Nathanael Silverman <nathanael.silverman@gmail.com>
Christian Wenz <christian@wenz.org>
Steve Urmston <steve@urm.st>
Zaven Muradyan <megalivoithos@gmail.com>
Woody Gilk <shadowhand@deviantart.com>
Zbigniew Motyka <zbigniew.motyka@gmail.com>
Suhail Alkowaileet <xsoh.k7@gmail.com>
Toshi MARUYAMA <marutosijp2@yahoo.co.jp>
David Hansen <hansede@gmail.com>
Brian Grinstead <briangrinstead@gmail.com>
Christian Klammer <christian314159@gmail.com>
Steven Luscher <jquerycla@steveluscher.com>
Gan Eng Chin <engchin.gan@gmail.com>
Gabriel Schulhof <gabriel.schulhof@intel.com>
Alexander Schmitz <arschmitz@gmail.com>
Vilhjálmur Skúlason <vis@dmm.is>
Siebrand Mazeland <siebrand@kitano.nl>
Mohsen Ekhtiari <mohsenekhtiari@yahoo.com>
Pere Orga <gotrunks@gmail.com>
Jasper de Groot <mail@ugomobi.com>
Stephane Deschamps <stephane.deschamps@gmail.com>
Jyoti Deka <dekajp@gmail.com>
Andrei Picus <office.nightcrawler@gmail.com>
Ondrej Novy <novy@ondrej.org>
Jacob McCutcheon <jacob.mccutcheon@gmail.com>
Monika Piotrowicz <monika.piotrowicz@gmail.com>
Imants Horsts <imants.horsts@inbox.lv>
Eric Dahl <eric.c.dahl@gmail.com>
Dave Stein <dave@behance.com>
Dylan Barrell <dylan@barrell.com>
Daniel DeGroff <djdegroff@gmail.com>
Michael Wiencek <mwtuea@gmail.com>
Thomas Meyer <meyertee@gmail.com>
Ruslan Yakhyaev <ruslan@ruslan.io>
Brian J. Dowling <bjd-dev@simplicity.net>
Ben Higgins <ben@extrahop.com>
Yermo Lamers <yml@yml.com>
Patrick Stapleton <github@gdi2290.com>
Trisha Crowley <trisha.crowley@gmail.com>
Usman Akeju <akeju00+github@gmail.com>
Rodrigo Menezes <rod333@gmail.com>
Jacques Perrault <jacques_perrault@us.ibm.com>
Frederik Elvhage <frederik.elvhage@googlemail.com>
Will Holley <willholley@gmail.com>
Uri Gilad <antishok@gmail.com>
Richard Gibson <richard.gibson@gmail.com>
Simen Bekkhus <sbekkhus91@gmail.com>
Chen Eshchar <eshcharc@gmail.com>
Bruno Pérel <brunoperel@gmail.com>
Mohammed Alshehri <m@dralshehri.com>
Lisa Seacat DeLuca <ldeluca@us.ibm.com>
Anne-Gaelle Colom <coloma@westminster.ac.uk>
Adam Foster <slimfoster@gmail.com>
Luke Page <luke.a.page@gmail.com>
Daniel Owens <daniel@matchstickmixup.com>
Michael Orchard <morchard@scottlogic.co.uk>
Marcus Warren <marcus@envoke.com>
Nils Heuermann <nils@world-of-scripts.de>
Marco Ziech <marco@ziech.net>
Patricia Juarez <patrixd@gmail.com>
Ben Mosher <me@benmosher.com>
Ablay Keldibek <atomio.ak@gmail.com>
Thomas Applencourt <thomas.applencourt@irsamc.ups-tlse.fr>
Jiabao Wu <jiabao.foss@gmail.com>
Eric Lee Carraway <github@ericcarraway.com>
Victor Homyakov <vkhomyackov@gmail.com>
Myeongjin Lee <aranet100@gmail.com>
Liran Sharir <lsharir@gmail.com>
Weston Ruter <weston@xwp.co>
Mani Mishra <manimishra902@gmail.com>
Hannah Methvin <hannahmethvin@gmail.com>
Leonardo Balter <leonardo.balter@gmail.com>
Benjamin Albert <benjamin_a5@yahoo.com>
Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
Alyosha Pushak <alyosha.pushak@gmail.com>
Fahad Ahmad <fahadahmad41@hotmail.com>
Matt Brundage <github@mattbrundage.com>
Francesc Baeta <francesc.baeta@gmail.com>
Piotr Baran <piotros@wp.pl>
Mukul Hase <mukulhase@gmail.com>
Konstantin Dinev <kdinev@mail.bw.edu>
Rand Scullard <rand@randscullard.com>
Dan Strohl <dan@wjcg.net>
Maksim Ryzhikov <rv.maksim@gmail.com>
Amine HADDAD <haddad@allegorie.tv>
Amanpreet Singh <apsdehal@gmail.com>
Alexey Balchunas <bleshik@gmail.com>
Peter Kehl <peter.kehl@gmail.com>
Peter Dave Hello <hsu@peterdavehello.org>
Johannes Schäfer <johnschaefer@gmx.de>
Ville Skyttä <ville.skytta@iki.fi>
Ryan Oriecuia <ryan.oriecuia@visioncritical.com>
Sergei Ratnikov <sergeir82@gmail.com>
milk54 <milk851@gmail.com>
Evelyn Masso <evoutofambit@gmail.com>
Robin <mail@robin-fowler.com>
Simon Asika <asika32764@gmail.com>
Kevin Cupp <kevin.cupp@gmail.com>
Jeremy Mickelson <Jeremy.Mickelson@gmail.com>
Kyle Rosenberg <kyle.rosenberg@gmail.com>
Petri Partio <petri.partio@gmail.com>
pallxk <github@pallxk.com>
Luke Brookhart <luke@onjax.com>
claudi <hirt-claudia@gmx.de>
Eirik Sletteberg <eiriksletteberg@gmail.com>
Albert Johansson <albert@intervaro.se>
A. Wells <borgboyone@users.noreply.github.com>
Robert Brignull <robertbrignull@gmail.com>
Horus68 <pauloizidoro@gmail.com>
Maksymenkov Eugene <foatei@gmail.com>
OskarNS <soerensen.oskar@gmail.com>
Gez Quinn <holla@gezquinn.design>
jigar gala <jigar.gala140291@gmail.com>
Florian Wegscheider <flo.wegscheider@gmail.com>
Fatér Zsolt <fater.zsolt@gmail.com>
Szabolcs Szabolcsi-Toth <nec@shell8.net>
Jérémy Munsch <github@jeremydev.ovh>
Hrvoje Novosel <hrvoje.novosel@gmail.com>
Paul Capron <PaulCapron@users.noreply.github.com>
Micah Miller <mikhey@runbox.com>
sakshi87 <53863764+sakshi87@users.noreply.github.com>
Mikolaj Wolicki <wolicki.mikolaj@gmail.com>
Patrick McKay <patrick.mckay@vumc.org>
c-lambert <58025159+c-lambert@users.noreply.github.com>
Josep Sanz <josepsanzcamp@gmail.com>
Ben Mullins <benm@umich.edu>
Christian Oliff <christianoliff@pm.me>
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Adam Lidén Hällgren <adamlh92@gmail.com>
James Hinderks <hinderks@gmail.com>
Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com>
Matías Cánepa <matias.canepa@gmail.com>
Ashish Kurmi <100655670+boahc077@users.noreply.github.com>
DeerBear <andrea.raimondi@gmail.com>
Дилян Палаузов <dpa-github@aegee.org>
Kenneth DeBacker <kcdebacker@gmail.com>
Timo Tijhof <krinkle@fastmail.com>
Timmy Willison <timmywil@users.noreply.github.com>
divdeploy <166095818+divdeploy@users.noreply.github.com>
mark van tilburg <markvantilburg@gmail.com>
Ralf Koller <1665422+rpkoller@users.noreply.github.com>
Porter Clevidence <116387727+porterclev@users.noreply.github.com>
Daniel García <93217193+Daniel-Garmig@users.noreply.github.com>
+43
View File
@@ -0,0 +1,43 @@
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery-ui
The following license applies to all parts of this software except as
documented below:
====
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code contained within the demos directory.
CC0: http://creativecommons.org/publicdomain/zero/1.0/
====
All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Some files were not shown because too many files have changed in this diff Show More