mirror of
https://github.com/opf/openproject.git
synced 2026-06-14 03:30:14 +00:00
Merge remote-tracking branch 'origin/code-maintenance/esbuild' into dev
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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 %>
|
||||
|
||||
@@ -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
@@ -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/"
|
||||
|
||||
@@ -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
@@ -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
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
})
|
||||
]
|
||||
}
|
||||
};
|
||||
Generated
+1423
-332
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
@@ -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';
|
||||
@@ -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';
|
||||
|
||||
+1
-2
@@ -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
-1
@@ -1,4 +1,4 @@
|
||||
import * as moment from 'moment-timezone';
|
||||
import moment from 'moment-timezone';
|
||||
|
||||
export const skeletonResources = [
|
||||
{
|
||||
|
||||
+1
-1
@@ -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';
|
||||
|
||||
+1
-1
@@ -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',
|
||||
|
||||
+1
-1
@@ -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({
|
||||
|
||||
+1
-1
@@ -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',
|
||||
|
||||
+1
-1
@@ -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';
|
||||
|
||||
|
||||
+1
-2
@@ -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({
|
||||
|
||||
+1
-1
@@ -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';
|
||||
|
||||
+8
-9
@@ -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
-2
@@ -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 {
|
||||
|
||||
+1
-2
@@ -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,
|
||||
|
||||
+2
-3
@@ -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';
|
||||
|
||||
|
||||
+1
-1
@@ -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';
|
||||
|
||||
|
||||
+1
-2
@@ -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',
|
||||
|
||||
+1
-2
@@ -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
-1
@@ -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');
|
||||
|
||||
+1
-1
@@ -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';
|
||||
|
||||
+1
-2
@@ -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';
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+1
-1
@@ -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';
|
||||
|
||||
|
||||
+1
-1
@@ -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();
|
||||
|
||||
+16
-15
@@ -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;
|
||||
|
||||
+1
-1
@@ -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';
|
||||
|
||||
|
||||
+2
-2
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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';
|
||||
|
||||
+1
-1
@@ -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',
|
||||
|
||||
+3
-3
@@ -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
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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);
|
||||
})
|
||||
|
||||
+1
-1
@@ -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]',
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
|
||||
@@ -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'),
|
||||
|
||||
+1
-1
@@ -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,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";
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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.*"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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,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';
|
||||
|
||||
Vendored
-3
@@ -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
@@ -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>
|
||||
@@ -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
Reference in New Issue
Block a user